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. 切换到root用户,查看进程创建失败用户的所有应用。

  2. 通过kill命令强制关闭占用线程数较多的应用。

    警告

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

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

    ulimit -u <$Num_Of_Process>
    说明

    <$Num_Of_Process>指调整后的最大线程值,建议您合理规划ulimit资源。

调整某个进程的limit资

  1. 安装util-linux工具。

    yum install -y util-linux
    说明

    如果已安装该工具,可跳过本步骤。

  2. 调整进程的limit资源。

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

    <$PID>指进程或线程创建失败的进程PID。