本文為您介紹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),引發報錯。
解決方案
調整系統使用者可建立的最大線程數
系統日誌中查看所有進程建立失敗的應用。
執行以下命令,強制關閉佔用線程數較多的應用。
警告kill命令屬於風險操作,建議在執行前為ECS執行個體建立快照或備份重要檔案,以確保資料安全。<PID>需替換為佔用線程數較多的進程PID。kill -9 <PID>執行以下命令,調整系統使用者可建立的最大線程數。
<$Num_Of_Process>替換為調整後的最大線程值,根據實際需求合理規劃ulimit資源。ulimit -u <$Num_Of_Process>
調整某個進程的limit資源
(可選)若未安裝
util-linux工具,請執行以下命令安裝。sudo yum install -y util-linux執行以下命令,調整進程的
limit資源。<$PID>需替換為進程或線程建立失敗的進程PID。prlimit --pid <$PID> --nproc=unlimited