但行好事,莫问前程!

Linux内核之内存5: 其他工程问题以及调优

571次阅读
没有评论

1.DMA和cache一致性

Linux内核之内存5: 其他工程问题以及调优

(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

Linux内核之内存5: 其他工程问题以及调优

Dma可以从不连续内存,CMA申请内存

dma_alloc_coherent不需要从CMA申请内存,支持MMU,可以用物理不连续的内存来实现DMA操作;
Linux内核之内存5: 其他工程问题以及调优

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 cgexec –g memory:A ./a.out

3. 性能方面的调优:page in/out, swapin/out

4. Dirty ratio的一些设置

脏页写回

时间维度:时间到,脏页写回;dirty_expire_centisecs

空间维度:Dirty_ratio

Dirty_background_ratio:

cd /proc/sys/vm

Linux内核之内存5: 其他工程问题以及调优

假如某个进程在不停写数据,当写入大小触发dirty_background_ratio_10%时,脏页开始写入磁盘,写入数据大小触发dirty_ratio_20%时(磁盘IO速度远比写内存慢),如果继续写,会被内核阻塞,等脏页部分被写入磁盘,释放pagecached后,进程才能继续写入内存;

Linux内核之内存5: 其他工程问题以及调优

所有的脏页flush,都是后台自动完成,当写入速度不足以触发dirty_ratio时,进程感知不到磁盘的存在。

5. swappiness

内存回收reclaim,涉及三个水位,

Linux内核之内存5: 其他工程问题以及调优

Linux内核之内存5: 其他工程问题以及调优

回收哪里的内存,back_groudpages, swap,由swappiness决定

Linux内核之内存5: 其他工程问题以及调优

Swappiness越大,越倾向于回收匿名页;

即使Swappiness设置为0,先回收背景页,以使达到最低水位;假使达不到,还是会回收匿名页;

有个例外,对于cgroup而言,设置swappiness=0,该group的swap回收被关闭;但是全局的swap还是可以回收;

为什么设定最低水位,在Linux有一些紧急申请,PF_MEMALLOC,可以突破min水位,(回收内存的过程,也需要申请内存,类似征粮队自身需要吃粮食)。

最低水位,可以通过lewmem_reserve_ratio修改;

Linux内核之内存5: 其他工程问题以及调优

关于最低水位的计算方法:

Linux内核之内存5: 其他工程问题以及调优

回收inode/dentry的slab

Linux内核之内存5: 其他工程问题以及调优

设置drop_caches

Linux内核之内存5: 其他工程问题以及调优

Linux内核之内存5: 其他工程问题以及调优

getdelays工具

getdelays 测量调度、I/O、SWAP、Reclaim的延迟,需要内核打开相应选项

CONFIG_TASK_DELAY_ACCT=y

CONFIG_TASKSTATS=y

Documentation/accounting/delay-accounting.txt

Linux内核之内存5: 其他工程问题以及调优

vmstat

用法,man vmstate

模糊查找


apropos timer

(base) leon\@pc:\~/work/myHub/linux/kernel/linux/Documentation/accounting\$
apropos vmstat

vmstat (8)      - Report virtual memory statistics

(base) leon\@pc:\~/work/myHub/linux/kernel/linux/Documentation/accounting\$

Linux内核之内存5: 其他工程问题以及调优

6.其他文章

宋宝华《关于DMA和dma_alloc_coherent若干误解的澄清》

https://access.redhat.com/documentation/enus/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-memory-tunables

正文完
 
admin
版权声明:本站原创文章,由 admin 2022-01-04发表,共计2170字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)