私のプログラムは小さな一時ファイルをたくさん生成します。通常、作成後1秒以内に削除されます。これらのファイルは、物理ハードディスクがサポートするext4ファイルシステムにあります。私はLinuxが定期的にpdflush
()ダーティページをディスクにフラッシュすることを知っています。私のファイルは一時ファイルなので、使用されない可能性がありますpdflush
。私の質問は、私のプログラムが多くのディスク書き込みを引き起こすかどうかです。私の懸念はハードドライブの寿命です。
ファイルが小さいため、ファイルサイズの合計dirty_bytes
がdirty_background_bytes
。
Ext4はメタデータログインのデフォルトログを開きます。また、メタデータやデータがディスクに書き込まれるかどうかを知りたいです。
答え1
ソリッドステートドライブについて話さない限り、過度のディスク書き込みはドライブ寿命の主な要因ではありません。
ディスクへの書き込みを完全に避けたい場合は、次の点を確認してください。一時ファイルシステム、
答え2
ext4を使った簡単な実験:
100MBの画像を生成...
# dd if=/dev/zero of=image bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.0533049 s, 2.0 GB/s
屋根ふきデバイスで作ってみてください...
# losetup -f --show image
/dev/loop0
ファイルシステムを作成してマウントします。
# mkfs.ext4 /dev/loop0
# mount /dev/loop0 /mnt/tmp
一種の実行には、寿命の短いファイルを使用してください。 (必要な方法に変更してください。)
for ((x=0; x<1000; x++))
do
(echo short-lived-content-$x > /mnt/tmp/short-lived-file-$x
sleep 1
rm /mnt/tmp/short-lived-file-$x ) &
done
ループを削除、同期、キャンセルします。
# umount /mnt/tmp
# sync
# losetup -d /dev/loop0
画像の内容を確認してください。
# strings image | grep short-lived-file | tail -n 3
short-lived-file-266
short-lived-file-895
short-lived-file-909
# strings image | grep short-lived-content | tail -n 3
私の場合、すべてのファイル名がリストされていますが、ファイルの内容はリストされていません。だからちょうど内容を書いた。
答え3
一般的に言えば、いいえ、記録されません。これは、2つの条件のいずれかが満たされると、キャッシュがダーティページをフラッシュするためです。
データは
/proc/sys/vm/dirty_writeback_centisecs
デフォルトで5秒後に期限切れになります。キャッシュにデータを保持するには、メモリが少なすぎて
dirty_ratio
キャッシュ内のダーティページ数(デフォルトは20%)を超えています。
したがって、空きメモリが多く書き込みトラフィックが非常に少ないシステム(5秒以内に削除された小さなファイルを除く)では、データはフラッシュされません。
答え4
短期ファイルがディスクに書き込まれるかどうかは、カーネルファイルキャッシュのデフォルト動作だけでなく、ファイルシステムドライバの実装の詳細とそのファイルシステムのマウントオプションによって異なります。すべてをすぐにディスクに書き込むようにシステムを設定できます(デフォルトではDOSと同様の動作)。
XFSは、関心のある動作(いわゆる「遅延割り当て」)を強調するファイルシステムです。これにより、削除したファイルに属するブロックが中間ディスクアクセスなしでメモリから再利用されることをある程度確実にすることができます(他の興味深い設定オプションなし)。多くのRAIDコントローラの場合)。
これらの動作により、突然の停電後にXFSファイルシステムで完全に0に設定されていますが、正当なように見えるファイル(サイズやその他のメタデータはそのまま残ります)を見つけることは珍しくありません。これは、迅速な「半時間」ファイル操作をサポートするのにかかる費用です。
いくつかの理論
通常、ファイルシステムにアクセスするシステムコールは、すぐにファイルシステムドライバによって定義されたメソッドで終了します(VFSドライバの登録時に「struct inode_Operations」および「struct file_Operations」に添付されます)。それ以降に行われることは、完全にファイルシステム実装の裁量に依存します。通常、次のような方法を使用します。この簡単な例は、Linux FAT ドライバーからのものです。
if (IS_DIRSYNC(dir))
(void)fat_sync_inode(dir);
else
mark_inode_dirty(dir);
ファイルシステムが「同期」モードでマウントされると、すべての変更はすぐにディスクに書き込まれます(この場合はfat_sync_inode()を介して)。それ以外の場合、ブロックは「ダーティ」とマークされ、合理的な機会にフラッシュされるまでメモリキャッシュに残ります。
したがって、ファイルシステムのマウントオプションを考慮し、その実装のソースコードを調べることなく、一時ファイルに関連するシステムの動作を予測することは不可能です(もちろん、これは主に埋め込みスペースで見つかるほとんどのさまざまなエキゾチックなファイルシステムに適用されます)。