13

ファイル内のデータを上書きする前に、古いデータがディスクに保存されていることを確認したいと思います。非常に大きなファイル (数 GB) になる可能性があるため、インプレース更新が必要です。通常、書き込みは 2 MB 以上になります (私の計画では、4 KB のブロック サイズを使用する予定です)。

fsync() を呼び出す代わりに (またはそれに加えて)、ファイル システムが新しいデータを書き込むまで、ディスク上の古いデータを (上書きせずに) 保持したいと考えています。私が fsync() に頼りたくない主な理由は次のとおりです。ほとんどのハードディスクは、fsync の実行について嘘をついています。

だから私が探しているのは、fsyncや同様の方法を使用せずに、ファイルシステム、オペレーティングシステム(Windowsなど)、データがディスクに書き込まれるまでのハードドライブの典型的な最大遅延です。できれば実数が欲しいです。fsync を使用するためのアドバイスを探しているわけではありません。

100% 信頼できる方法がないことは承知していますが、オペレーティング システムとファイル システムがこの点でどのように機能するかをよりよく理解したいと考えています。

私がこれまでに見つけたのは、 /proc/sys/vm/dirty_expire_centiseconds のデフォルトは 30 秒です。次に、「ダーティページはディスクにフラッシュ(書き込まれます)...(ページがダーティのままになってから時間が経過した場合)」(ただし、デフォルトの時間が見つかりませんでした)。そのため、Linux では 40 秒が安全なようです。しかし、これはすべてのファイル システム/ディスクに当てはまりますか? Windows や Android などはどうでしょうか。Windows、Android、通常のハードディスク、SSD など、すべての一般的なオペレーティング システム / ファイル システム / ディスクの種類に当てはまる回答を得たいと考えています。

4

5 に答える 5

2

データが同期されていることを確実に確認する唯一の方法は、OS 固有の同期メカニズムを使用することであり、PostgreSQL の Reliability Docsに従います。

オペレーティング システムがストレージ ハードウェアに書き込み要求を送信するとき、データが真の不揮発性ストレージ領域に到達したことを確認するためにできることはほとんどありません。むしろ、すべてのストレージ コンポーネントがデータの整合性を確保していることを確認するのは、管理者の責任です。

いいえ、真に移植可能なソリューションはありませんが、移植可能なラッパーを作成して信頼できるソリューションを展開することは可能です (ただし困難です)。

于 2012-12-03T03:16:19.860 に答える
2

まず、ハードディスクがデータのフラッシュについて嘘をついているという情報に感謝します。これは私にとって初めてのことでした。

ここで問題になります。書き込むすべてのデータがディスク (最低レベル) に書き込まれていることを確認する必要があります。制御する必要がある部分は 2 つあります。OS がハード ドライブに書き込む時間と、ハード ドライブがディスクに書き込む時間です。

唯一の解決策は、ファジー論理タイマーを使用して、データがいつ書き込まれるかを見積もることです。

私の意見では、これは間違った方法です。OS がいつハード ドライブに書き込みを行っているかを制御できるので、この可能性を利用して制御してください。次に、横になっているハードドライブだけが問題です。この問題は確実に解決できません。ユーザー/管理者に、適切なハード ドライブを選択する際には注意が必要であることを伝える必要があると思います。もちろん、あなたが提案した追加のタイマーを実装することは良い考えかもしれません。
さまざまなハード ドライブと Brad Fitzgerald のツールを使用して一連のテストを開始し、ハード ドライブがいつすべてのデータを書き込んだかを適切に推定するのはあなた次第だと思います。しかしもちろん、ハード ドライブが嘘をつきたければ、データが実際にディスクに書き込まれたかどうかを確認することはできません。

于 2012-12-07T14:32:09.473 に答える
1

ユーザーに応答性の高いシステムを提供するには、多くのキャッシュが必要です。

CPUキャッシュ、カーネル/ファイルシステムメモリキャッシュ、ディスクドライブメモリキャッシュなどがあります。あなたが求めているのは、すべてのキャッシュをフラッシュするのにかかる時間です?

または、別の見方をすると、ディスク ドライブが故障した場合はどうなるでしょうか。すべてのフラッシュが読み取りまたは書き込み操作の成功を保証するわけではありません。

ディスク ドライブは最終的には故障します。あなたが探している解決策は、システムがコンポーネントの障害に耐え、引き続き機能するように、冗長な CPU/ディスク ドライブ システムをどのように持つかということです。

RAID アレイやその他の高可用性構成などのハードウェアを利用して、システムが動作し続ける可能性を高めることができます。

ソフトウェア ソリューションに関する限り、その答えは、OS が最適な処理を行うことを信頼することだと思います。それらのほとんどは、定期的にバッファをフラッシュします。

于 2012-12-07T21:26:21.473 に答える
0

これは古い質問ですが、2019年にも関連しています。Windowsの場合、答えはこれに基づいて「少なくとも1秒ごとに」のようです:

適切な量​​のフラッシュが確実に行われるようにするために、キャッシュ マネージャーはレイジー ライターと呼ばれるプロセスを毎秒生成します。レイジー ライター プロセスは、ディスクに書き込むために最近フラッシュされていないページの 8 分の 1 をキューに入れます。最適なシステム パフォーマンスを得るためにフラッシュされるデータの量を常に再評価し、より多くのデータを書き込む必要がある場合は、より多くのデータをキューに入れます。

明確にするために、上記は毎秒ごとに怠惰なライターが生成されると述べていますが、これは毎秒データを書き出すことと同じではありませんが、同様の質問に対する答えを探すために私がこれまでに見つけた中で最高のものです (私の場合、データをディスクに遅延書き込みする Android アプリがあり、3 秒間隔を使用するとデータが失われることに気付きました。パフォーマンスは低下しますが、データの回復にかかる時間を考慮すると、データを失うとパフォーマンスが大幅に低下します)。

于 2019-09-02T19:42:27.923 に答える