ターミナルでプロセス上限を確認する完全ガイド

Linux

サーバーを運用していると、突然「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エラーが発生
  • 定期的な監視と適切な設定が重要

プロセス上限は、システムの安定性を保つための重要な仕組みです。

適切に設定し、定期的に監視することで、突然のトラブルを防げます。

管理のベストプラクティス

  • 定期的にプロセス数をチェック
  • アラートを設定して異常を早期発見
  • 用途に応じて適切な上限を設定
  • ログを取って傾向を分析

この知識を活かして、安定したシステム運用を実現してくださいね!

コメント

タイトルとURLをコピーしました