
私はファイルの変更がディスクに直接保存されると思いました。つまり、ファイルを閉じて[保存]をクリック/選択することにしました。しかし、最近の会話では、私の友人はこれが一般的に本当ではないと言いました。オペレーティングシステム(特にLinuxシステムについて話しています)はメモリの変更を保持し、実際にメモリの内容をディスクに書き込むデーモンを持っています。
彼は外部フラッシュドライブの例も提示した。これらのドライブはシステムにマウントされ(メモリにコピーされ)、時にはデーモンがコンテンツをフラッシュメモリに保存しなかったため、データが失われます。これがまさに私たちがフラッシュドライブをアンマウントする理由です。
私はオペレーティングシステムの機能について何も知らないので、これが本当であるか、どのような状況でこのようなことが起こるのかわかりません。私の主な質問は次のとおりです。 Linux / Unixシステム(および他のオペレーティングシステム)で説明されているようにこれは発生しますか?たとえば、これは私がコンピュータの電源を切っていることを意味しますか?まもなくファイルを編集して保存した後に変更が失われる可能性がありますか?おそらくディスクの種類(既存のHDDとSSD)によって異なりますか?
この質問は、具体的に情報を保存するディスクを含むファイルシステムに関するものですが、明確な説明や比較が必要です。
答え1
ファイルを編集して保存した直後にコンピュータの電源を切ると、変更が失われる可能性がありますか?
おそらくそうです。 「可能性が最も高い」とは言えませんが、可能性はさまざまな要因によって異なります。
ファイル書き込みパフォーマンスを向上させる簡単な方法は、オペレーティングシステムがデータをキャッシュし、アプリケーションに書き込みプロセスを通知し、後で実際に書き込みを実行することです。これは、他のディスクアクティビティが同時に発生する場合に特に便利です。オペレーティングシステムは、後で読み書きの優先順位を指定できます。また、後で一時ファイルをすばやく削除する場合など、実際の書き込み操作はまったく必要ありません。
キャッシュの問題は、ストレージが遅い場合にさらに明白になります。高速SSDからスローUSBスティックにファイルをコピーする場合は、USBスティックが追いつくことができないため、多くの書き込みキャッシュが必要になることがあります。ただし、cp
コマンドはより速く返されるため、操作を続行でき、コピーしたファイルを編集することもできます。
もちろん、このようなキャッシュには欠点があります。一部のデータは、実際に保存される前に失われる可能性があります。エディタが書き込みに成功したが、ファイルが実際にディスクにないと言うと、ユーザは怒ってしまう。だからこそfsync()
システムコール、ファイルが実際にディスクに到達した後にのみ返される必要があります。編集者はこれを使用して、ユーザーに書き込みが正常に報告される前にデータが正しいことを確認できます。
「しなければならない」と言った理由は、ファイルが実際にドライブ内の揮発性書き込みキャッシュにのみ存在する場合、ドライブ自体がオペレーティングシステムに同じ嘘をついて書き込みが完了したと言えるからです。ドライブによっては、この問題を解決する方法がない場合があります。
また、すべてのシステム全体の書き込み、または特定のファイルシステムからのすべての書き込みがディスクに到達したことを確認するようにシステムに要求するシステムコールがありますfsync()
。このユーティリティを使用してそれを呼び出すことができます。sync()
syncfs()
sync
そしてそこにO_DIRECT
次に表示open()
、「ファイルに対する I/O のキャッシュの影響を最小限に抑えるよう努めます」。キャッシュを削除するとパフォーマンスが低下するため、自分でキャッシュして制御するアプリケーション(データベース)で主に使用されます。 (O_DIRECT
問題がないわけではありませんが、マニュアルページにはこれについてやや興味深い説明があります。)
電源が切れたときに発生する状況は、ファイルシステムによって異なります。注意すべきことは、ファイルデータだけでなくファイルシステムメタデータも同様です。ファイルデータをディスクに保存しても見つからない場合は役に立ちません。単にファイルをより大きなサイズに拡張するには、新しいデータブロックを割り当てる必要があり、どこかに表示する必要があります。
ファイルシステムがメタデータの変更を処理する方法とメタデータとデータ書き込みの順序は非常に異なります。たとえばext4
、マウントフラグを設定すると、data=journal
すべての書き込み(データ書き込みを含む)がログを通過するため、かなり安全でなければなりません。これはまた2回書かれているため、パフォーマンスが低下することを意味します。デフォルトオプションは、メタデータが更新される前にデータがディスクにあるように書き込み順序を指定します。他のオプションや他のファイルシステムが良いかもしれないし悪いかもしれません。包括的な研究は試みません。
実際に負荷の少ないシステムでは、ファイルは数秒以内にディスクに到着する必要があります。リムーバブルストレージを扱う場合は、メディアをインポートする前にファイルシステムをアンマウントして、データが実際にドライブに転送され、アクティビティがなくなったことを確認してください。 (またはGUI環境でこれを実行してください。)
答え2
一つある極度に証明する簡単な方法できない実際、ファイルの編集内容は常にディスクに直接保存されます。つまり、次のファイルシステムが存在します。最初からディスクサポートなし。ファイルシステムにない場合持つまずディスク、次に不可能変更内容をディスクに記録し、一度。
いくつかの例は次のとおりです。
tmpfs
、RAM(より正確にはバッファキャッシュ)にのみ存在するファイルシステムです。ramfs
、RAM にのみ存在するファイルシステム- どのネットワークファイルシステム(NFS、CIFS / SMB、AFS、AFP ...)
- どの仮想ファイルシステム(
sysfs
、、、、、… )procfs
devfs
shmfs
ただし、ディスクバックアップファイルシステムの場合でも通常はそうではありません。このページSQLiteデータベースを破損する方法という章があります。同期失敗書き込み(この場合はSQLiteデータベースにコミットされます)がディスクに到達できない可能性があるさまざまな方法について説明します。 SQLiteには、保証のために超えなければならない多くの困難を説明するホワイトペーパーもあります。SQLiteのアトミックコミット。 (知っている原子書き込み問題よりも難しい書くしかし、もちろんディスクへの書き込みは原子書き込みの下位問題であり、この記事でもその問題について多くを学ぶことができます。 )この記事には紹介するセクションがあります。間違える可能性があること薬を含む不完全なディスクフラッシュ書き込みがディスクに到達するのを防ぐことができる微妙な複雑さの例をいくつか示します。かもしれません)。これに関して表現はあいまいなので、ATA仕様によっても合法的です。
答え3
実際、Unix、Linux、Windowsを含むほとんどのオペレーティングシステムは、作業速度を上げるために書き込みキャッシュを使用します。これは、コンピュータの電源を切らずにシャットダウンするのは悪い考えであり、データが失われる可能性があることを意味します。 USBストレージデバイスを取り外す準備が整う前に取り外すと、同じ状況が発生します。
ほとんどのシステムは同期書き込みオプションも提供します。つまり、アプリケーションが成功の承認を受けるまでデータはディスクに保存されますが、遅くなります。
つまり、コンピュータを正しくシャットダウンし、USBストレージの取り外しを適切に準備する必要がある理由があります。
答え4
負荷の低いシステムでは、カーネルは新しく作成されたファイルデータをページキャッシュに約30秒間アーカイブしてからwrite()
ディスクにフラッシュし、すぐに再度削除または変更されないように最適化します。
Linuxのデフォルト値dirty_expire_centisecs
は3000(30秒)です。、新しく作成されたデータが「期限切れ」になるまでの時間を制御します。 (望むよりhttps://lwn.net/Articles/322823/)。
バラよりhttps://www.kernel.org/doc/Documentation/sysctl/vm.txt関連する調整可能なパラメータの詳細については、Googleで詳細を確認してください。 (例:Googleからdirty_writeback_centisecs
)
Linuxのデフォルト値は/proc/sys/vm/dirty_writeback_centisecs
500(5秒)です。、PowerTopでは、消費電力を削減するために1500(15秒)に設定することをお勧めします。
さらに、遅延書き込み保存は、ディスクへの書き込みを開始する前にファイルのサイズを確認するためのカーネル時間を提供します。遅延割り当てを使用するファイルシステム(XFSなどの他のファイルシステムなど)は、inode自体にスペースを割り当てるのではなく、必要に応じてファイルに新しく作成されたデータを保存するディスクの場所を選択しません。たとえば、これにより、異なるファイル間の1 MB間隔に大容量ファイルの先頭を配置することを防ぎ、断片化を減らすことができます。
大量のデータが書き込まれると、ページキャッシュ内のダーティデータ(まだディスクと同期していない)の量のしきい値によって、ディスクへの書き換えがトリガされることがあります。
ただし、他に何もしないと、小さなファイルで「保存」をクリックしてから5秒(または15)秒間はハードドライブアクティビティインジケータが点灯しません。
ファイルを作成した後、エディタを使用するfsync()
と、カーネルはファイルをすぐにディスクに書き込みます。 (fsync
データが実際にディスクに転送されるまで返されません)。
キャッシュ書き込み以内にディスクも重要かもしれませんが、ディスクは通常Linuxのページキャッシュアルゴリズムとは異なり、書き込みキャッシュをできるだけ早く永続ストレージにコミットしようとします。ディスク書き込みキャッシュは、少量の書き込みバーストを吸収するストレージバッファに似ていますが、読み込みのために書き込みを遅らせ、ナビゲーションパターンを最適化するためのディスクファームウェアスペースを提供することもできます(たとえば、2回の書き込みまたは読み取りを実行する代わりに2回近い書き込みまたは読み取り操作を実行します)。一度)それから離れて探して、もう一度見つけてください。 )
回転(磁気)ディスクから書き込み前に保留中の読み取り/書き込み操作がある場合、SATA書き込みコマンドのデータが実際にミリ秒単位で中断されるまでに約7〜10秒かかることがあります。 (この質問に対する他の答えは、ジャーナリングファイルシステムが破損を防ぐために使用できるディスク書き込みキャッシュと書き込み障壁について詳しく説明しています。)