Linux性能优化-关于Linux内存管理

关于linux内存管理

1. free命令

$ free -g
image

2. Slab介绍

Slab Allocation 是Linux 2.2之后引入的一个内存管理机制,专门用于缓存内核的数据对象,可以理解为一个内核专用的 对象池 ,可以提高系统性能并减少内存碎片。(Linux 2.6.23之后, SLUB 成为了默认的allocator。)

查看Slab缓存
$ cat /proc/meminfo

查看slab相关的数据

Slab:             154212 kB
SReclaimable:      87980 kB
SUnreclaim:        66232 kB

SReclaimable(Linux 2.6.19+)都是clean的缓存,随时可以释放。
SUnreclaim为不可回收的缓存。

查看Slab缓存的具体使用情况
$ cat /proc/slabinfo
$ slabtop

3. 内存回收

要想多清一点缓存,可以在写drop_caches文件之前运行sync指令,将脏数据落盘变成干净的缓存;

$ sync && sync

清理 page cache
$ echo 1 > /proc/sys/vm/drop_caches

释放Slab中clean的缓存(包括inode和dentry的缓存)
$ echo 2 > /proc/sys/vm/drop_caches

清理 page cache、dentries 和 inodes
$ echo 3 > /proc/sys/vm/drop_caches

/proc/meminfo中的”Cached”表示page cache所占用的内存大小;
“Slab”表示内核Slab所占用的内存大小,slab有的可回收有的不可回收,其中可回收的通过”SReclaimable”表示,不可回收的通过”SUnreclaim”表示。

即便仅考虑page cache (对应于 /proc/meminfo 的”Cached”),也并不是所有的页面都可以回收的:

首先,drop_caches只回收clean pages,不回收dirty pages,参见https://www.kernel.org/doc/Documentation/sysctl/vm.txt
所以如果想回收更多的cache,应该在drop_caches之前先执行”sync”命令,把dirty pages变成clean pages。

4. 调整系统vm配置

风险预警: 调整以下系统配置可能会对系统性能造成负面影响,请仔细测试并谨慎操作。
/etc/sysctl.conf里有几个对内存管理影响比较大的配置,以下配置项的文档见 vm.txt

vm.vfs_cache_pressure

系统在进行 内存回收 时,会先回收 page cache , inode cache, dentry cache和 swap cache 。vfs_cache_pressure越大,每次回收时,inode cache和dentry cache所占比例越大_[3]_。
vfs_cache_pressure默认是100,值越大inode cache和dentry cache的回收速度会越快,越小则回收越慢,为0的时候完全不回收( OOM !)。

vm.min_free_kbytes

系统的”保留内存”的大小,”保留内存”用于低内存状态下的”atomic memory allocation requests”(eg. kmalloc + GFP_ATOMIC),该参数也被用于计算开始 内存回收 的阀值,默认在开机的时候根据当前的内存计算所得,越大则表示系统会越早开始 内存回收
min_free_kbytes过大可能会导致 OOM ,太小可能会导致系统出现死锁等问题。

vm.swappiness

该配置用于控制系统将内存 swap out 到交换空间的积极性,取值范围是[0, 100]。swappiness越大,系统的交换积极性越高,默认是60,如果为0则不会进行交换。

5. 一些案例分析

为什么容器内存占用居高不下,频频 OOM
为什么手工DROP_CACHES之后CACHE值并未减少
Linux内存回收之drop cache

posted @ 2021-08-14 17:30  Pyke的大鲨鱼  阅读(338)  评论(0编辑  收藏  举报