Alibaba Cloud Linux 2系统的ECS实例创建大量进程后进程最终创建失败的解决方法
问题描述
Alibaba Cloud 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日志备份等功能。
•如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。
临时解决方案
不同的场景,解决方案不同,请根据现场实际情况匹配对应的场景。
•场景一:参考如下步骤,调整系统用户可创建的最大线程数。
i.切换到root用户,查看进程创建失败用户的所有应用。
ii.通过kill命令强制关闭占用线程数较多的应用。
iii.参考如下命令,调整系统用户可创建的最大线程数。
警告:kill命令属于风险操作,确保操作前为ECS实例创建快照或者备份重要文件,确保数据安全。
ulimit -u [$Num_Of_Process]
说明:[$Num_Of_Process]指调整后的最大线程值。
•场景二:参考如下步骤,调整某个进程的limit资源。
i.参考如下命令,安装util-linux工具。
yum install -y util-linux
说明:如果已安装该工具,可跳过本步骤。
ii.参考如下命令,调整进程的limit资源。
prlimit --pid [$PID] --nproc=unlimited
说明:[$PID]指进程或线程创建失败的进程PID。
固化解决方案
建议管理员合理规划ulimit资源。关于如何规划该资源,请参见How to set ulimit values。
适用于
•云服务器ECS
如果您有其他问题,可以联系北京志远天辰阿里云代理商,为您提供一对一专业全面的技术服务,同时新/老阿里云会员,均可享受我公司代理商价格,欢迎咨询!
我有话说: