ps コマンドの使用法

ps コマンドは、システム上で実行中のプログラムと、 プログラムで使用しているリソースの識別のための柔軟なツールです。 システム上のプロセスに関する統計と状況情報 (プロセス ID、スレッド ID、入出力アクティビティー、CPU、メモリー使用率など) が表示されます。

このセクションでは、CPU に関係のあるオプションと出力フィールドについてのみ説明します。

可能な ps 出力欄は 3 つあり、それぞれ異なる方式で CPU 使用量を報告します。

値:
C
そのプロセスで一番最近使用された CPU 時間 (クロックの目盛り単位)。
TIME
プロセスが始動以来使用した合計 CPU 時間 (分と秒単位)。
%CPU
プロセスが始動以来使用した合計 CPU 時間を、 プロセス始動以来の経過時間で割った値。 この時間はプログラムの CPU 依存度を測る尺度です。

CPU 集中

次のシェル・スクリプト、
# ps -ef | egrep -v "STIME|$LOGNAME" | sort +3 -r | head -n 15
は、システム内で最近 CPU を最も多く使用した CPU 集中ユーザー・プロセスを示すツールです (ヘッダー行は分かりやすくするためにあらためて付け加えてあります)。
     UID   PID  PPID   C    STIME    TTY  TIME CMD
    mary 45742 54702 120 15:19:05 pts/29  0:02 ./looper
    root 52122     1  11 15:32:33 pts/31 58:39 xhogger
    root  4250     1   3 15:32:33 pts/31 26:03 xmconsole allcon
    root 38812  4250   1 15:32:34 pts/31  8:58 xmconstats 0 3 30
    root 27036  6864   1 15:18:35      -  0:00 rlogind
    root 47418 25926   0 17:04:26      -  0:00 coelogin <d29dbms:0>
    bick 37652 43538   0 16:58:40  pts/4  0:00 /bin/ksh
    bick 43538     1   0 16:58:38      -  0:07 aixterm
     luc 60062 27036   0 15:18:35 pts/18  0:00 -ksh

C 欄は最近使用された CPU を示します。ループするプログラムのプロセスは、リストの先頭に来ます。 スケジューラーが 120 でカウントを停止するので、ループするプロセスの CPU 使用量を C の値により最小化できます。マルチスレッド・プロセスの場合、このフィールドはそのプロセス内のすべてのスレッドについてリストされた CP の和を示します。

次の例は、すべてのスレッドが 1 つの無限ループ・プログラム内にある単純な 5 スレッドのプログラムを示しています。
ps -lmo THREAD -p 8060956
    USER     PID    PPID       TID ST  CP PRI SC    WCHAN        F     TT BND COMMAND
    root 8060956 6815882         - A  720 120  0        -   200001  pts/0   - ./a.out
       -       -       -   8716483 R  120 120  0        -   400000      -   - -
       -       -       -  17105017 R  120 120  0        -   400000      -   - -
       -       -       -  24182849 R  120 120  0        -   400000      -   - -
       -       -       -  24510589 R  120 120  0        -   400000      -   - -
       -       -       -  30277829 R  120 120  0        -   400000      -   - -
       -       -       -  35913767 R  120 120  0        -   400000      -   - -
「CP」欄の値 720 は、この値の下にリストされた個別スレッドの和、すなわち (5 * 120) + (120) です。

CPU 時間比率

ps コマンドは、周期的に実行されて、「TIME」欄の下に CPU 時間を表示し、 「%CPU」欄の下に CPU 時間のリアルタイムに対する比率を表示します。 使用率が最高のプロセスを探してください。 au オプションと v オプションは、 ユーザー・プロセスに関して類似した情報を表示します。 aux オプションと vg オプションは、 ユーザー・プロセスとシステム・プロセスの両方を表示します。

次の例は、4-way SMP システムからとったものです。
# ps au
USER       PID %CPU %MEM   SZ  RSS    TTY STAT    STIME TIME COMMAND
root     19048 24.6  0.0   28   44  pts/1 A    13:53:00  2:16 /tmp/cpubound
root     19388  0.0  0.0  372  460  pts/1 A      Feb 20  0:02 -ksh
root     15348  0.0  0.0  372  460  pts/4 A      Feb 20  0:01 -ksh
root     20418  0.0  0.0  368  452  pts/3 A      Feb 20  0:01 -ksh
root     16178  0.0  0.0  292  364      0 A      Feb 19  0:00 /usr/sbin/getty
root     16780  0.0  0.0  364  392  pts/2 A      Feb 19  0:00 -ksh
root     18516  0.0  0.0  360  412  pts/0 A      Feb 20  0:00 -ksh
root     15746  0.0  0.0  212  268  pts/1 A    13:55:18  0:00 ps au
%CPU」は、プロセスが始動されて以来、そのプロセスに割り当てられた CPU 時間のパーセンテージです。 次の式で算出します。
(process CPU time / process duration) * 100

次のような 2 つのプロセスを想像してください。最初のプロセスは始動して 5 秒間実行しますが、終了しません。その後に 2 番目のプロセスが始動して 5 秒間実行しますが、終了しません。 この場合、ps コマンドは最初のプロセスに 50% の「%CPU」(10 秒の経過時間に対して 5 秒の CPU) を示し、2 番目のプロセスには 100% (5 秒の経過時間に対して 5 秒の CPU) を示します。

SMP の場合、この値はシステム上で使用可能な CPU の数で割ります。 もう一度前の例を見てください。この例は 4-Way プロセッサー・システムで実行していて、cpubound の処理の %CPU 値が絶対に 25 を超えないのはそのためだと分かります。 cpubound プロセスは 1 つのプロセッサーを 100% 使用していますが、「%CPU」は使用可能な CPU の数で割ります。

THREAD オプション

ps コマンドは、ps -mo THREAD コマンドを使用することによって、 スレッドおよびスレッドかプロセスがバインドされている CPU を表示することができます。 次に例を示します。
# ps -mo THREAD
USER PID   PPID  TID   ST CP PRI SC WCHAN F      TT    BND COMMAND
root 20918 20660 -     A  0  60  1  -     240001 pts/1 -   -ksh
-    -     -     20005 S  0  60  1  -     400    -     -   -

TID」欄はスレッド ID を、 「BND」欄はプロセッサーにバインドされたプロセスおよびスレッドを示しています。

kproc (AIX オペレーティング・システム バージョン 4 では PID が 516) が CPU 時間を使用しているのは正常です。 タイム・スライス中に実行できるスレッドがない場合、 スケジューラーがそのタイム・スライスの CPU 時間をこのカーネル・プロセス (kproc) に割り当てます。これはアイドル または待ち kproc と呼ばれています。 SMP システムでは、プロセッサーごとにアイドルの kproc が 1 つずつあります。

ps コマンドについて詳しくは、 コマンド・リファレンスを参照してください。