わかりやすい

主にIT関連や時事ネタの興味を持ったことを、なるべくわかりやすく書いてみようとおもいます。

スポンサーリンク

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でも書けなくなる。