
# 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列数值查看系统已运行的进程数变化情况。
   ![](https://support.huaweicloud.com/trouble-ecs/public_sys-resources/note_3.0-zh-cn.png)
   如果执行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
   ```
   
 
