現象
ECS インスタンスでサービスを起動すると、システムから
task: Cannot allocate memory エラーが返されます。 システムログには、次のようなエントリが含まれている場合があります。 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.原因
この問題は、システム上のプロセス数が設定された上限を超えたことが原因で発生します。
Linux カーネルは、
kernel.pid_max パラメーターを使用して、総プロセス数を制限します。 実行中のプロセスの総数が kernel.pid_max の値を超えると、新しいプロセスを作成しようとしても失敗し、システムから task: Cannot allocate memory エラーが報告されます。説明 現在実行中のプロセス数が
kernel.pid_max の値の 3 分の 2 を超える場合は、ただちに kernel.pid_max の値を大きくしてサービスの中断を防ぐ必要があります。ソリューション
次の手順に従って
kernel.pid_max の値を大きくします。これにより、システムでより多くのプロセスを実行できるようになります。説明 64 ビットシステムでは、
kernel.pid_max の最大値は 222kernel.pid_max です。 32 ビットシステムでは、最大値は 32,768 です。- ECS インスタンスに接続します。
詳細については、「ECS インスタンスへの接続」をご参照ください。
- 次のコマンドを実行して、現在のプロセス数がシステムの上限を超えているかどうかを確認します。
- 現在実行中のプロセス数を確認します。
ps -eLf | wc -l - システムで許可されている最大プロセス数を確認します。
sysctl kernel.pid_max
実行中のプロセス数が最大上限に近いか、または超えている場合は、手順 3 に進みます。
- 現在実行中のプロセス数を確認します。
XXXXをkernel.pid_maxの新しい値に置き換えます。- 値を一時的に設定するには、次のいずれかのコマンドを実行します。 この設定は、インスタンスが再起動されるとリセットされます。
sysctl -w kernel.pid_max=XXXXecho XXXX> /proc/sys/kernel/pid_max
- 値を永続的に設定するには、次のコマンドを実行します。 この設定は、インスタンスを再起動しても維持されます。
echo "kernel.pid_max=XXXX" >> /etc/sysctl.conf sysctl -p
新しい値はすぐに有効になります。- 値を一時的に設定するには、次のいずれかのコマンドを実行します。 この設定は、インスタンスが再起動されるとリセットされます。