linux内存占用问题调查——slab
来源:互联网 发布:公司logo在线制作软件 编辑:程序博客网 时间:2024/06/14 17:57
1、问题描述:
最近在维护一台CentOS服务器的时候,发现内存无端"损失"了许多,free和ps统计的结果相差十几个G,登上去发现:
$ free -g total used free shared buffers cachedMem: 15 15 0 0 2 0-/+ buffers/cache: 12 2Swap: 17 0 17
这台服务器有16G内存,但是结果显示除了2G左右的文件Buffer缓存外,其余十几G都被确确实实的用光了。
free命令各个列含义:
/ total used free shared buffers cached
$ ps aux | awk '{mem += $6} END {print mem/1024/1024}'0.595089
结果显示所有进程占用的内存还不到1G,实际上,因为free, ps的统计方式的差别和Copy-on-write(http://wiki.osdev.org/Paging)和Shared libraries等内存优化机制的存在,这两者的统计结果通常是不一样的。但是一般情况下绝对不会相差十几个G,肯定是有什么隐藏的问题,Google了许久后发现,free没有专门统计另一项缓存: Slab。
2、Slab简介和进一步调查
Slab Allocation是Linux 2.2之后引入的一个内存管理机制,专门用于缓存内核的数据对象,可以理解为一个内核专用的对象池,可以提高系统性能并减少内存碎片。(Linux 2.6.23之后,SLUB成为了默认的allocator。)
1)查看Slab缓存
$ cat /proc/meminfo
其中,Slab相关的数据为
Slab: 154212 kBSReclaimable: 87980 kBSUnreclaim: 66232 kB
SReclaimable(Linux 2.6.19+)都是clean的缓存,随时可以释放。回到之前的内存问题,我查了下那台服务器上Slab占用的内存:
$ cat /proc/meminfo | grep SlabSlab: 12777668 kB
12G的Slab缓存,有意思的是free把Slab缓存统计到了used memory中,这就是之前那个问题的症结所在了。
2)另外,还可以查看/proc/slabinfo(或使用slabtop命令)来查看Slab缓存的具体使用情况。结果发现,ext3_inode_cache和dentry_cache占用了绝大部分内存。考虑到这台服务器会频繁地用rsync同步大量的文件,这个结果也并不意外。
3、解决问题:
先说明一下,如果问题仅仅是Slab占用了太多的内存(SReclaimable),那么通常不需要太操心,因为这根本不是个问题(如果是SUnreclaim太多且不断增长,那么很有可能是内核有bug)。但是,如果是因为Slab占用内存太多而引起了其他的问题,建议继续阅读。
1)手工清除Slab可回收缓存:
echo 2 > /proc/sys/vm/drop_caches
上面的命令会主动释放Slab中clean的缓存(包括inode和dentry的缓存),然后再free -g一下,未使用的内存陡增了十几个G。。。
注:手动清除缓存可能会在一段时间内降低系统性能。原则上不推荐这么做,因为如果有需要,系统会自动释放出内存供其他程序使用。
另外,手动清除Slab缓存是一个治标不治本的办法。因为问题不在Slab,而在于我们那个会引起Slab缓存飙涨的进程(我这里应该是rsync)。实际操作的时候发现,清除缓存一段时间后,Slab缓存很快又会“反弹”回去。如果需要治本,要么搞定问题进程,要么修改系统配置。
2)调整系统vm配置
vm.vfs_cache_pressure
系统在进行内存回收时,会先回收page cache, inode cache, dentry cache和swap cache。vfs_cache_pressure越大,每次回收时,inode cache和dentry cache所占比例越大。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则不会进行交换。
参考:https://www.mawenbao.com/research/linux-ate-my-memory.html
- linux内存占用问题调查——slab
- linux内存占用问题调查——cached
- linux内存占用问题
- linux内存管理之三——slab分配器
- linux内存管理--slab
- [Linux内存]linux内存学习(六)——slab分配器
- javafx——内存占用过大问题
- Linux内存管理Slab分配器
- linux 内存的slab分配器
- Linux内存管理 Slab分配器
- Linux内存管理 Slab分配器
- Linux内核-内存-slab分配器
- Linux内存管理slab分配器
- Linux内存管理slab分配器
- 正确理解Linux内存占用过高的问题
- 正确理解Linux内存占用过高的问题
- 正确理解Linux内存占用过高的问题
- 正确理解Linux内存占用过高的问题
- 你应该知道的RPC原理
- 总结《Ray Tracing from the Ground Up》
- coedvs 2744养鱼喂妹纸(二分+贪心)
- kotlin学习笔记(四)
- 松滋覃氏家族是明皇子朱棣的御林指挥使卢振的后裔
- linux内存占用问题调查——slab
- ajax-跨域
- Centos 6.5 安装tomcat6
- angular数据通讯
- 基本数据结构定义
- 关于UNION
- 173. Binary Search Tree Iterator
- 大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块
- String、StringBuffer、StringBuilder、StringTokenizer总结!