本文介绍Linux系统的ECS实例在系统、内存或进程出现异常,查看系统日志提示"page allocation failure"错误的问题原因及解决方案。
问题现象
Linux系统的ECS实例的系统、内存或进程出现异常,通过查看系统日志提示"page allocation failure
"错误,表示系统因内存不足导致无法为新的内存页分配内存空间,内存页分配失败。
关于如何查看系统日志的具体操作,请参见查看实例的系统日志和屏幕截图。
问题原因
该问题可能是由于ECS实例的系统内存不足或碎片化严重,导致无法分配所需的内存页。
解决方案
建议您首先尝试方案一:内存异常排查与优化,以解决内存使用问题。如果经过排查优化后问题仍然存在或无法解决,那么可以考虑方案二:升配实例规格(vCPU和内存),以解决实例系统内存不足或碎片化严重的问题。
方案一:内存异常排查与优化
远程连接Linux实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
排查占用大量内存的异常进程。
执行
free
和top
命令确认不存在占用大量内存的进程。执行如下命令,统计所有进程占用的物理内存,相加后与free命令结果进行核对,确认是否有偏差。
ps aux|awk '{sum+=$6} END {print sum/1024}'
如果确认无偏差后,为了进一步排查进程消耗内存,可执行如下命令,根据rss列排序结果,核实最大消耗内存进程。
ps -eo pid,rss,pmem,pcpu,vsz,args --sort=rss
若以上步骤中,均未查找出异常进程,则继续执行下述操作。
执行以下命令,检测slab内存分配器的占用情况。
cat /proc/meminfo | awk '{sum=$2/1024} {print $1 sum " MB"}'
说明{print $1 sum " MB"}
命令是将输出结果转换为以MB为单位的形式进行显示。执行
atop
命令,使用atop工具分析slab列的内存占用情况,核实内存占用是否较高。返回示例如下图所示:
根据显示信息,判断为slab占用内存过高。
执行
slabtop
命令,以更详细地分析系统中slab的占用情况。返回示例如下图所示:
执行以下操作进行内存优化。
释放内存
重要在执行内存释放操作之前,建议首先手动执行
sync
命令,以确保所有未写入的系统缓冲区(包括已修改的i-node、已延迟的块I/O和读写映射文件)都被写入到磁盘中。为释放页缓存,请执行以下命令:
释放页缓存:
sudo echo 1 > /proc/sys/vm/drop_caches
释放目录和索引节点缓存:
sudo echo 2 > /proc/sys/vm/drop_caches
同时释放页、目录、索引节点缓存:
sudo echo 3 > /proc/sys/vm/drop_caches
说明以上操作并不会对系统造成损害,因为它们仅释放完全未使用的内存对象,而脏数据将继续在内存中使用,直到写入磁盘。
如果多次执行
sudo echo 3 > /proc/sys/vm/drop_caches
未能再次释放缓存,您可以尝试先执行sudo echo 0 > /proc/sys/vm/drop_caches
,然后再执行sudo echo 3 > /proc/sys/vm/drop_caches
。
内存规整
当系统释放内存后仍然存在内存不足的情况时,您可以执行以下命令进行内存整理,解决部分内存碎片化问题。
说明该操作会消耗较多的CPU资源。
sudo echo 1 > /proc/sys/vm/compact_memory
合理配置系统参数
检查
/etc/sysctl.conf
文件中的如下字段,并设定合适的阈值。当系统内存达到阈值时,触发自动回收。vm.min_free_kbytes
方案二:升配实例规格(vCPU和内存)
如果经过内存异常排查并优化后问题仍然存在或无法解决,您可以考虑升级ECS实例规格(vCPU和内存)来解决Linux实例系统内存不足或碎片化严重的问题。以确保系统能够分配所需的内存页,从而避免实例的系统、内存或进程出现异常。更多信息,请参见升降配方式概述。