トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Linux、i/o待ちしているプロセスを見極める

[カテゴリ:Linux]

i/o待ちしているプロセスを見極める(ことができたらいいな)

事のはじまり。

vmstat 1 して、ボ〜っと眺めてると

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  1     44  21620 140900 487244    0    0     0   444  270  195  0  0 95  5

procs の b が「割り込みを禁止しているプロセスの数」で
これは 0 が望ましいわけですが。

0以外になったとき「誰が犯人だ!」と思うのです。

犯人探し

多分手抜きです。

ps で出力される STAT が D のプロセスが io待ち のプロセスである。

ということで、1秒周期で D のプロセスを出力するスクリプトがこれ。
(while true; do (ps ax | awk 'BEGIN { FS=" "; } $3~/D/ { "date \"+%Y/%m/%d %H:%M:%S\"" | getline dt; print dt " :: " $0; }'); sleep 1; done)

これに&をつけてバックグラウンドで実行のうえ、

vmstat 1

とかすると、

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0     44  28128 133388 490844    0    0     0     0  263  185  0  0 100  0
 3  0     44  28128 133388 490844    0    0     0     0  258  264  3  0 96  0
 0  0     44  28128 133388 490844    0    0     0     0  301 1133 11  3 86  0
 0  0     44  28156 133388 490844    0    0     0     0  257  169  1  0 100  0
 0  0     44  28156 133388 490844    0    0     0     0  268  187  0  0 99  0
 1  0     44  28156 133388 490848    0    0     0     0  254  171  0  0 99  0
 0  0     44  28156 133388 490848    0    0     0     0  253  166  0  0 100  0
 0  0     44  28128 133388 490848    0    0     0     0  270  262  4  0 95  0
 0  0     44  28004 133388 490848    0    0     0     0  253  165  0  0 100  0
 1  1     44  28004 133388 490880    0    0    32     0  260  229  7  1 85  7
2007/10/01 10:57:43 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  28004 133388 490880    0    0     0     0  256  148  0  0 50 50
2007/10/01 10:57:44 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27880 133388 490884    0    0     0     0  266  161  0  0 50 50
2007/10/01 10:57:45 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27756 133388 490884    0    0     0     0  256  168  0  0 50 50
2007/10/01 10:57:46 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27756 133388 490884    0    0     0     0  257  175  0  1 50 50
2007/10/01 10:57:47 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27756 133388 490884    0    0     0     0  256  175  0  0 50 50
2007/10/01 10:57:48 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27748 133388 490884    0    0     0     0  267  185  0  0 50 50
2007/10/01 10:57:49 ::  3082 ?        D      2:14 /usr/sbin/apache2 -k start
 0  1     44  27748 133388 490884    0    0     0     0  256  169  0  0 50 50
 0  0     44  27688 133388 490908    0    0    20     0  269  341  8  1 83  9
 0  0     44  27688 133388 490908    0    0     0     0  254  167  1  0 99  0
 0  1     44  27688 133388 490908    0    0     0  1548  348  176  0  0 58 42
 1  1     44  27688 133388 490908    0    0     0     8  317  180  0  0 32 67
2007/10/01 10:57:54 ::  1024 ?        D<     0:03 [reiserfs/0]
2007/10/01 10:57:54 :: 22770 ?        D      0:00 [pdflush]
2007/10/01 10:57:54 :: 24923 pts/0    D      0:00 awk BEGIN { FS=" "; } $3~/D/ { "date \"+%Y/%m/%d %H:%M:%S\"" | getline dt; print dt " :: " $0; }
 0  0     44  27564 133388 490908    0    0     0     4  260  164  0  0 100  0
 0  0     44  27588 133388 490908    0    0     0     0  264  174  0  0 100  0
 0  0     44  27588 133388 490908    0    0     0     0  255  165  0  0 99  0

となる。

監視スクリプト自身がネックになってるのはあまりよろしくないな(汗

ということで、専用スクリプト作ってみた。
Linux、割り込み不可能なスリープ状態の監視スクリプト

memo

$ man ps
 プ ロ セ ス の 状 態 コ ー ド
s, stat, state 出力指定子 (ヘッダ "STAT" または "S") がプロセス状態の説明のために表示する値を以下に示す。
D    割り込み不可能なスリープ状態 (通常 IO 中)
R    実行中または実行可能状態 (実行キューにある)
S    割り込み可能なスリープ状態 (イベントの完了を待っている)
T    ジョブ制御シグナルまたはトレースされているために停止中の状態
W    ページング状態 (2.6.xx カーネルからは無効)
X    死んだ状態 (見えるべきではない)
Z    終了したが、親プロセスによって回収されなかった、消滅した (ゾンビ) プロセス

BSD 形式で stat キーワードが用いられたときは、以下の添付文字が表示されることがある。
<    優先度の高いプロセス (他のユーザーに対して良くない)
N    優先度の低いプロセス (他のユーザーに対して良い)
L    実メモリのページをロックして利用している (リアルタイム処理やカスタム IO 向け)
s    セッションリーダ
l    マルチスレッド化されている (NPTL pthreads が行うように、CLONE_THREAD が使われている)
+    フォアグラウンドのプロセスグループに含まれている

最終更新時間:2007年10月03日 15時22分00秒