はじめに
みなさま、psコマンドは活用されてますでしょうか。
実行されているプロセスを確認するコマンドです。サーバーの運用保守に携わっていると、このコマンドを実行しない日はないと思います。
私がエンジニア一年目の技術研修では、ps -ef で、プロセスを確認すると教えてもらいました。これでも、実行されているプロセスを確認するという意味では充分です。
ただし、これまでの経験から、現在では、ps auxwwf で確認することにしています。
オプションの違いによる、表示される情報の違いを紹介します。
環境
OS : AlmaLinux 8
psバージョン : 3.3.15
使い方
psコマンドは歴史的?な経緯から、オプションの指定方法が3パターン存在します。
UNIXオプション | オプションの前にダッシュ[-]を付ける |
BSDオプション | オプションの前にダッシュ[-]を付けない |
GUNオプション | 2つのダッシュ[-]で始まる |
ということで、私がいつも実行している ps auxwwf はBSDオプションを活用しているってことなんですかね。
各オプションの説明は以下となります。
a | ターミナル (tty) を持つすべてのプロセスを示する |
u | ユーザー指向のフォーマットを表示する |
x | ターミナル (tty) を持たないプロセスも表示する |
w | 幅を広く表示する(2回指定することで幅を無限に) |
f | 階層表示 |
オプションを指定せずに実行するとこんな感じです。
$ ps
PID TTY TIME CMD
3071190 pts/0 00:00:00 bash
3081127 pts/0 00:00:00 ps
$
では、各オプションの表示内容を確認していきましょう。
$ ps a
PID TTY STAT TIME COMMAND
1443 tty1 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
3071190 pts/0 Ss 0:00 -bash
3081128 pts/0 R+ 0:00 ps a
$
a を指定すると、ターミナル(tty)を持つプロセスが表示されます。
$ ps au
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1443 0.0 0.0 6916 632 tty1 Ss+ 2023 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
hogehoge 3071190 0.0 0.2 16416 5060 pts/0 Ss 10:20 0:00 -bash
hogehoge 3081131 0.0 0.2 47632 3784 pts/0 R+ 14:40 0:00 ps au
$
u を指定すると、ユーザー指向のフォーマットになって、CPUやメモリの使用率、プロセスの状態および開始時間などの情報が追加されます。
$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 238852 5924 ? Ss 2023 389:22 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
root 2 0.0 0.0 0 0 ? S 2023 1:04 [kthreadd]
root 3 0.0 0.0 0 0 ? I< 2023 0:00 [rcu_gp]
root 4 0.0 0.0 0 0 ? I< 2023 0:00 [rcu_par_gp]
root 6 0.0 0.0 0 0 ? I< 2023 0:00 [kworker/0:0H-events_highpri]
root 9 0.0 0.0 0 0 ? I< 2023 0:00 [mm_percpu_wq]
root 10 0.0 0.0 0 0 ? S 2023 0:00 [rcu_tasks_rude_]
root 11 0.0 0.0 0 0 ? S 2023 0:00 [rcu_tasks_trace]
root 12 0.0 0.0 0 0 ? S 2023 46:56 [ksoftirqd/0]
~ 省略 ~
$
プロセスの状態に関する説明は以下のとおりです。
D | 割り込み不可スリープ |
I | アイドル状態のカーネルスレッド |
R | 実行中または実行可能(実行キュー上) |
S | 割り込み可能スリープ(イベントの完了を待機中) |
T | ジョブ制御信号によって停止 |
t | トレース中にデバッガによって停止 |
W | ページング(2.6.xxカーネル以降では無効) |
X | デッド(表示されることはないはず) |
Z | 機能停止「ゾンビ」プロセス |
追加情報として下記の値が存在します。
< | 高優先度 |
N | 低優先度 |
L | メモリにロックされたページがある |
s | セッションリーダー |
l | マルチスレッド・プロセス |
+ | フォアグラウンド・プロセス |
すべての状態を理解しているわけではないですが、各プロセスの状況を確認する上で、有益な情報になると思います。
残りのオプション、w は表示幅を広げるためのオプションで、f は親プロセス、子プロセスを階層で表示させることができます。
$ ps auxwwf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2 0.0 0.0 0 0 ? S 2023 1:04 [kthreadd]
~ 省略 ~
root 1053 0.0 0.1 457120 2824 ? Ss 2023 140:48 php-fpm: master process (/etc/php-fpm.conf)
apache 1219 0.0 0.0 473320 388 ? S 2023 0:00 \_ php-fpm: pool apache
apache 1220 0.0 0.0 473320 388 ? S 2023 0:00 \_ php-fpm: pool apache
apache 1221 0.0 0.0 473320 388 ? S 2023 0:00 \_ php-fpm: pool apache
apache 1223 0.0 0.0 473320 388 ? S 2023 0:00 \_ php-fpm: pool apache
apache 1225 0.0 0.0 473320 388 ? S 2023 0:00 \_ php-fpm: pool apache
~ 省略 ~
$
実行されているコマンドの値の文字数が多いと途中できれることがありますので、wを2回指定することで、全ての内容を表示させることができます。(具体的な表示例を提示できず申し訳ありません。)
まとめ
いかがでしたか?
サーバーのレスポンスが悪いといった場合は、以前紹介したtopコマンドを利用するケースが多いかもしれません。でも、
高負荷の要因となっているプロセスが特定できた後、該当プロセスの親プロセスを特定するために、psコマンドが重宝しています。
今回紹介したのはほんの一部ですので、詳細についてはmanコマンドで確認いただき、さまざまなオプションを活用いただければと思います。