
私はこの質問に対する答えが一般的に「適切であると判断されたとき」であるか、または他のあいまいな答えであることを知っています。ホストがハード再起動すると、最近作成されたいくつかのファイルに最後のデータが含まれていないか、または破損している場合が何度も見られました。しかし、最近私は多くのI / Oを引き起こすコードのデバッグを誰かを助けていました。詳しく調べると、これは一時ファイルを開くtmpfile(3)
方法(ファイルが開くとすぐにリンクが解除されることを意味します)を使用し、次の手順を何千回も繰り返す非常に誤って書かれたコードであることがわかりました。
- ファイルに数バイトを書き込みます。
- ファイルの先頭に戻るを使用します
seek
。 - このバイトを読んでください。
- ファイルを0に切り捨てます
ftruncate
。
その後、同じ操作を繰り返します。ファイルシステムがxfsで最小ファイルサイズが4kなので、このループが繰り返される回数を数えて4kを掛けると、システムが報告するI/O書き込み量と正確に一致するように見えます。毎回ftruncate
、またはwrite
すぐに新しいブロックがディスクに割り当てられます。これはホストに多くの問題を引き起こし、これらのiowait
プロセスのいくつかが同じホスト上で一緒に実行されると、実際にロードが発生し、ディスクが非常に遅くなります。
今、この非常に非効率的なコード(発見後に修正された)を取り除いて、I / O負荷がなぜそんなに高いのか疑問に思います。データが引き続きフラッシュされ、各ftruncate
(またはwrite
後続の)4kが引き続き割り当てられているようです。そこで、データ(そしてどのデータ)が物理ディスクにいつどのようにフラッシュされるかを調べようとしています。単純なメタデータですか、それともデータ自体ですか?
しかし、tmpfile
ファイルを開かないでください。O_SYNC
O_DIRECT