脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

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


パルスのファルシのルシがパージでコクーンなまとめ

書き込み処理はいったんメモリにdirtyメモリとして保存されて、vm.dirty_background_ratioの割合を超えるか、vm.dirty_expire_centisecsの時間が経過するとpdflushが実行されてwrite back処理によって物理ディスクに書き込まれるが、書き込み処理が終わる前に次のpdflushが実行されても、前回の書き込みが終了するまでは待たなければいけない。
これをI/O waitとITの民は言う。

要は順番待ちのことです。