Aliyun Linux 2系统的ECS实例创建大量进程后进程最终创建失败

Aliyun Linux 2系统的ECS实例创建大量进程后进程最终创建失败

更新时间:2020-02-24 14:23:01

免责声明: 本文档可能包含第三方产品信息,该信息仅供参考。阿里云对第三方产品的性能、可靠性以及操作可能带来的潜在影响,不做任何暗示或其他形式的承诺。

 

问题描述

Aliyun Linux 2系统的ECS实例中执行系统调用(fork/clone)时,进程创建失败,返回“-1 EAGAIN (Resource temporarily unavailable)”错误。一般有如下两种场景。

  • 场景一:通过shell命令交互时,系统返回“bash: fork: retry: No child processes”错误。
  • 场景二:部分应用内创建进程或者线程失败,同时在系统的其他应用中却可以创建成功。

 

问题原因

不同的场景,问题原因不同,请根据现场实际情况匹配对应的场景。

  • 场景一:系统中用户创建的线程数达到最大值。关于如何查看该最大值,可通过ulimit -u命令查看。
  • 场景二:部分应用的运行用户所创建的进程数(nr_user_process)大于应用的进程数限制(app_limit),引发报错。

 

解决方案

阿里云提醒您:

  • 如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。
  • 如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。
  • 如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

临时解决方案

不同的场景,解决方案不同,请根据现场实际情况匹配对应的场景。

  • 场景一:参考如下步骤,调整用户可创建的最大线程数。
    1. 切换到root用户,查看进程创建失败用户的所有应用。
    2. 通过kill命令强制关闭占用线程数较多的应用。
    3. 参考如下命令,用户可创建的最大线程数。
      注:kill命令属于风险操作,确保操作前为ECS实例创建快照或者备份重要文件,确保数据安全。
      ulimit -u [$Num_Of_Process]
      注:[$Num_Of_Process]指调整后的最大线程值。
  • 场景二:参考如下步骤,通过某个进程的limit资源。
    1. 参考如下命令,安装util-linux工具。
      yum install -y util-linux
      注:如果已安装该工具,可跳过本步骤。
    2. 参考如下命令,调整进程的limit资源。
      prlimit --pid [$PID] --nproc=unlimited
      注:[$PID]指进程/线程创建失败的进程PID。

 

固化解决方案

建议管理员合理规划ulimit资源。关于如何规划该资源,可参考如下文档。

 

适用于

  • 云服务器 ECS

 

如果您的问题仍未解决,您可以在阿里云社区免费咨询,或提交工单联系阿里云技术支持。