I/O waitが発生する原理(dirtyメモリ、write back)
I/O waitにはdirtyメモリとwrite back処理(pdflush)が深く関係しています。
書き込み処理
低負荷時
書き込み処理(見かけ上の書き込み処理)
↓
dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)
↓
5秒に一度dirtyメモリを読み取って実際に物理ディスクに書き込む(write back処理=実際の書き込み処理)
⇒これがI/O 処理の開始である。
中程度負荷時
書き込み処理(見かけ上の書き込み処理)
↓
dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)
↓
dirtyメモリがある一定サイズに達した時点で、(5秒待たずに)I/O処理を開始して実際に物理ディスクに書き込む(write back処理)
高負荷時/過負荷時
書き込み処理(見かけ上の書き込み処理)
↓
dirtyフラグと一緒に随時メモリに書き込まれる(dirtyメモリ)
↓
dirtyメモリがある一定サイズに達した時点で、(5秒待たずに)I/O処理を開始して実際に物理ディスクに書き込む(write back処理)
↓
物理ディスクへの書き込み処理が完了する前に再び次のdirtyメモリが一定数に達してしまう。
↓
前のディスクへの書き込み処理が完了していないので、dirtyメモリが一定数になってもディスクへの書き込みが開始されず、前回のwrite back処理の終了を待たなければいけない
⇒これをI/Owaitという
各項目の設定値
これらのI/O waitに関する設定値はOSレベルで確認・変更することが出来る
vm.dirty_background_ratio
メモリ上のdirtyメモリが占める割合(%)。
この値を超えるとpdflushが呼び出され、write back処理がが行われる。
但し、このwrite back処理は優先度の低いバックグラウンドプロセスとして実行される。
デフォルト値は10%。単位は%
/sbin/sysctl vm.dirty_background_ratio
# ==> vm.dirty_background_ratio = 10
vm.dirty_ratio
vm.dirty_backgroup_ratioとほぼ同じだが、この値を超えた場合は、write back処理が優先度の高いフォアグラウンドプロセスとして実行される
デフォルト値は20%。単位は%
/sbin/sysctl vm.dirty_ratio
# ==> vm.dirty_ratio = 20
vm.dirty_expire_centisecs
メモリ上に存在しているdirtyメモリの存在時間。
この値を過ぎた場合にwrite back処理が実行される
デフォルト値は3000(30秒)単位は1/100秒
/sbin/sysctl vm.dirty_expire_centisecs
# ==> vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs
pdflushデーモンが起動する間隔。
この間隔でdirtyメモリのデータが物理ディスクに書き込まれる
デフォルト値は500(5秒)。単位は1/100秒
/sbin/sysctl vm.dirty_writeback_centisecs
# ==> vm.dirty_writeback_centisecs = 500