云服务器的内存竟然少了500M...

故障发现

今天发现有一台阿里云线上环境的服务器内存在告急,使用free -m一看,果然剩余的内存不多了,而且bufferscached也都不高,如图:
paradin

top一看,里面的情况是这样的:
paradin

很奇怪,top里的res即物理内存加起来也就2200M多一点,但是free命令里显示已经用掉了几乎3.4个G,那这1.2G的空头内存去哪了?要知道,free命令会把Slab缓存统计到了used memory里,那就看看slab缓存有多少吧。

yum install -y nmon,使用nmon看一下,如图:
paradin

发现里面有几乎650MB的slab内存,这样还是少了大约550MB,那么使用slabtop查看细节,如图:
paradin

再用cat /proc/meminfo去查看一下内存详细情况,如图:
paradin

https://blog.famzah.net/2014/09/22/know-your-linux-memory-usage/ 这里提到内存的计算公式:

1
2
3
4
MemTotal = 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
2
MemTotal(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

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------