cp
Linuxでは、またはなどのコマンド実行が完了したとしても、dd
デバイスにデータが書き込まれたという意味ではありません。たとえば、人は電話をする必要があります。sync
、またはドライブから安全除去または取り出し機能を呼び出します。
このアプローチの基本的なアイデアは何ですか?データを一度に書き込んだらどうでしょうか? I / Oエラーのため書き込みが失敗しますか?
答え1
書き込みが完了するまで実際に待つ必要なくプログラムに速度の幻想を提供するだけです。ファイルシステムを同期モードでマウントし(すぐに書き込み可能)、すべてがどれほど遅いかを確認してください。
時にはファイルが一時的にしか存在しない場合があります。プログラムはいくつかのタスクを実行し、タスクが完了するとすぐにファイルを削除します。このような書き込みを遅らせると、そもそも書かずに外れることがあります。
IOエラーによる書き込み失敗のリスクはありませんか?
ああ、もちろんです。この場合、通常、ファイルシステム全体が読み取り専用モードになり、すべての地獄が解放されます。しかし、これは非常にまれであるため、全体的なパフォーマンス上の利点を失うことは意味がありません。
答え2
このアプローチの哲学は何ですか?
効率性(ディスク機能の利用率を向上させる)とパフォーマンス(書き込み直後にアプリケーションを引き続き使用できる)
データがすぐに記録されないのはなぜですか?
最大の利点は、オペレーティングシステムが帯域幅使用率を向上させるために連続書き込み操作を自由に並べ替えてマージできることです(タスクの削減と検索の削減)。少数の大規模なタスクを要求すると、ハードディスクのパフォーマンスが向上しますが、アプリケーションには多数の小規模なタスクが必要になる傾向があります。もう1つの明確な最適化は、同じブロックが短時間で複数回書き込まれると、オペレーティングシステムが最後の書き込みを除くすべてを削除することができます。 。
これらの非同期書き込みが完了しました。後ろにシステムwrite
コールが返されました。これは、ユーザーにとって2番目で最も明白な利点です。非同期書き込みは、データが実際にディスクに保存されるのを待たずに作業を続行できるため、アプリケーションを高速化します。同じタイプのバッファリング/キャッシュも読み取り操作に実装されています。ここで、最近または頻繁に読み出されたブロックは、ディスクからの再読み込みの代わりにメモリに保持されます。
IOエラーによる書き込み失敗のリスクはありませんか?
不要。これは、使用されるファイルシステムと適切な冗長性によって異なります。データを他の場所に保存できる場合、I / Oエラーは無害になる可能性があります。 ZFSなどの最新のファイルシステムは、不良ディスクブロックを自己修復する可能性があります。また、I/O エラーによって最新のオペレーティングシステムがクラッシュすることはありません。データアクセス中にこれらの問題が発生した場合は、影響を受けるアプリケーションに報告するだけです。構造的なメタデータアクセス中にこの問題が発生し、ファイルシステムが危険にさらされると、読み取り専用で再マウントまたはアクセスできなくなる可能性があります。
また、オペレーティングシステムのクラッシュ、停電、またはハードウェア障害が発生した場合、データ損失のわずかなリスクがあります。これは、データがディスクにあることを100%確実にしなければならないアプリケーション(データベース/金融アプリケーションなど)が効率が悪く、より安全な同期書き込みを実行する理由です。パフォーマンスの影響を軽減するために、多くのアプリケーションは依然として非同期書き込みを使用しますが、ユーザーが明示的にファイルを保存すると(vim、ワードプロセッサなど)、最終的に同期します。
一方、大半のユーザーやアプリケーションは、同期書き込みで提供されるセキュリティを必要とせず、気にしません。衝突や停電が発生した場合の唯一のリスクは、通常、最後の30秒のデータが失われることです。金融取引が含まれているか、またはコストが30秒よりはるかに大きいことを意味しない限り、非同期書き込み(ファンタスティックではありませんが非常に現実的です)を介して得られる膨大なパフォーマンスの向上は、リスクよりはるかに大きいです。
最後に、同期書き込みは記録中のデータを保護するのに十分ではありません。アプリケーションで何が起こってもデータが失われないようにする必要がある場合は、火災や洪水などの災害に耐えるために、複数のディスクと複数の地域にわたるデータの複製が必要です。
答え3
非同期、バッファリングされたI / Oは、LinuxとUnixの前にも使用されました。 Unixにもあり、すべてのブランチにも同じです。
RitchieとThompsonがCACM論文に書いた内容は次のとおりです。UNIX時間共有システム:
ユーザーにとっては、ファイルの読み取りと書き込みの両方が同期してバッファリングされていないようです。つまり、読み取り呼び出しから返された直後にデータを使用でき、逆に書き込み後にユーザーのワークスペースを再利用できます。実際、システムは、ファイルへのアクセスに必要なI / O操作の数を大幅に減らすかなり洗練されたバッファリングメカニズムを維持します。
あなたの質問には次のように書かれています。
IOエラーによる書き込み失敗のリスクはありませんか?
はい、書き込みが失敗する可能性があり、プログラムはこれを決して知らないかもしれません。これは決して良いことではありませんが、I / Oエラーが原因でシステムパニックが発生した場合、その影響を最小限に抑えることができます(一部のオペレーティングシステムではこれを設定できます。ではありません)。 ) がマウントされていないか、読み取り専用でマウントされています。その後、ユーザーはそのファイルシステムのデータが疑わしいという通知を受け取ることができます。ディスクドライブを事前に監視する成長欠陥リストこれはドライブエラーを示します。
BSDが追加されましたfsync
システムコールにより、プログラムは続行する前にファイルデータがディスクに完全に書き込まれていることを確認でき、その後のUnixシステムは同期書き込みを実行するオプションを提供します。 GNU ddには、conv=fsync
コマンドが終了する前にすべてのデータが書き込まれるようにするオプションがあります。バッファリングされたデータの書き込みには数分かかることがあるため、低速リムーバブルフラッシュドライブに書き込むのに役立ちます。
ファイルの破損のもう一つの原因は、停電などによる突然のシステムシャットダウンです。ほぼすべての現在のシステムでサポートされていますクリーン/汚いファイルシステムに表示します。このフラグは次のように設定されます。きれいこれは通常、シャットダウン中に実行されるか、書き込むデータがなく、ファイルシステムがアンマウントされようとしたときに手動呼び出しによって実行されますumount
。fsck
ファイルシステムが完全に閉じていないことを検出すると、システムは通常再起動時に実行されます。 。
答え4
これはLinuxに限定されていません。ページキャッシュ(Linuxはうまくいきます)。また、見ることができますhttp://linuxatemyram.com/;したがってファイルに書き込んで数秒後に再度読み取る場合、通常はディスクI / Oは必要ありません。
最大の利点は、多くのシステムに多くのRAMがあり、その一部はカーネル内のキャッシュとして使用できることです。したがって、特定のファイル操作ではこのキャッシュを利用できます。さらに、ディスクI / O時間はRAMよりはるかに遅いです(通常、SDDの場合は数千倍遅く、HDDの場合は約100万倍遅い)。
アプリケーションコードは、このキャッシュに関するヒントを提供できます。posix_fadvise(2)&クレイジーウェス(2)