Linux服务器内存消耗过高

问题描述

Linux服务器的内存持续消耗过高,重启后可以恢复正常,但业务运行后问题依旧存在,而且没有明显高消耗内存进程存在

问题原因

slab消耗内存过多。

解决方案

  1. 登录问题Linux服务器。
  2. 执行free和top命令确认不存在占用大量内存的进程。
  3. 执行如下命令,统计所有进程占用的物理内存,相加后与free命令结果进行核对,确认是否有偏差

ps aux|awk '{sum+=$6} END {print sum/1024}'

4如果确认无偏差后,为了进一步排查进程消耗内存,可执行如下命令,根据rss列排序结果,核实最大消耗内存进程.

ps -eo pid,rss,pmem,pcpu,vsz,args --sort=rss

5、如上述步骤中,均未查找出异常进程,则继续执行以下操作检测slab内存分配器占用情况,执行如下命令。

cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum " MB"}'

注:以上命令执行过程中将默认的KB单位换算为了MB单位。

6、分析slab列的内存占用情况,核实内存占用是否较高。

注:分析slab内存详细占用情况,常用为atop工具

7、运行atop命令即可观察详细信息,如下图所示,根据显示信息,验证为slab占用内存过高导致的问题。

 

CentOS版本安装atop工具的命令为yum install atop

8、更详细的slab占用分析,需要执行slabtop命令观察,执行结果如下图所示。通过命令结果,定位原因为slab中的dentry占用大量内存。

 

9、dentry占用内存较高,常见原因是程序频繁的创建、删除不同名称的文件。针对此问题执行如下步骤即可解决问题,执行如下命令,手动清除slab缓存临时释放内存空间。

echo 2>/proc/sys/vm/drop_caches

10、检查/etc/sysctl.conf文件中的如下字段,并设定合适的阈值。当系统内存达到阈值时,触发自动回收。

vm.min_free_kbytes

11、最后需要排查业务中的大量IO操作逻辑,并尝试优化

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐