IO待ちメモ

## 概要
IO待ちについて自分で調べた自分めも。

## vmstat wa列
[絵で見てわかるシステムパフォーマンスの仕組み ](https://www.amazon.co.jp/%E7%B5%B5%E3%81%A7%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AE%E4%BB%95%E7%B5%84%E3%81%BF-%E5%B0%8F%E7%94%B0-%E5%9C%AD%E4%BA%8C-ebook/dp/B00LHFOTF4/ref=sr_1_2?ie=UTF8&qid=1491439593&sr=8-2&keywords=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9)より
>    - ディスクIO待ちのwaはCPU使用率が上がると自然と減ってしまうものです。I/O待ちについてはb列を活用しましょう。
   - waはあくまでもCPUがアイドルであり、そのCPUに紐付くI/O待ちスレッドがあるときにカウントされる
   - wa列は要注意です。一般にI/O待ちの指標と思われていますが、I/O待ちが増えるとwa列が上がる傾向があるものの、必ずしも上がるとは限らない情報だからです

[絵で見てわかるOS/ストレージ/ネットワーク~データベースはこう使っている (DB Magazine Selection)](https://www.amazon.co.jp/%E7%B5%B5%E3%81%A7%E8%A6%8B%E3%81%A6%E3%82%8F%E3%81%8B%E3%82%8BOS-%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AF%E3%81%93%E3%81%86%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B-Magazine-Selection/dp/479811703X/ref=sr_1_1?s=books&ie=UTF8&qid=1491445240&sr=1-1&keywords=OS%E3%80%80%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%80%80%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF) より
>スリープしているプロセスの中には、I/O待ちをしているものもある。その場合、「wa(waitI/O)」として現れることが多い。多くのOSでは、CPUがアイドル(id)であり、かつそのCPUから発行されたI/Oがある場合、「wa(waitI/O)」となる

*[ iowait について](http://d.hatena.ne.jp/yohei-a/20120201/1328108666) より
>システムコール発行したらコンテキストスイッチが発生してスリープし、TASK_UNINTERRUPTIBLE で Disk Sleep する。CPU が空いてるのに、I/O要求が残っている場合に iowait としてカウントされるということだと思う。

[プロセスアカウンティング処理を見てみる](http://qiita.com/saikoro-steak/items/30cc061804326c72e9e9)

この辺りの説明でカバーできていそう。たぶん。
↓
>R(TASK_RUNNING)が多い場合、D(TASK_UNINTERRUPTIB)プロセスがたくさん存在していてもwaには反映されない。なのでIO待ちの具合を調べるのはb列を確認するのが確実そう。
I/O wait時間の統計
カレントプロセスがswapperプロセスの場合に(TASK_RUNNNINGなプロセスが存在しない場合)、IO待ちのプロセスが一つでも存在すればIOwait時間として足し込まれます。

## IO待ち時間
[詳解 システム・パフォーマンスより](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9-Brendan-Gregg/dp/4873117909/ref=sr_1_1?ie=UTF8&qid=1492663507&sr=8-1&keywords=%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9)
>I/O待ち時間は非常に誤解を招きやすい指標だ。CPUを酷使するプロセスがほかにやってくると、I/O待ち時間の値は下がる。するべき仕事ができたので、CPUはアイドル状態で待っていなくてよいのである。しかし、I/O待ち時間の数値が下がっても、同じディスクI/Oがなくなったわけでも、スレッドをブロックしなくなったわけでもない。逆もありうる。
LinuxではI/O待ち時間は今でもよく使われている指標であり、混乱を招く性質を持ちながら、あるタイプのディスクのボトルネック、つまりCPUがアイドルでディスクがビジーになっている状態を見つけ出すことができている。I/O待ち時間の一つの解釈方法は,I/O待ち時間が存在することをシステムにボトルネックがある兆候と捉え、例え高いCPU使用率とI/O待ち時間が両立している場合でも、I/O待ち時間を最小限に抑えるようにシステムをチューニングするというものである。



## IO待ち多数による影響
[ load average ってなんじゃい？](http://d.hatena.ne.jp/yohei-a/20100816/1281943286)より
>load average が高いと、CPU がなかなか割り当てられないので、「ターミナルエミュレータを使って ssh などでログインしてコマンドを打ってもレスポンスが帰ってくるのが遅い」というような状況になっているときだと思う。

>* TASK_RUNNING
    - 実行中もしくは実行可能でCPU割り当てを待っている状態。
    - vmstat で `r 列`に表示されるのがこの状態のプロセスの数。
* TASK_UNINTERRUPTIBLE
    - 割り込み不可能な待ち状態。ディスクI/O待ちなど短い事象。
    - vmstat で `b 列`に表示されるのがこの状態のプロセスの数。

ディスクI/O待ちなど`短い`事象。

[ [24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)](https://www.amazon.co.jp/24%E6%99%82%E9%96%93365%E6%97%A5-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3-%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9-%E7%9C%81%E5%8A%9B%E9%81%8B%E7%94%A8-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774135666/ref=sr_1_1?s=books&ie=UTF8&qid=1491444604&sr=1-1&keywords=%E3%82%B5%E3%83%BC%E3%83%90%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93) より
>ロードアベレージが報告する負荷の正体
* CPuの実行権限が与えられるのを待っているプロセス
* ディスクI/Oが完了するのを待っているプロセス

>これはたしかに、直感と一致します。
ディスクからデータを大量に読み出している間は、システムの反応がにぶくなったりします。

## まとめ
* CPU使用率(us+sy)が高いとwa列が低くてもIO待ち少ないとは言い切れなさそう。ただ、waの値が高い状態は、そのまま単純にIO待ちが多いということを表している。
* io待ちはvmstatの`b列`でみていくのもよさそう。waの値が低い場合にIO待ちは少ないとは言いきれないので。
* CPU使用率が高いプロセスがいると待ち行列が長くなる確率が高くなる。
* Load averageが高いとCPUがなかなか割り当てられない。
    - カーネルがプロセスをスケジューリング対象とするランキューには`TASK_RUNNING`しか存在せず、IO待ちプロセスは別のキューに存在するが、`TASK_UNINTERRUPTIBLE`状態が解除され、都度？ランキューに入り込んでくるので？その分のスケジューリング対象が増えCPUがなかなか割り当てられないことが増える？ので一見IO待ちが増えてもCPUはidleなのでシステムに負荷かかっていないように見えるが、LAが高いと(IO待ち含む)とCPUがなかなか割り当てられないので負荷がかかっているといえる？