Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
device mapperによるディスクI/O障害のエミュレーション 既存ターゲット編
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Satoru Takeuchi
PRO
December 11, 2023
Technology
870
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
device mapperによるディスクI/O障害のエミュレーション 既存ターゲット編
以下動画のテキストです
https://youtu.be/8Mbd31KHDR4
Satoru Takeuchi
PRO
December 11, 2023
More Decks by Satoru Takeuchi
See All by Satoru Takeuchi
Linuxカーネルの インタフェースは変わりうる?
sat
PRO
1
55
あなたの知らないバージョン命名規則
sat
PRO
2
660
Rook: Intro and Deep Dive with Ceph
sat
PRO
1
59
Machine Check Exception
sat
PRO
2
55
バイナリダンプの模様を読む
sat
PRO
0
80
cpコマンドはディスク上でデータを コピーしないことがある
sat
PRO
3
68
114-ファイルのshallow_copy.pdf
sat
PRO
2
45
113-Btrfsのスナップショット.pdf
sat
PRO
0
30
システム強制終了時にファイルシステムの整合性を保つ~ コピーオンライト編 ~
sat
PRO
0
66
Other Decks in Technology
See All in Technology
国家プロジェクトを支える「さくらONE」 大規模LLM開発におけるGPU障害を乗り越えるクラスター運用戦略
gpuunite_official
0
280
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
「面白い!」を信じ抜け。激動の時代を貫く、オンリーワン・エンジニアの条件
kizawa2020
0
140
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
700
RelayerというPHPのフレームワークを作った
polidog
PRO
0
140
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
270
安全性・開発速度・ユーザー体験の あいだで考える 事業会社のプロダクトセキュリティ
mixi_engineers
PRO
0
110
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
20k
現場回帰したデータエンジニアが考える AI 時代のキャリア開発 / Career Development in the Age of AI Perspectives from a Hands-on Data Engineer
medley
0
330
2027年のMetricKit
kantacky
0
170
dbt in Microsoft Fabric
ryomaru0825
0
250
[potatotips #96] Give Your AI Agent the Flutter Playbook
korodroid
0
160
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
550
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Designing Experiences People Love
moore
143
24k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Embracing the Ebb and Flow
colly
88
5.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
490
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Side Projects
sachag
455
43k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
480
Everyday Curiosity
cassininazir
0
290
Transcript
device mapperによる ディスクI/O障害のエミュレーション ~ 既存ターゲット編 ~ Dec, 10th, 2023 Satoru
Takeuchi X: satoru_takeuchi 1
はじめに • LinuxでディスクI/O障害をエミュレーションする方法を紹介 • ブロックデバイスレベルの障害にフォーカス • Ubuntu 22.04.3のカーネル(kernel 5.15.0-89-generic)を使って動作確認 2
ディスクは色々な理由で壊れる • I/Oが遅延 • 特定セクタが壊れる • ディスクが応答しない 3
壊れたときのためにエラー処理がある • I/Oのリトライ ◦ 一時的に起きてすぐ解消することもある • データの破壊検知、修復 • ユーザに対処を任せる 4
disk ソフトウェア 何らかの異常 対処 理想 • I/Oが最終的に成功する • I/Oが失敗を返して対処がゆだねられる
エラー処理はテストが大変 • 課題 ◦ ディスクはテスト中に気を使って障害を起こしてくれたりしない ◦ うまくテストできなくてバグの温床になりがち • 解決策(の一つ) ◦
Linuxカーネルのdevice mapper 5
device mapper • ブロックデバイスに機能追加するためのLinuxカーネルの仕組み • 用語 ◦ ターゲット: device mapperの個々の機能
▪ 暗号化、マルチパス化、 ディスク障害エミュレーション など ◦ dmデバイス: device mapperが作るブロックデバイス • 基本はdmsetupコマンドで制御 6 /dev/sda /dev/mapper/<dm device name> 書き込み 書き込み+α 読み出し 読み出し+α
dmsetupのつかいかた • dmデバイスとマップ先デバイスを対応付けるテーブルを作る • dmデバイスを作る • dmデバイスの挙動を動的に変更する 7 $ cat
table.txt <開始セクタ> <長さ> <ターゲット名> <マップ先デバイス> [<パラメタ>...] ... $ sudo dmsetup create <dmデバイス名> <テーブルファイル> $ ls /dev/mapper/ … <dmデバイス名> … 1セクタ=512バイト $ sudo dmsetup message <dmデバイス名> 0 <コマンド> [<パラメタ>...]
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
8
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
9
dm-delay • I/Oを遅延させる • テーブルの形式 10 <開始セクタ> <長さ> delay <マップ先デバイス>
<マップ先開始セクタ > <遅延[ms]> dm-delay disk write 遅延を入れてからwrite read 遅延を入れてからread
使用例 11 $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較)
使用例 12 $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成
使用例 13 $ sudo dd if=/dev/zero of=/dev/mapper/test-delay bs=1M count=1024 oflag=direct
$ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成 dmデバイスにwrite
使用例 14 $ sudo dd if=/dev/zero of=/dev/mapper/test-delay bs=1M count=1024 oflag=direct
… 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.4044 s, 65.5 MB/s $ sudo dd if=/dev/zero of=/dev/loop0 bs=1M count=1024 oflag=direct … 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.615917 s, 1.7 GB/s 通常時のスループットを確認(後で遅延を入れた場合と比較) $ cat test-delay.txt 0 2097152 delay /dev/loop0 0 10 $ sudo dmsetup create test-delay test-delay.txt dmデバイスの作成 dmデバイスにwrite すごく遅くなった
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
15
dm-flakey • I/Oエラーを一定間隔で発生させる • テーブルの形式 16 <開始セクタ> <長さ> flakey <マップ対象デバイス>
<マップ先開始セクタ> <成功期間> <失敗期間> dm-delay disk write write(たまに失敗) read read(たまに失敗)
使用例 17 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt dmデバイスの作成 2秒間の正常動作後 2秒間I/Oエラーを出す
使用例 18 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt $ sudo bash -c 'for ((i=0;i<10;i++)) ; do dd if=/dev/mapper/test-flakey of=/dev/null bs=128 count=1 sleep 1 done' dmデバイスの作成 dmデバイスから1秒に1回read
使用例 19 $ cat test-flakey.txt 0 2097152 flakey /dev/loop0 0
2 2 $ sudo dmsetup create test-flakey test-flakey.txt $ sudo bash -c 'for ((i=0;i<10;i++)) ; do dd if=/dev/mapper/test-flakey of=/dev/null bs=128 count=1 sleep 1 done' ... 128 bytes copied, 0.000198435 s, 645 kB/s dd: error reading '/dev/mapper/test-flakey': Input/output error ... dd: error reading '/dev/mapper/test-flakey': Input/output error ... 128 bytes copied, 0.000169802 s, 754 kB/s ... 128 bytes copied, 0.000224296 s, 571 kB/s dd: error reading '/dev/mapper/test-flakey': Input/output error ... dmデバイスの作成 dmデバイスから1秒に1回read 仕様通りに動作
dm-flakey上でファイルシステムを作ると… 20 $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup
create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt ファイルシステムが存在するデバイス上にdmデバイスを作成
dm-flakey上でファイルシステムを作ると… 21 $ for ((i=0;i<10;i++)) ; do sudo dd if=/dev/zero
of=mnt/test.txt bs=1 count=1 oflag=direct sleep 1 done $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt ファイルシステムが存在するデバイス上にdmデバイスを作成 ファイルシステム上のファイルに1秒に1回write
dm-flakey上でファイルシステムを作ると… 22 $ for ((i=0;i<10;i++)) ; do sudo dd if=/dev/zero
of=mnt/test.txt bs=1 count=1 oflag=direct sleep 1 done dd: failed to open 'mnt/test.txt': Input/output error dd: failed to open 'mnt/test.txt': Input/output error dd: failed to open 'mnt/test.txt': Read-only file system … ファイルシステムが存在するデバイス上にdmデバイスを作成 ファイルシステム上のファイルに1秒に1回write すぐにread onlyに $ sudo mkfs.ext4 -F /dev/loop0 $ sudo dmsetup create test-flakey test-flakey.txt $ mount /dev/mapper/test-flakey mnt
カーネルログを見ると… 23 $ sudo dmesg … [10912.976026] EXT4-fs error (device
dm-0): ext4_journal_check_start:83: comm dd: Detected aborted journal [10912.991408] EXT4-fs (dm-0): Remounting filesystem read-only • ext4はデータが存在するデバイスの挙動が怪しいとreadonlyでremountする ◦ 他のファイルシステムもこのようなフェイルセーフのしくみがある • 📝 dm-flakeyをファイルシステム上のI/Oエラーのエミュレーションに使うのは面倒 ジャーナル処理も失敗
ディスク障害エミュレーション用ターゲット • dm-delay: I/Oの遅延をエミュレーション • dm-flakey: I/Oエラーをエミュレーション • dm-dust: ディスクのブロック障害をエミュレーション
24
dm-dust • 特定ブロックの故障をエミュレーション • テーブル形式 25 <開始セクタ> <長さ> dust <マップ先デバイス>
<マップ先開始セクタ> <ブロックサイズ> データ 不良ブロック dm-dust disk
dm-dustの主なメッセージ • 機能の有効化/無効化(デフォルトは無効) • 指定したセクタを疑似不良ブロックにする • 指定したブロックを疑似不良ブロックではなくする • 疑似不良ブロックのリスト ◦
26 $ sudo dmsetup message <dmデバイス名> 0 addbadblock <ブロック番号> [修復前にI/Oが失敗する回数] $ sudo dmsetup message <dmデバイス名> 0 removebadblock <ブロック番号> $ sudo dmsetup message <dmデバイス名> 0 {enable,disable} $ sudo dmsetup message <dmデバイス名> 0 listbadblocks <ブロック番号>
dm-dustを使う前の準備 • kernel 5.15.0-89-genericではdm-dustは無効化されている • 自前ビルドすれば使える 27 $ git clone
https://github.com/satoru-takeuchi/youtube-sample $ cd youtube-sample/0063-dm-io-failures-existing-targets $ make -C kernel-modules $ sudo insmod kernel-modules/dm-dust.ko
使用例 28 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 dmデバイスの作成&設定 セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 29 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 dmデバイスの作成&設定 セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 不良ブロックからread
使用例 30 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … dmデバイスの作成&設定 不良blockからのread セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 31 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync dd: error writing '/dev/mapper/test-dust': Input/output error … dmデバイスの作成&設定 不良blockへのwrite セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
使用例 32 $ cat test-dust.txt 0 2097152 dust /dev/loop0 0
512 $ sudo dmsetup create test-dust test-dust.txt $ sudo dmsetup message test-dust 0 enable $ sudo dmsetup message test-dust 0 addbadblock 0 1 $ sudo dd if=/dev/mapper/test-dust of=/dev/null bs=512 count=1 dd: error reading '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync dd: error writing '/dev/mapper/test-dust': Input/output error … $ sudo dd if=/dev/zero of=/dev/mapper/test-dust bs=512 count=1 oflag=direct,dsync … 512 bytes copied, 0.0134639 s, 38.0 kB/s dmデバイスの作成&設定 不良ブロックへの2度目のwrite セクタ0にアクセスすると • readは失敗する • 1回目のwriteは失敗する • 2回目のwriteで不良セクタが消える
ファイルとセクタの関係 • 一般的にユーザはブロックデバイスを直接使わず、その上にファイルシステムを置 いて使う • あるファイルの、あるオフセットへのアクセス時に障害を起こしたい • それはどこのセクタにあるの? 33 disk
ファイル ? ? ?
ioctl(FS_IOC_FIEMAP)を使えばわかる • ファイルとextent、extentとブロックの対応が得るためのioctl() • xfs_io -c fiemapコマンドを介して手軽に使える 34 $ xfs_io
-c fiemap test.txt test.txt: 0: [0..7]: 266240..266247 test.txtの先頭領域を含むextentは ファイルシステムの下にあるブロックデバイスの セクタ266240~266247に存在する
使用例 35 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 dmデバイス上の作成&設定 test.txtファイル先頭のデータに対応 するセクタを不良セクタにする /dev/loop0 /dev/mapper/test-dust filesystem test.txt
使用例 36 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 $ sudo dd if=mnt/test.txt of=/dev/null bs=512 count=1 iflag=direct dmデバイス上の作成&設定 dmデバイス上のファイルからread /dev/loop0 /dev/mapper/test-dust filesystem test.txt
使用例 37 $ sudo dmsetup message test-dust 0 enable $
sudo xfs_io -c fiemap mnt/test.txt mnt/test.txt: 0: [0..7]: 266240..266247 $ sudo dmsetup message test-dust 0 addbadblock 266240 $ sudo dd if=mnt/test.txt of=/dev/null bs=512 count=1 iflag=direct dd: error reading 'mnt/test-dust.txt': Input/output error … dmデバイス上の作成&設定 dmデバイス上のファイルからread /dev/loop0 /dev/mapper/test-dust filesystem test.txt
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 38
Btrfs データ 不良ブロック dm-dust disk
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 39
Btrfs 旧データ 不良ブロック 新データ writeするとデータの場所が変わる dm-dust disk
• CoW型、ログ構造型のファイルシステムではうまく機能しない ◦ 例: Btrfs, NILFS ◦ writeするたびにextentとblockの対応関係が変化 dm-dustと相性の悪いファイルシステム 40
Btrfs 旧データ 不良ブロック 新データ writeするとデータの場所が変わる dm-dust disk 📝 ファイルシステムはなんでもいいなら ext4などのin-placeな更新をするものを使う
デバイスに全くアクセスできない状況も作れる • ターゲットへのI/Oを受け付けない状態にする • 上記の状態の解除 • 📝 どんなターゲットでも使える技 41 dmsetup
suspend <dmデバイス名> dmsetup resume <dmデバイス名>
ターゲットを重ねるとさらに高機能化 42 disk dm-flakey dm-delay dm-dust 元気です I/O失敗させます I/O遅延させます セクタ壊します
やったね!
まとめ • device mapperを使えばディスクI/O障害をエミュレーションできる • device mapperターゲットのドキュメント ◦ https://docs.kernel.org/admin-guide/device-mapper 43