2012年8月2日木曜日

loadaverage(ロードアベレージ)に加算されるプロセス、スレッドの確認方法


ロードアベレージは実行中および実行待ちのプロセス、スレッドの数を集計した数値である。
サーバのリソースが許容できる数値であればいいのだが、
CPUかIOがボトルネックになり処理待ちになっているのであれば対処を検討する必要がある。


目的
①、②を特定することを目的とする。

① ボトルネックがCPUにあるにか、IOにあるのかの切り分け

② どのプロセス、スレッドが高騰させる原因を作っているのかの確認、見方の説明



コマンドから現在のロードアベレージの確認
ロードアベレージを確認するコマンドは複数ある。
$ w
もしくは
$ uptime
(略)
load average: 35.58, 36.44, 34.07

ロードアベレージが35を超えているが、CPU起因か、IOに原因があるかは分からない。
※左から1分、5分、15分間の平均値で表示される。



ボトルネックの確認
CPU起因か、IOが原因なのかを切り分ける。
$ vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2 33    868  33356 258848 7803920    0    0     3     4    0    0  6  1 77 17  0


r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.


rはrun状態になっているか、run状態になる事が可能でCPU待ちの状態になっているかのどちらかである。
すべてcpu待ちにあるわけではなく、 現在running中のプロセス数も含まれることに注意が必要である。

bはdiskのI/O完了待ちになっているプロセス数である。

このシステムではIOがボトルネックになっている可能性が高い。
※当然各サーバのスペックを考慮して判断する必要がある。

ただしここからではどのプロセス、スレッドなのか確認できない。



loadaverage(ロードアベレージ)に加算されるプロセス、スレッドの確認方法
psコマンドのSTATの状態から判断する。

$ ps aux -L | egrep -w "R.|D." | grep -v grep | wc -l
35

loadaverage数と合致する。

$ ps aux -L | egrep -w "R.|D." | grep -v grep 
USER     PID   LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user   23590 12570  0.0 3046 14.9 2281140 1839224 ?     Dl   Jul24   3:01 application
user   23590 27141  0.0 3046 14.9 2281140 1839224 ?     Dl   Jul24   3:14 application
user   23590 18818  0.0 3046 14.9 2281140 1839156 ?     Dl   Jul24   2:36 application
user   23590 20815  0.0 3046 14.9 2281140 1839132 ?     Dl   Jul26   1:20 application
user   23590 10288  0.0 3045 14.8 2281140 1825828 ?     Rl   Jul24   2:03 application
user   23590  9952  0.3 3045 14.8 2281140 1825824 ?     Rl   12:15   1:01 application
(略)


D    Uninterruptible sleep (usually IO)
R    Running or runnable (on run queue)
S    Interruptible sleep (waiting for an event to complete)
T    Stopped, either by a job control signal or because it is being traced.
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    Defunct ("zombie") process, terminated but not reaped by its parent.

<    high-priority (not nice to other users)
N    low-priority (nice to other users)
L    has pages locked into memory (for real-time and custom IO)
s    is a session leader
l    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+    is in the foreground process group


RとDはvmstatのrとbと同じ意味である。
STATがSであればサーバとしては問題ない。



 その他
プロセスの挙動を調べるにあたり、
pidstatperfコマンドも有効に活用できる。