私は、大量のデータを失わないように、できるだけ多くのデータをファイルに書き込むアプリケーションを作成する予定です。マイクロ秒またはナノ秒単位のタイミングを含むすべてのキー ストロークをディスクに書き込みます。これはかなり多いように思えますが、1 GB のデータが書き込まれるまでには、まだかなりの時間がかかります。この問題を軽減するために、出力ストリームを使用して、このデータをファイルの末尾への更新として書き込む予定ですが、その後すぐにストリームをフラッシュします。
SSD の場合、データを書き込むたびに、通常は更新が実行されるたびに異なる場所に書き込まれます。OS/FS は単に「セクター」をドライブに送信するだけなので、それがファイルの末尾への更新であるとは区別できないと推測します。つまり、更新が小さい場合でも、SSD のウェア レベリングが確実に制限されることになります。
上記の説明は正しいでしょうか。また、アプリケーションで適切な量のバッファリングを考慮する必要がありますか? 最新のファイルシステムは、SSD に書き込む前にどの程度キャッシュしますか? それとも、SSD 自体の内部バッファリングが役に立ちますか? このような使用法の分析を行った人はいますか?
答え1
このような状況では、OS は書き込みをバッファリングし、数秒ごとにフラッシュする必要があります。また、ほとんどの SSD は、停電時にデータが失われないように、制限された形式の「安全な」書き込みバッファリングを実装しています。ほとんどのストレージ デバイスと OS は 4 KB ブロックで動作するため、システムはディスクに 1 バイトずつ書き込むことはありません。
ただし、アプリケーションが継続的に少量のデータをディスクに書き込む必要がある場合は、独自の書き込みバッファを実装するか、適切な OS 機能を使用して、明示的に書き込みバッファを使用することをお勧めします。ディスクへの書き込みは OS レベルでかなりのオーバーヘッドを伴うため、適切な間隔で、またはバッファが特定のサイズ (数十 KB または数百 KB など) に達したときにフラッシュされるメモリ バッファに書き込む必要があります。
適度に大きなデータ チャンクを定期的に書き込み、ディスク上のランダムな場所のデータを上書きせず、ログ データの連続ストリームを書き込んでいるだけの場合、書き込み増幅が過剰になったり、パフォーマンスが低下したりすることはないはずです。ドライブのウェア レベリングは、この場合は問題なく機能します。