Sintoma
Ao iniciar um serviço em uma instância ECS, o sistema retorna o erro
task: Cannot allocate memory
. Os logs do sistema podem conter entradas semelhantes ao exemplo abaixo:
15 10:49:08 iZbp17u xxx systemd: Failed to fork: Cannot allocate memory
15 10:49:08 iZbp17u xxx systemd: frp@8050.service failed to run 'start' task: Cannot allocate memory
15 10:49:08 iZbp17u xxx systemd: Failed to start example systemd custom service unit file 8050.
15 10:49:08 iZbp17u xxx systemd: Unit frp@8050.service entered failed state.
15 10:49:08 iZbp17u xxx systemd: frp@8050.service failed.
15 10:49:08 iZbp17u xxx systemd: Failed to fork: Cannot allocate memory
15 10:49:08 iZbp17u xxx systemd: frp@8049.service failed to run 'start' task: Cannot allocate memory
15 10:49:08 iZbp17u xxx systemd: Failed to start example systemd custom service unit file 8049.
15 10:49:08 iZbp17u xxx systemd: Unit frp@8049.service entered failed state.
Causa
Esse problema ocorre quando a quantidade de processos no sistema ultrapassa o limite configurado.
O kernel do Linux usa o parâmetro
kernel.pid_max
para limitar o número total de processos. Se a quantidade total de processos em execução exceder o valor de
kernel.pid_max
, qualquer tentativa de criar um novo processo falhará e o sistema retornará o erro
task: Cannot allocate memory
.
Se o número atual de processos em execução ultrapassar dois terços do valor de
kernel.pid_max
, aumente imediatamente esse valor para evitar interrupções nos serviços.
Solução
Siga as etapas abaixo para aumentar o valor de
kernel.pid_max
. Isso permite que o sistema execute mais processos.
Em sistemas de 64 bits, o valor máximo para
kernel.pid_max
é 2
22
. Em sistemas de 32 bits, o valor máximo é 32.768.
-
Conecte-se à instância ECS.
-
Execute os comandos a seguir para verificar se a contagem atual de processos excede o limite do sistema.
-
Verifique o número atual de processos em execução.
ps -eLf | wc -l -
Verifique o número máximo de processos permitidos pelo sistema.
sysctl kernel.pid_max
Se o número de processos em execução estiver próximo ou acima do limite máximo, prossiga para a etapa 3.
-
-
Substitua XXXX pelo novo valor desejado para kernel.pid_max.
-
Para definir o valor temporariamente, execute um dos comandos abaixo. A configuração será redefinida após a reinicialização da instância.
sysctl -w kernel.pid_max=XXXXecho XXXX> /proc/sys/kernel/pid_max
-
Para tornar a alteração permanente, execute os comandos a seguir. A configuração persistirá entre as reinicializações da instância.
echo "kernel.pid_max=XXXX" >> /etc/sysctl.conf sysctl -p
O novo valor entra em vigor imediatamente.
-