鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

SWAP分区过小导致系统异常的解决方法

问题现象描述

在某数据库测试的时候发现执行Linux基础命令时提示“-bash: fork: Cannot allocate memory”。

重启数据库后,重新执行对应的Linux基础命令,问题不再出现。然而,在后续测试过程中经常出现数据库进程减少的情况。

关键过程、根本原因分析

  1. 由于本例中系统的进程最大数已经设置成32768,已经非常大,因此数据库进程数满的可能性不大。
  2. 本例中出现问题后,无法执行对应命令查看系统状态。因此需要查看message日志来定位问题。
    1. 登录BMC,收集message日志并查看,发现有crash的现象。日志上还可以看出,系统内存不够,所以kill了数据库进程,所以数据库进程会变减少。
    2. 此外,从日志上还发现了另外一个关键信息:swap空间已经被用光,触发了OOM(Out Of Memory),导致系统出现了异常。跟以往的测试相比,本次测试数据库使用的内存大小都是一样的,但是这次开辟的SWAP空间较小。以往的测试中,SWAP分区有150GB,而这次才开了4GB,在内存紧张的情况下,很容易触发OOM。

结论、解决方案及效果

由于客户不愿意修改数据库内存,认为当前的数据库内存配置是最优的,所以动态调整了SWAP分区大小来解决该问题。

  1. 创建空文件。
    dd if=/dev/zero of=/home/swap bs=1G count=200
  2. 挂载到SWAP空间。
    mkswap /home/swap
  3. 加载SWAP空间。
    /sbin/swapon /home/swap
  4. 1~3的配置会在重启服务器后失效,如果想让配置永久生效,则需要修改配置文件“/etc/fstab”,设置开机自动挂载。在“/etc/fstab”中新增以下内容或修改为如下内容:
    /home/swap                       swap                    swap    defaults        0 0