Skip to content

Instantly share code, notes, and snippets.

@akiradeveloper
Created April 26, 2014 11:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akiradeveloper/11317774 to your computer and use it in GitHub Desktop.
Save akiradeveloper/11317774 to your computer and use it in GitHub Desktop.
dm-writeboost doc (ja) v1  半分書きました. 分かりにくい表現があれば, 指摘お願いします.
dm-writeboost
=============
dm-writeboostターゲットはブロックレベルのログ構造化キャッシングを提供する.
dm-writeboostは, 受け取ったランダムライトを巨大なログにまとめ, キャッシュデバイスへのシーケンシャルライトを行う.
Mechanism
=========
Basic Mechanism
---------------
dm-writeboostは,
RAMバッファ,
キャッシュデバイス(例: SSD),
backingデバイス(例: HDD)
の三層をコントロールする.
ライトデータはまず, RAMバッファに格納され, それが一杯になると, メタデータを書き足してログを作成し,
キャッシュデバイスへとシーケンシャルライトする.
その後, キャッシュデバイス上のダーティデータは, backingデバイスへとマイグレーション(or ライトバック)される.
Persistent Logging
------------------
dm-writeboostは, writeboost typeによってその機能を拡張することが出来る.
type 0では, Basic Mechanismのみが提供される.
そして, type 1では, Persistent Loggingが提供される.
この機能拡張は, ライトをRAMバッファ以外に, 永続的なメディアにも書くことにより,
永続化処理(例: フラッシュ処理)におけるペナルティを軽減させる狙いを持つ.
この機能はファイルシステムにおけるフルデータジャーナリング相当のものである.
Log Replay
----------
再起動時, dm-writeboostは, キャッシュデバイス上に書かれたログをリプレイし, メタデータを復元する.
ログは時系列順に書かれているため, これをキャッシュデバイスへの書き込みの他にアーカイブしておくことにより,
任意の状態を復元することも原理的には可能である.
Processings
===========
dm-writeboostは, 1つのforeground処理と6つのbackground処理によって構成される.
Foreground
----------
bioを受け取り, キャッシュhit/missに応じた処理を行う.
ライトデータはRAMバッファに格納する.
RAMバッファが一杯になった時, ログを作成し, Queueにflush jobとして格納する.
Background
----------
(1) Writeboost Flusher (wbflusher)
flush jobを処理する.
flush jobに格納されたログをキャッシュデバイスに対してシーケンシャルライトする.
(2) Migrate Daemon
キャッシュデバイス上のダーティデータをbackingデバイスにマイグレートする.
もし, `allow_migrate`がtrueであれば, 差し迫った状況でなければマイグレートしない.
ここで, 差し迫った状況とは, マイグレートしてクリーンなセグメントを作らなければ,
ジャーナルをこれ以上書くことが出来ない状況のことである.
dm-writeboostはマイグレーションについて2つの手法によって性能最適化を図る.
- マイグレーションは複数のセグメントに対してバッチ的に行われる.
`nr_max_batched_migration`は, 一回にマイグレートする最大のセグメント数である.
- マイグレートされるデータは, マイグレート先のLBAによって昇順にソートされる.
(3) Migration Modulator
backingデバイスの負荷が高い時にはマイグレーションを抑制すべきである.
このデーモンは, backingデバイスの負荷を監視し,
高負荷時には`allow_migrate`をfalseにすることでマイグレーションを抑制する.
このデーモンは, `enable_migartion_modulator`がtrueの時に有効になり,
負荷のスレッショルドは`migrate_threshold`によって指定出来る.
(4) Superblock Recorder
このデーモンはSuperblockに, どのセグメントIDまでマイグレートしたかなど
を一定のタイミング(`update_record_interval`で指定)で書く.
Log Replay時に処理を省く効果がある.
(5) Sync Daemon
RAMバッファ上のデータは, 電断時に消失してしまう. また, キャッシュデバイズがRAMキャッシュを持っている場合,
ここにあるデータも, 電断時には保証されない.
このデーモンは, 一定のタイミング(`sync_interval`で指定)でこれらのデータを永続化する.
(6) Barrier Deadline (type 0のみ有効)
Persistent Loggingがない場合, ダーティデータの永続化処理はペナルティが高い.
このペナルティを軽減させるため, 永続化命令へのACKを
最大で`barrier_deadline_ms`(ms)のみ遅延させる最適化を行っている.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment