Skip to content

Instantly share code, notes, and snippets.

@akiradeveloper
Created April 27, 2014 01:38
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/11335639 to your computer and use it in GitHub Desktop.
Save akiradeveloper/11335639 to your computer and use it in GitHub Desktop.
ライトブーストのドキュメントを日本語で書く(v2) 気づいた点あったら指摘お願いします
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