テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(writeboost report) 再設計と実装を終了した

本気で疲れた. 憔悴している. 会社?休んだ.

今日の残りは, ドキュメンテーションと, コミュニティへの報告に使う.

writeboostはカーネル内に, 6つのデーモンを持つ. writeboostは, ファイルシステムからのライトをRAMバッファに格納し, これをFlushタスクとしてリストに繋ぐforegroundの処理と, その他さまざまなbackground処理によって成るアートである.

ドキュメンテーションのために一度整理する.

  • Flush Daemon は, リストに繋がれたFlushタスク(RAMバッファのデータを持つ)を一つずつ取り出し, キャッシュデバイスに書き出す. もしそのFlushタスクがbarrierを持っていた場合, 永続化処理も行う.
  • Deferred ACK for barrier writes : writeboostでは, REQ_FUA, REQ_FLUSHなどの永続化要求は遅延される. 受け取ってるごとに実行するのは, その都度RAMバッファの吐き出しを必要とするためオーバーヘッドが大きいからである. barrier_deadline_msは, RAMバッファに置かれたこれらの要求をFlushタスクとしてリストに繋ぐための最悪時間である(default: 3ms). write量が十分である場合, RAMバッファは適度に吐かれるため, このデッドライン処理に至ることはない. 実装上は, timerとの連携によって行われている (timerがworkerをスケジュールする).
  • Migration Daemon は, キャッシュデバイスに書き込まれたデータをライトバックする. allow_migrateがtrueの時には, ライトバックが逼迫でない場合にもライトバックを行う. 逼迫とは, キャッシュデバイスにもう残り領域がなく, Flush Daemonがブロックされてしまっている状況である. nr_batched_migrationは, 複数セグメントのライトバックをアトミックにバッチ処理する. これによって, 時間的に本来ならマージされなようなライトデータが, エレベータでマージされる可能性がある. writeboostは, I/Oスケジューラの概念を飛躍させるものでもある(時間的近傍の一軸に, キャッシュデバイス上で空間的近傍という軸も追加する).
  • Migration Modulator*1 は, backing storeの負荷によって, 前記allow_migrateをon-offする. backing storeの負荷が高い時にはライトバックしない方が良い. この動作を1秒ごとに行う. enable_migration_modulatorが1であればON, 0であればOFF.
  • Superblock Recorder : キャッシュ上に「どこまでライトバックしたか」をメモっておくことで, 再起動時のin-coreデータ復元を省くことが出来る. ライトバック済のデータは復元しなくて良いからである. update_record_intervalによって, このsuperblock recordを更新するインターバルを調整することが出来る(default: 60秒).
  • Cache Synchronizer は, 全dirtyデータの永続化を強制的に行う. ブロックデバイスがbioのフラグを正しく処理していればこのデーモンは必要ないが, この保証は, filesystemやアプリケーションが正しく実装していることを前提とする. 従って, 強制的に永続化してしまう機能は, 安全な運用のために必要である. sync_intervalによってインターバルを調整することが出来る(default: 60秒).

*1:日本語名 マイグレーション調整野郎