Alibaba Cloud Linux 2系统的ECS实例创建大量进程失败,如何处理?

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文为您介绍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),引发报错。

解决方案

调整系统用户可创建的最大线程数

  1. 系统日志中查看所有进程创建失败的应用。

  2. 执行以下命令,强制关闭占用线程数较多的应用。

    警告

    kill命令属于风险操作,建议在执行前为ECS实例创建快照或备份重要文件,以确保数据安全。

    <PID>需替换为占用线程数较多的进程PID。

    kill -9 <PID>
  3. 执行以下命令,调整系统用户可创建的最大线程数。

    <$Num_Of_Process>替换为调整后的最大线程值,根据实际需求合理规划ulimit资源。

    ulimit -u <$Num_Of_Process>

调整某个进程的limit资源

  1. (可选)若未安装util-linux工具,请执行以下命令安装。

    sudo yum install -y util-linux
  2. 执行以下命令,调整进程的limit资源。

    <$PID>需替换为进程或线程创建失败的进程PID。

    prlimit --pid <$PID> --nproc=unlimited