linux可用内存使用分析问题

服务器01内存MEMAppUsablePerc告警,当时的现场信息如下:
服务器01使用free查看内存使用率,可以看到算上buffers和cache,内存还剩余了2.7G,但是patrol上显示可用MEMAppUsablePerc只有5% :
pacpgwq01:~ # free -m
total used free shared buffers cached
Mem: 7867 7705 162 0 136 2459
-/+ buffers/cache: 5109 2758
Swap: 0 0 0

服务器02使用free查看内存使用率,算上buffers和cache,内存还剩余了2.1G,与patrol上显示可用MEMAppUsablePerc为25%,基本相符:
pacpgwq02:~> free -m
total used free shared buffers cached
Mem: 7867 7732 134 0 32 1937
-/+ buffers/cache: 5762 2104
Swap: 0 0 0

为什么free –m的内容差不多,patrol差异这么大?

后来跟监控组确认MEMAppUsablePerc的计算方法,其计算方法为:Patrol KM读取/proc/meminfo的字段,
MEMAppUsablePerc(内存可用率)=100*(MemFree+Buffers+Cached)/MemTotal
当时的相关信息如下:
pacpgwq01:/proc/sys/vm # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 2844140 kB
Buffers: 1328 kB
Cached: 31888 kB
SwapCached: 0 kB

可以看到其cached为31M左右,与free –m看到2.4G的差别很大。

而pacpgwq02的信息如下,与Patrol基本一致,MEMAppUsablePerc为20%左右。
pacpgwq02:~ # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 133852 kB
Buffers: 92856 kB
Cached: 1786256 kB
为什么会出现free –m与/proc/meminfo信息不一致的这个问题,后来查询相关资源发现:
SUSE之类的系统则认为:可用内存=free的内存+cached的内存+buffers的内存+SReclaimable的内存(SReclaimable为操作系统内存管理slob缓存的系统内核信息)
检查pacpgwq01的SReclaimable大小,发现有1.9G左右。
pacpgwq01:/usr # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 158948 kB
Buffers: 145540 kB
Cached: 526864 kB

Slab: 2078612 kB
SReclaimable: 1967368 kB

调用以下命令调整内核参数,对文件环境、kernel缓存进行清理后,Cached、SReclaimable降低,MemFree显著增加,Patrol监控恢复正常。
pacpgwq01:/usr # echo 3 > /proc/sys/vm/drop_caches
pacpgwq01:/usr # cat /proc/meminfo
MemTotal: 8055952 kB
MemFree: 2731032 kB
Buffers: 1192 kB
Cached: 25604 kB
SwapCached: 0 kB

Slab: 150672 kB
SReclaimable: 39456 kB

以为这个问题就这么解决了,但是后续观察又发现运行一段时间后,pacpgwq01的SReclaimable值又增加了到1.3G,而没有执行任何操作的pacpgwq02其SReclaimable一直为180M左右。

那么SReclaimable为什么增长呢?slaptop发现,其主要为进程inode缓存proc_inode_cache(1G左右),其次为目录结构缓存dentry(300M),
pacpgwq01:/usr # slabtop
Active / Total Objects (% used) : 3723187 / 3809628 (97.7%)
Active / Total Slabs (% used) : 373224 / 373230 (100.0%)
Active / Total Caches (% used) : 95 / 175 (54.3%)
Active / Total Size (% used) : 1431793.25K / 1443443.42K (99.2%)
Minimum / Average / Maximum Object : 0.02K / 0.38K / 4096.00K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME
1566570 1566254 99% 0.64K 261095 6 1044380K proc_inode_cache
1607260 1606750 99% 0.19K 80363 20 321452K dentry
31915 31893 99% 0.80K 6383 5 25532K ext3_inode_cache
121758 113904 93% 0.18K 5798 21 23192K vm_area_struct
2065 2061 99% 6.30K 2065 1 16520K task_struct
6804 5956 87% 1.62K 1701 4 13608K TCP

其有这么多的读写文件相关的缓存,肯定有大量的IO操作导致,需要对OS抓取trace确认哪些程序调用open,stat,close,unlink等操作。

抓取步骤如下:
1.如果问题可以在业务空闲是重现,则最好在业务空闲时执行。
2.请顺序执行如下命令:
# sysctl -w vm.block_dump=1
# echo 3 > /proc/sys/vm/drop_caches
# cat /proc/meminfo
3.等待Slab占用明显升高后,顺序执行如下命令:
# sysctl -w vm.block_dump=0
# cat /proc/meminfo
分析/var/log/messages,找到SReclaimable增加是执行的进程操作,判断哪一个进程导致。