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

1.DMA和cache一致性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-isnAS84z-1598517499007)(media/c4206114972c5f94e6f185da50b701ea.png)]

(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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rh7dgdvQ-1598517499010)(media/33f4cf825d818ceeb55f2bed46ce02fe.png)]

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

dma_alloc_coherent不需要从CMA申请内存,支持MMU,可以用物理不连续的内存来实现DMA操作;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSVf9oIP-1598517499011)(media/2b61657481e8532ccffea663698f99f0.jpg)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LHdHPa72-1598517499013)(media/1703771327809b1776192a4d948d96c9.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nmVblUcS-1598517499015)(media/d9fa8494584d1c5e6e286e6bd120a90d.jpg)]

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

5. swappiness

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DaRM2Zai-1598517499017)(media/ebd0ac95b88659438744f1a21af8efa1.png)]

在这里插入图片描述

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vi0YJ1DX-1598517499019)(media/8c7d0fb3d337d001d1f4739d49adf20d.png)]

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

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

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

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1oFS3VfG-1598517499021)(media/342b3dba400ad3fc2112fa8fc9097fcd.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gm1DKBPz-1598517499023)(media/861cb980fbf3200617f4e1a8c7e58dd1.png)]

回收inode/dentry的slab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eskF8AAA-1598517499024)(media/2f53631c6abc21d2a5d4209990bc911a.png)]

设置drop_caches

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-buDAjpNq-1598517499025)(media/a1907b75740ab025c86b61d706e02627.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDfGVDZV-1598517499026)(media/6a05756892b0222976274d5f73ea0a8e.png)]

getdelays工具

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

CONFIG_TASK_DELAY_ACCT=y

CONFIG_TASKSTATS=y

Documentation/accounting/delay-accounting.txt

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lrWQDJGM-1598517499026)(media/5a8927f31b2aaeb7897b9c0a5b914cec.png)]

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\$

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FmXtNv7c-1598517499027)(media/a5f2131bcf953ad13c8bdef51c6af778.png)]

6.其他文章

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

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值