1.DMA和cache一致性
(1)不带CACHE
自己写驱动,申请DMA,可以用Coherent DMA buffers
void * dma_alloc_coherent(struct device *dev, size_t size, dma_addr_t
*dma_handle,gfp_t flag);
void dma_free_coherent (struct device *dev, size_t size,void *cpu_addr,
dma_addr_t dma_handle);
CMA和此API自动融合,调用dma_alloc_coherent()将从CMA获得内存,不带cache。
(2)流式DMA:
操作其他进程的地址,比如tcp/ip报文的缓存,无法控制DMA地址源,
用dma_map_single,自动设置cache flush,
CPU无法访问cache,这个是硬件自动完成的;但是CPU可以控制cache,使能cache为非法(破坏命中),会自动与memory同步。
DMA Streaming Mapping
dma_addr_t dma_map_single(...);
void dma_unmap_single (...);
有的强大DMA,不需要连续内存做DMA操作,scater/getter可以用
int dma_map_sg(...);
void dma_unmap_sg (...);
有一些强大硬件,DMA能感知cache网络互联;
这3套API,对任何硬件都成立;实现API后端,兼容不同硬件。
有些新的强大硬件,有支持IOMMU/smmu
Dma可以从不连续内存,CMA申请内存
dma_alloc_coherent不需要从CMA申请内存,支持MMU,可以用物理不连续的内存来实现DMA操作;
2. 内存的cgroup
./swapoff –a
echo 1 \> /proc/sys/vm/overcommit_memory //
/sys/fs/cgroup/memory
mkdir A
cd A
sudo echo \$(100\*1024\*1024) \> memory.limit_in_bytes //限制最大内存100M
//a.out放到A cgroup执行;
sudo
3. 性能方面的调优:page in/out, swapin/out
4. Dirty ratio的一些设置
脏页写回
时间维度:时间到,脏页写回;dirty_expire_centisecs
空间维度:Dirty_ratio
Dirty_background_ratio:
cd /proc/sys/vm
假如某个进程在不停写数据,当写入大小触发dirty_background_ratio_10%时,脏页开始写入磁盘,写入数据大小触发dirty_ratio_20%时(磁盘IO速度远比写内存慢),如果继续写,会被内核阻塞,等脏页部分被写入磁盘,释放pagecached后,进程才能继续写入内存;
所有的脏页flush,都是后台自动完成,当写入速度不足以触发dirty_ratio时,进程感知不到磁盘的存在。
5. swappiness
内存回收reclaim,涉及三个水位,
回收哪里的内存,back_groudpages, swap,由swappiness决定
Swappiness越大,越倾向于回收匿名页;
即使Swappiness设置为0,先回收背景页,以使达到最低水位;假使达不到,还是会回收匿名页;
有个例外,对于cgroup而言,设置swappiness=0,该group的swap回收被关闭;但是全局的swap还是可以回收;
为什么设定最低水位,在Linux有一些紧急申请,PF_MEMALLOC,可以突破min水位,(回收内存的过程,也需要申请内存,类似征粮队自身需要吃粮食)。
最低水位,可以通过lewmem_reserve_ratio修改;
关于最低水位的计算方法:
回收inode/dentry的slab
设置drop_caches
getdelays工具
getdelays 测量调度、I/O、SWAP、Reclaim的延迟,需要内核打开相应选项
CONFIG_TASK_DELAY_ACCT=y
CONFIG_TASKSTATS=y
Documentation/accounting/delay-accounting.txt
vmstat
用法,man vmstate
模糊查找
apropos timer
(base) leon\@pc:\~/work/myHub/linux/kernel/linux/Documentation/accounting\$
apropos vmstat
vmstat (8) - Report virtual memory statistics
(base)