Linux での効率的なファイル更新

Linux での効率的なファイル更新

Linux の高パフォーマンス設定 (多数の同時更新) で、ディスク上の 30k ファイルを更新する最も効果的な方法はどれですか。


1. それぞれのファイルを更新するだけです
2. 古いファイルを削除して新しいファイルを保存します


私が主に懸念しているのはディスク アクセス時間ですが、プロセッサ負荷もここでは要因となる可能性があります。

答え1

使用しているディスク サブシステムとファイル システムは、ここで大きな影響を及ぼします。実際には、さまざまな結果が考えられるため、ベンチマークを行う必要があります。ただし、次のようになります。

  • 実際の同期 IO は、SATA ドライブの場合は約 100 IOPS、SAS ドライブの場合は約 200 IOPS に制限され、SSD の場合は 10 IOPS から 10000 IOPS まで大きく異なることに注意してください。IOPS の数にデータ ドライブの数を掛けます。
  • 最新のファイルシステムは書き込み操作をクラスター化します。適切なファイルシステムの選択と詳細なチューニングにより、結果は 10 ~ 100 倍変わります。
  • 最新のストレージ コントローラは書き込みをキャッシュできます。適切なライトバック キャッシュ設定により、結果は 10 ~ 1000 倍変わります。

したがって、適切なハードウェア (WB キャッシュを備えた実際の RAID コントローラー、SSD)、適切なソフトウェア (最新のファイルシステム、ext3 はここでは絶対に問題外、xfs を使用しますが、ext4 もオプションです)、および適切なチューニング (さまざまなカーネル IO スケジューラ、IO サイズなどの設定をテストする) は、大きな影響を与えます。

答え2

頻繁に更新する場合は、ファイルの内容が古くても問題にはならないでしょう。そうであれば、tmpfs に保存し、更新時にファイルを切り捨てて、そこに再度書き込みます。ディスクをまったく使用しない可能性が高いため、これが最も安価な方法になります。

次に近いのは、ノータイムマウント オプションが設定され、ジャーナリングがオフになっています。ただし、クラッシュするとデータが失われる可能性があるため、やはり危険です。

その後は、ジャーナリングをオンにして再び noatime になります。

覚えておいてください。Linux は、決められた間隔でディスクへの書き込みと同期をバッファリングします。そのため、通常は I/O の観点から書き込みの影響を「感じる」ことはありません (非常に重い書き込みの場合は別ですが、これは調整可能です)。ディスクへの同期の条件を変更して、ディスクへの同期前に書き込みバッファをかなり長い時間満たすこともできます。

本当に賢いことをしたいのであれば、fallocate を使用して、ファイルの最大可能値となるスペースを事前に割り当てます。次に、mmap でファイルを開き、メモリに直接読み取ります。すると、書き換えはほぼ瞬時に行われます (ただし、電源が切れた場合は損失が発生します)。その後、msync 呼び出しを使用して、ディスクにフラッシュバックするタイミングを制御できます。

答え3

データベース ファイルではなく FLAT ファイルであると仮定すると、どちらの方法にも実際に長所と短所があります。

  1. ファイルの内容をその場で上書きするだけでは、再割り当ての手順を確実に回避できます。そのため、少し時間を節約できる可能性があります。ただし、ピースの配置は最適ではない可能性があります。

  2. ディスクの断片化に応じて、より最適なデータの配置が得られる可能性があります。ただし、スペースを割り当てる必要があるため、少し遅くなります。また、より安全な設定で実行している場合は、割り当て前にブロックをゼロにするのに時間がかかります。

関連情報