Created
April 27, 2014 01:38
-
-
Save akiradeveloper/11335639 to your computer and use it in GitHub Desktop.
ライトブーストのドキュメントを日本語で書く(v2) 気づいた点あったら指摘お願いします
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
dm-writeboost | |
============= | |
dm-writeboostターゲットはブロックレベルのログ構造化キャッシングを提供する. | |
dm-writeboostは, 受け取ったランダムライトを巨大なログにまとめ, キャッシュデバイスへのシーケンシャルライトを行う. | |
Mechanism | |
========= | |
Basic Mechanism | |
--------------- | |
dm-writeboostは, | |
RAMバッファ, | |
キャッシュデバイス (例: SSD), | |
backingデバイス (例: HDD) | |
の三層を制御する. | |
ライトデータはまず, RAMバッファに格納され, それが一杯になると, メタデータを書き足してログを作成し, | |
キャッシュデバイスへとシーケンシャルライトする. | |
その後, キャッシュデバイス上のダーティデータは, backingデバイスへとマイグレーション(or ライトバック)される. | |
Persistent Logging | |
------------------ | |
dm-writeboostは, 初期化時に指定するtypeによってその機能を拡張することが出来る. | |
type 0では, Basic Mechanismのみが提供される. | |
そして, type 1では, Persistent Loggingが提供される. | |
この機能拡張は, ライトデータをRAMバッファ以外に, 永続的なメディア(plog)にも書くことにより, | |
永続化処理(例: フラッシュ処理)におけるペナルティを軽減させる狙いを持つ. | |
この機能はファイルシステムにおけるフルデータジャーナリング相当のものである. | |
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_migration_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)のみ遅延させる最適化を行っている. | |
ターゲットインターフェイス | |
====================== | |
すべての操作は, dmsetupコマンドによって行う. | |
初期化(コンストラクタ) | |
------------------- | |
<type> | |
<essential args>* | |
<#optional args> <optional args>* | |
<#tunable args> <tunable args>* | |
<type>については, 'Mechanism'参照 | |
<essential args>は, <type>によって異なる. | |
type 0 (すべての<type>に共通): | |
<essential args> | |
backing_dev: オリジナルのデータがあるブロックデバイス (例: HDD) | |
cache_dev: キャッシュとして利用するブロックデバイス (例: SSD) | |
<optional_args> | |
segment_size_order: RAM bufferのサイズを決める. | |
RAM bufferのサイズは, 1 << n(セクタ)となる. | |
4 <= n <= 10 | |
default 10 | |
nr_rambuf_pool : 確保されるRAM bufferの枚数 | |
default 8 | |
<tunable args> | |
'メッセージ'を参照 | |
例: | |
dmsetup create writeboost-vol --table "0 $sz writeboost 0 $BACKING $CACHE" | |
dmsetup create writeboost-vol --table "0 $sz writeboost 0 $BACKING $CACHE \ | |
4 nr_rambuf_pool 32 segment_size_order 8 \ | |
2 allow_migrate 1" | |
dmsetup create writeboost-vol --table "0 $sz writeboost 0 $BACKING $CACHE \ | |
0 \ | |
2 allow_migrate 1" | |
type 1: | |
<essential args> | |
backing_dev | |
cache_dev | |
plog_dev_desc : plogデバイスを特定するための文字列 | |
例: | |
dmsetup create writeboost-vol --table "0 $sz 0 writeboost 1 $BACKING $CACHE $PLOG" | |
初期化(フォーマット) | |
----------------- | |
キャッシュデバイスやplogデバイスは, | |
最初の1セクタ(512バイト)がゼロ埋めされている場合に, コンストラクタ以下でリフォーマットされる. | |
メッセージ | |
--------- | |
dm-writeboostデバイスの挙動は, 実行時に変更することが可能である. | |
設定は, dmsetup messageを利用する. | |
(1) tunables | |
コンストラクタにおけるtunablesは, 実行時に変更可能である. | |
詳細は, 'Background処理'参照 | |
barrier_deadline_ms (ms) | |
Default: 10 | |
allow_migrate (bool) | |
default: 0 | |
enable_migration_modulator (bool) and migrate_threshold (%) | |
default: 0 and 70 | |
nr_max_batched_migration | |
default: 1 << (15 - segment_size_order) | |
update_record_interval (sec) | |
default: 0 | |
sync_interval (sec) | |
default: 0 | |
例: | |
dmsetup message writeboost-vol 0 enable_migration_modulator 0 | |
(2) その他 | |
clear_stats | |
統計情報('ステイタス'参照)を初期化する | |
drop_caches | |
キャッシュデバイス上にあるすべてのダーティデータがマイグレートするのを待つ(Interruptible) | |
例: | |
dmsetup message writeboost-vol 0 drop_caches | |
ステイタス | |
--------- | |
<cursor pos> | |
<#cache blocks> | |
<#segments> | |
<current id> | |
<lastly flushed id> | |
<lastly migrated id> | |
<#dirty cache blocks> | |
<stat (w/r) x (hit/miss) x (on buffer?) x (fullsize?)> | |
<#not full flushed> | |
<#tunable args> [tunable args] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment