故障发现
今天发现有一台阿里云线上环境的服务器内存在告急,使用free -m
一看,果然剩余的内存不多了,而且buffers
和cached
也都不高,如图:
用top
一看,里面的情况是这样的:
很奇怪,top
里的res
即物理内存加起来也就2200M多一点,但是free
命令里显示已经用掉了几乎3.4个G,那这1.2G的空头内存去哪了?要知道,free
命令会把Slab缓存
统计到了used memory
里,那就看看slab缓存
有多少吧。
yum install -y nmon
,使用nmon
看一下,如图:
发现里面有几乎650MB的slab内存,这样还是少了大约550MB,那么使用slabtop
查看细节,如图:
再用cat /proc/meminfo
去查看一下内存详细情况,如图:
https://blog.famzah.net/2014/09/22/know-your-linux-memory-usage/ 这里提到内存的计算公式:
1
2
3
4MemTotal = MemFree + (Buffers + Cached + SwapCached) + AnonPages + (Slab + PageTables + KernelStack)
MemTotal = MemFree + (Active + Inactive) + (Slab + PageTables + KernelStack)
MemTotal = MemFree + (Buffers + Cached + SwapCached) + AnonPages + ((SReclaimable + SUnreclaim) + PageTables + KernelStack)
MemTotal = MemFree + ((“Active(anon)” + “Active(file)”) + (“Inactive(anon)” + “Inactive(file)”)) + ((SReclaimable + SUnreclaim) + PageTables + KernelStack)
虽然作者说他测试的机器内核是3.2的,但是这几个公式对我这个服务器(内核2.6)都可以用,虽然肯定不能严丝合缝但是相差值并不大,我用前两个公式算了一下我这个机器的情况:
1
2MemTotal(3495620) = MemFree(251396) + Buffers(11456) + Cached(292324) + SwapCached(0) + AnonPages(2302484) + Slab(627068) + PageTables(8972) + KernelStack(1920)
MemTotal(3495592) = MemFree(251396) + Active(2450960) + Inactive(155276) + Slab(627068) + PageTables(8972) + KernelStack(1920)
猜测一下
我特么的法克,这个memtotal跟3921112差距很远啊!相差了412MB!为什么会少了这么多?会不会这412MB就是那used memory
减去slap内存的那部分神秘内存?他为什么没有统计在/proc/meminfo
里?
于是果断给阿里云提工单,截图发锤,让他们给一个完美的解释。
等待阿里云回复的时间里,我又找了几个其他的机器,各种型号的都算了一下,发现一个现象:凡是装了这个模块的服务器都出现了MemTotal
不相符的问题,大约误差值都是400M~500M,而除了这个模块,MemTotal
的误差值基本就是50M以内。
呃…这好像不能怪阿里云了…不过的确MemTotal
是有误差的啊!
找开发了解了一下,这个服务器里用了大量的tcp长连接,而且是https的,使用netstat -na|grep ESTABLISHED|wc -l
一看,有95000个左右。
而在开发环境的机器里查看,MemTotal
的相差率很小,而tcp连接数则不到20个。那用排除法可以确定是TCP长连接的锅,于是我猜测TCP长连接占用掉了一部分内存,而这部分内存又没有在meminfo(SLAB)里体现出来,进而导致free命令与top命令相差过大。
小心求证
未完待续…
参考资料
http://farll.com/2016/10/high-memory-usage-alarm/#comment-9881
http://lday.me/2017/09/02/0012_a_memory_leak_detection_procedure/ (虽然跟本文没啥关系,但是强力推荐)
http://blog.yufeng.info/archives/2456
http://lovestblog.cn/blog/2015/08/21/rssxmx/
https://www.mawenbao.com/research/linux-ate-my-memory.html