今天发现一些应用所在的机器其JVM只占了总共8G中2G的空间。Page cache也只占了1个G,但是free -g出来内存确已耗尽:
代码语言:javascript复制free -g
total used free shared buffers cached
Mem: 7 7 0 0 0 1
这个看上去很吓人。遇到这种情况,我们先cat /proc/meminfo看下具体的内存占用情况
代码语言:javascript复制cat /proc/meminfo
MemTotal: 8123456KB (8G)
......
Slab: 3671234KB (3.6G)
SReclaimable: 351234 (3.5G)
我们可以看到有将近3.6G被耗尽在Slab这一项里面,紧接着下面一项SReclaimable,表示这3.6个G中可回收的为3.5G。而这部分都统计在used里面,所以看上去吓人。
什么导致了slab过高
我们可以slabtop一下
代码语言:javascript复制slabtop
3123456K(3.1G) dentry
发现是目录项导致。这可能是内核访问了一个拥有特别多文件的文件夹导致。不过由于可回收,所以我们不用太担心。
手动清理
我们可以通过
代码语言:javascript复制echo 2 > /proc/sys/vm/drop_caches
手动清理可回收的slab内存。不过,清理当时,会对上面跑的应用有一定的影响。最好先下流量再做操作。