文档首页> 弹性云服务器 ECS> 故障排除> 操作系统类(Linux)> Linux实例执行命令或启动服务时出现错误:Cannot allocate memory
更新时间:2024-04-18 GMT+08:00

Linux实例执行命令或启动服务时出现错误:Cannot allocate memory

问题描述

Linux操作系统的ECS实例内存充足,但是在执行命令或启动服务时,出现错误提示“Cannot allocate memory”。

命令及执行结果如下:

root@localhost:~# free -m
          total       used       free     shared    buffers/cached    available
Mem:      3890         125       3179          2          504          3463
Swap:        0          0         0
root@localhost:~# uname -a
-bash: fork: Cannot allocate memory

可能原因

出现该错误信息表示系统的进程ID(PID),即系统中运行的进程/线程数达到了最大限制,该限制由内核参数/proc/sys/kernel/pid_max控制。

解决方案

  1. 远程登录ECS实例。
  2. 执行以下命令,查看系统当前已运行的进程数。

    ps -eLf | wc -l

    结果如下:

    32753

    也可以通过执行以下命令,通过观测plist-sz列数值查看系统已运行的进程数变化情况。

    如果执行sar –q命令后提示“command not found”,请先执行以下命令安装软件包:

    • CentOS系统:yum install sysstat
    • Ubuntu系统:apt install sysstat

    sar -q

    结果如下:

    ...
    00:00:01      runq-sz  plist-sz   ldavg-1   ldavg-5  ldavg-15  blocked
    10:45:01        0     32722      0.10      0.12      0.16     0
    10:46:01        1     32730      0.21      0.15      0.17     0
    10:47:01        2     32752      0.07      0.11      0.15     0
  3. 执行以下命令,查看系统配置的最大进程数。

    cat /proc/sys/kernel/pid_max

    32768

    如果系统当前已经运行的进程数接近或达到系统配置的最大进程数,则说明需要增大/proc/sys/kernel/pid_max的数值。

  4. 根据业务需要,执行以下命令,调整/proc/sys/kernel/pid_max的数值。

    以调整为65530为例:

    echo "kernel.pid_max=65530" >> /etc/sysctl.conf

    sysctl -p

    结果如下:

    vm.swappiness = 0
    net.core.somaxconn = 1024
    net.ipv4.tcp_max_tw_buckets = 5000
    net.ipv4.tcp_max_syn_backlog = 1024
    kernel.pid_max = 65530