Este tópico descreve as causas e soluções para falhas na criação de processos em uma instância Elastic Compute Service (ECS) com Alibaba Cloud Linux 2.
Sintomas
Ao executar a chamada de sistema fork ou clone na instância, o erro -1 EAGAIN (Resource temporarily unavailable) é exibido e impede a criação de novos processos. Essa falha manifesta-se de duas formas:
Falha em comandos shell: A execução de comandos shell gera a mensagem
bash: fork: retry: No child processes.Falha específica de aplicação: Não é possível criar processos ou threads para determinadas aplicações, enquanto outras funcionam normalmente.
Causas
O erro EAGAIN ocorre quando algum dos seguintes limites do sistema é atingido:
|
Limite |
Descrição |
Comando de diagnóstico |
|
Limite de threads por usuário |
O usuário do sistema atingiu o número máximo de threads permitidas. Geralmente, isso causa falha generalizada nos comandos shell. |
|
|
Limite específico da aplicação ( |
A quantidade de processos ( |
— |
Solução 1: Aumentar o limite de threads para o usuário do sistema
Adote esta solução quando os comandos shell falharem com a mensagem bash: fork: retry: No child processes.
Etapa 1: Identificar e encerrar threads que consomem recursos excessivos
Identifique quais aplicações estão consumindo mais threads.
-
Encerre qualquer aplicação que ocupe um número excessivo de threads. Substitua
<PID>pelo ID do processo (PID) da aplicação a ser encerrada.AvisoO comando
killencerra processos imediatamente e pode causar perda de dados. Antes de executá-lo, crie um snapshot da instância ou faça backup dos arquivos críticos.kill -9 <PID>
Etapa 2: Elevar o limite de threads
Substitua <$Num_Of_Process> pelo novo valor de limite.
ulimit -u <$Num_Of_Process>
Solução 2: Aumentar o limite de recursos para um processo específico
Utilize esta solução quando apenas aplicações específicas falharem ao criar processos ou threads.
-
(Opcional) Caso o
util-linuxnão esteja instalado, instale-o primeiro.yum install -y util-linux -
Defina o limite de processos como ilimitado para o processo alvo. Substitua
<$PID>pelo PID do processo.prlimit --pid <$PID> --nproc=unlimitedEssa alteração entra em vigor imediatamente para o processo em execução, mas não persiste após a reinicialização do processo.