ext4はIOストールでデータロスが発生する?
ログちゃんと取ってないけど、以下のような事象が確認できた。
目次
構成
やったこと
- イニシエータからターゲットにログイン
- イニシエータ側でパーティションを作成、ext4でフォーマット
- イニシエータ側でディスク(というかページキャッシュ)にデータを継続的に書き出し(追記)つつ、IOを止める(ターゲット側でネットワークを閉塞する)
- (IO停止区間。30秒くらい。つまり、IOエラーがアプリに返らない程度。)
- IOを再開させる(ターゲット側でネットワークを開放する)
期待した動作
追記ファイルをtailしながら。
- IO停止前は書いたものがそのまま表示される(ページキャッシュに書き込まれ、OSが非同期にディスクにflushする)
- IO停止中も書いたものがそのまま表示される(ページキャッシュに書き込まれるものの、ディスクへのflushが失敗する。書き込み保留。)
- IO再開後、書き込み保留していたものも含めてすべてのデータがディスクにflushされる(データの破壊や欠損は無い)
ext4で実際に発生した現象
- IO停止前は当然問題なし
- IO停止後、数秒してtailの表示が止まった…(ページキャッシュへの書き込みができなくなった?)
- IO再開後、書き込みが再開されたものの、データの欠損が発生した
具体的にはsleep 0.1しながらdate >> fileとかで書いているので、
2016年 4月 22日 金曜日 11:37:34 JST 2016年 4月 22日 金曜日 11:37:34 JST 2016年 4月 22日 金曜日 11:37:34 JST 2016年 4月 22日 金曜日 11:37:34 JST 2016年 4月 22日 金曜日 11:37:34 JST 2016年 4月 22日 金曜日 11:37:34 JST←データ欠損! 2016年 4月 22日 金曜日 11:37:52 JST←データ欠損! 2016年 4月 22日 金曜日 11:37:52 JST 2016年 4月 22日 金曜日 11:37:52 JST 2016年 4月 22日 金曜日 11:37:52 JST 2016年 4月 22日 金曜日 11:37:52 JST
イメージ的にはこんな感じ。
xfsでやってみると
欠損しない。tailも止まらない(ファイルというかページキャッシュへの書き込みが継続する)。
まとめ
- 事実としては理解したが、理由がよくわからない
- ファイルシステムから見たらデバイスがiSCSIだろうがSCSIだろうがブロックデバイスには変わりないので、他のブロックデバイスでもIOストールでデータ欠損が起きるのでは?
- 識者の方、推測でもいいので是非お考えをご教示いただきたく…
追記
xfsでも同じ現象が起きた。時間か何かの量かはわからないけど、IOのストール時間が長いとxfsでも書けなくなる。