Linux系统的ECS实例的系统、内存或进程出现异常,查看系统日志提示"page allocation failure"错误怎么办?

本文介绍Linux系统的ECS实例在系统、内存或进程出现异常,查看系统日志提示"page allocation failure"错误的问题原因及解决方案。

问题现象

Linux系统的ECS实例的系统、内存或进程出现异常,通过查看系统日志提示"page allocation failure"错误,表示系统因内存不足导致无法为新的内存页分配内存空间,内存页分配失败。

什么是内存页

内存页(Memory Page)是操作系统中对内存进行管理的最小单位。在虚拟内存系统中,物理内存被划分为固定大小的块,每个块被称为内存页。一般情况下,内存页的大小为4KB或者8KB。操作系统使用内存页来进行内存的分配和管理。当程序需要使用内存时,操作系统将相应的内存页分配给该程序。内存页的大小是根据硬件和操作系统的设计来决定的,它的选择考虑了内存的利用率、地址空间大小和操作系统的内存管理机制等因素。

image.png

关于如何查看系统日志的具体操作,请参见查看实例的系统日志和屏幕截图

问题原因

该问题可能是由于ECS实例的系统内存不足或碎片化严重,导致无法分配所需的内存页。

解决方案

建议您首先尝试方案一:内存异常排查与优化,以解决内存使用问题。如果经过排查优化后问题仍然存在或无法解决,那么可以考虑方案二:升配实例规格(vCPU和内存),以解决实例系统内存不足或碎片化严重的问题。

方案一:内存异常排查与优化

  1. 远程连接Linux实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 排查占用大量内存的异常进程。

    1. 执行freetop命令确认不存在占用大量内存的进程。

    2. 执行如下命令,统计所有进程占用的物理内存,相加后与free命令结果进行核对,确认是否有偏差。

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

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

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

      若以上步骤中,均未查找出异常进程,则继续执行下述操作。

    3. 执行以下命令,检测slab内存分配器的占用情况。

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

      {print $1 sum " MB"}命令是将输出结果转换为以MB为单位的形式进行显示。

    4. 执行atop命令,使用atop工具分析slab列的内存占用情况,核实内存占用是否较高。

      返回示例如下图所示:

      image

      根据显示信息,判断为slab占用内存过高。

    5. 执行slabtop命令,以更详细地分析系统中slab的占用情况。

      返回示例如下图所示:

      image

  3. 执行以下操作进行内存优化。

    • 释放内存

      重要

      在执行内存释放操作之前,建议首先手动执行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实例系统内存不足或碎片化严重的问题。以确保系统能够分配所需的内存页,从而避免实例的系统、内存或进程出现异常。更多信息,请参见升降配方式概述