サーバーを運用していると、突然「fork: retry: Resource temporarily unavailable」というエラーに遭遇することがあります。
これは、プロセス数が上限に達したというサインです。
Linuxには、システムやユーザーごとにプロセス数の上限が設定されていて、それを超えると新しいプロセスが作れなくなるんです。
この記事では、プロセスの上限を確認する方法から、必要に応じて変更する方法まで、初心者の方にも分かりやすく解説していきます。
サーバー管理者なら知っておきたい知識ですよ。
プロセスとプロセス上限の基礎知識
プロセスとは
プロセスとは、実行中のプログラムのことです。
例
- ブラウザを開く → 1つ以上のプロセス
- ターミナルを開く → 1つのプロセス
- コマンドを実行 → 新しいプロセス
同時に動いているすべてのプログラムが、それぞれプロセスとして存在します。
なぜ上限があるの?
無制限にプロセスを作れると、システムリソースが枯渇してしまいます。
上限を設ける理由
- メモリの枯渇を防ぐ
- CPUの過負荷を防ぐ
- システムの安定性を保つ
- フォークボム攻撃を防ぐ
適切な上限設定が、システムの安定稼働につながります。
上限の種類
Linuxには、複数のレベルでプロセス上限が設定されています。
システム全体の上限
すべてのユーザーとプロセスを合わせた、システム全体での上限。
ユーザーごとの上限
各ユーザーが作成できるプロセスの上限。
プロセスグループの上限
cgroupsによる制限(systemd環境など)。
現在のプロセス数を確認
psコマンドで確認
最も基本的な方法です。
すべてのプロセス数を数える
ps aux | wc -l
実行中のすべてのプロセス数が表示されます。
自分のプロセス数を確認
ps -u $(whoami) | wc -l
自分のユーザーが起動しているプロセスだけをカウントします。
特定のユーザーのプロセス数
ps -u username | wc -l
topコマンドでリアルタイム確認
動的に変化するプロセス数を監視できます。
top
画面上部に「Tasks: 123 total」のように表示されます。これが現在のプロセス数です。
終了するには q
キーを押します。
/procファイルシステムで確認
Linuxの/procディレクトリには、プロセスごとにディレクトリが作られます。
プロセス数をカウント
ls /proc | grep -E '^[0-9]+$' | wc -l
数字だけのディレクトリ(プロセスID)を数えます。
システム全体のプロセス上限を確認
/proc/sys/kernel/pid_maxで確認
システム全体で作成できる最大プロセスID(PID)の値です。
確認コマンド
cat /proc/sys/kernel/pid_max
表示例
32768
この値が、システム全体で同時に存在できるプロセスの最大数です。
sysctlコマンドで確認
もう一つの確認方法です。
sysctl kernel.pid_max
表示例
kernel.pid_max = 32768
同じ値が確認できます。
threads-maxの確認
スレッド数の上限も関連します。
cat /proc/sys/kernel/threads-max
または
sysctl kernel.threads-max
表示例
63341
この値は、システムのメモリ量から自動的に計算されます。
ユーザーごとのプロセス上限を確認
ulimitコマンドで確認
最も重要な確認方法です。
ユーザープロセスの上限
ulimit -u
表示例
7823
現在のユーザーが作成できる最大プロセス数です。
すべてのリソース制限を確認
ulimit -a
表示例
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
max user processes
の行が、プロセス上限です。
limits.confの確認
永続的な設定が記述されているファイルです。
ファイルの場所
/etc/security/limits.conf
内容を確認
cat /etc/security/limits.conf | grep -v "^#" | grep -v "^$"
コメント行と空行を除いて表示します。
設定例
* soft nproc 4096
* hard nproc 8192
*
:すべてのユーザー(特定ユーザーを指定することも可能)soft
:ソフトリミット(警告レベル)hard
:ハードリミット(絶対的な上限)nproc
:プロセス数
limits.dディレクトリの確認
追加の設定ファイルが配置されるディレクトリです。
ls /etc/security/limits.d/
内容を確認
cat /etc/security/limits.d/20-nproc.conf
ここに書かれた設定は、limits.confより優先されます。
systemdでのプロセス制限を確認
systemdサービスの制限
systemd管理下のサービスには、個別に制限を設定できます。
サービスの制限を確認
systemctl show サービス名 | grep Tasks
例:Apacheの制限を確認
systemctl show apache2 | grep Tasks
表示例
TasksMax=512
TasksCurrent=10
TasksMax
:最大タスク数TasksCurrent
:現在のタスク数
cgroupsでの制限確認
systemdはcgroupsを使って制限を管理しています。
現在のcgroup制限
cat /sys/fs/cgroup/user.slice/user-1000.slice/pids.max
ユーザーID(1000など)は環境によって異なります。
自分のユーザーIDを確認
id -u
プロセス上限の変更方法
一時的な変更(再起動で元に戻る)
ulimitコマンドでの変更
ulimit -u 10000
現在のシェルセッションでのみ有効です。
システム全体の上限を一時変更
sudo sysctl -w kernel.pid_max=65536
再起動すると元に戻ります。
永続的な変更
limits.confの編集
sudo nano /etc/security/limits.conf
ファイルの最後に追加
username soft nproc 10000
username hard nproc 20000
または、すべてのユーザーに適用
* soft nproc 10000
* hard nproc 20000
変更を反映
ログアウトして、再度ログインします。
sysctl.confの編集
sudo nano /etc/sysctl.conf
以下を追加
kernel.pid_max = 65536
kernel.threads-max = 100000
変更を即座に反映
sudo sysctl -p
systemdサービスの制限変更
サービスファイルの編集
sudo systemctl edit サービス名
以下を追加
[Service]
TasksMax=1024
変更を反映
sudo systemctl daemon-reload
sudo systemctl restart サービス名
プロセス上限に関するトラブルシューティング
上限に達した場合の症状
エラーメッセージ
fork: retry: Resource temporarily unavailable
bash: fork: retry: No child processes
Cannot fork: Resource temporarily unavailable
これらのエラーは、プロセス上限に達したときに表示されます。
原因の特定
プロセスを大量に起動しているユーザーを確認
ps aux | awk '{print $1}' | sort | uniq -c | sort -rn | head
表示例
234 www-data
89 mysql
12 root
5 user1
www-dataユーザーが234個のプロセスを起動していることが分かります。
プロセスツリーを確認
pstree -p ユーザー名
どのプロセスが多数の子プロセスを生成しているか確認できます。
緊急時の対処法
不要なプロセスの終了
killall プロセス名
または、特定のプロセスIDを終了
kill プロセスID
強制終了
kill -9 プロセスID
ユーザーの全プロセスを終了(危険)
sudo pkill -u ユーザー名
注意:実行中の作業がすべて失われます。
予防策
定期的なモニタリング
cronで定期的にプロセス数をチェックするスクリプトを作成します。
スクリプト例
#!/bin/bash
MAX=7000
CURRENT=$(ps aux | wc -l)
if [ $CURRENT -gt $MAX ]; then
echo "警告: プロセス数が ${CURRENT} に達しています" | mail -s "プロセス数警告" admin@example.com
fi
アラートの設定
監視ツール(Nagios、Zabbix、Prometheusなど)でプロセス数を監視しましょう。
よくある質問
プロセス上限はいくつに設定すべき?
一般的な推奨値
デスクトップPC
- デフォルト(7823程度)で十分
小規模Webサーバー
- 10000〜20000程度
大規模サーバー
- 30000〜65536
メモリ量とCPU性能に応じて調整してください。
soft limitとhard limitの違いは?
soft limit(ソフトリミット)
- 通常の上限
- ユーザーが自分で変更可能(hard limitまで)
- 警告レベル
hard limit(ハードリミット)
- 絶対的な上限
- rootユーザーしか変更できない
- 超えることはできない
soft limitはhard limit以下である必要があります。
プロセス数が多いのは問題?
必ずしも問題ではない
- Webサーバーは多数のプロセスを使うのが普通
- データベースもワーカープロセスを複数持つ
- 正常な動作の範囲内であれば問題なし
問題なのは
- 異常に増加し続ける場合
- 上限に達してエラーが出る場合
- 応答が遅くなる場合
定期的に監視して、傾向を把握することが大切です。
rootユーザーにも上限はある?
はい、あります。
rootユーザーも、limits.confで設定された上限に従います。ただし、システム全体の上限(pid_max)には余裕を持たせておく必要があります。
実践的なチェックスクリプト
プロセス数監視スクリプト
#!/bin/bash
echo "===== プロセス上限チェック ====="
echo ""
# システム全体の上限
echo "【システム全体の上限】"
echo "PID最大値: $(cat /proc/sys/kernel/pid_max)"
echo "スレッド最大値: $(cat /proc/sys/kernel/threads-max)"
echo ""
# 現在のプロセス数
echo "【現在のプロセス数】"
TOTAL=$(ps aux | wc -l)
echo "合計: $TOTAL プロセス"
echo ""
# ユーザーごとの上限
echo "【現在のユーザーの上限】"
echo "max user processes: $(ulimit -u)"
MY_PROCS=$(ps -u $(whoami) | wc -l)
echo "現在使用中: $MY_PROCS プロセス"
echo ""
# ユーザー別プロセス数TOP5
echo "【ユーザー別プロセス数 TOP5】"
ps aux | awk '{print $1}' | sort | uniq -c | sort -rn | head -5
echo ""
# 使用率の計算
LIMIT=$(ulimit -u)
USAGE=$((MY_PROCS * 100 / LIMIT))
echo "【使用率】"
echo "${USAGE}% (${MY_PROCS}/${LIMIT})"
if [ $USAGE -gt 80 ]; then
echo "⚠️ 警告: 使用率が80%を超えています"
fi
実行方法
chmod +x check_process_limit.sh
./check_process_limit.sh
まとめ:プロセス上限を正しく管理しよう
プロセス上限の確認と管理について、詳しく解説してきました。
この記事のポイント
- プロセス上限にはシステム全体とユーザーごとの上限がある
- ulimit -u でユーザーの上限を確認
- cat /proc/sys/kernel/pid_max でシステムの上限を確認
- limits.confで永続的な変更が可能
- systemdサービスには個別の制限を設定できる
- 上限に達するとforkエラーが発生
- 定期的な監視と適切な設定が重要
プロセス上限は、システムの安定性を保つための重要な仕組みです。
適切に設定し、定期的に監視することで、突然のトラブルを防げます。
管理のベストプラクティス
- 定期的にプロセス数をチェック
- アラートを設定して異常を早期発見
- 用途に応じて適切な上限を設定
- ログを取って傾向を分析
この知識を活かして、安定したシステム運用を実現してくださいね!
コメント