web-dev-qa-db-ja.com

ディスクへの書き込みを積極的にフラッシュする方法は?

X86_64デバイスでUbuntu18.04を使用しています。

私は何ヶ月もの間、アプリケーションの構成ファイルが破損しているという自分自身を再現できないという不思議な問題に悩まされてきました。昨日、私はついにそれが2回発生するのを見て、問題の原因を特定しました。ユーザーは、SFTP経由で新しい構成ファイルをアップロードした後、デバイスの電源を引いて再挿入し、デバイスを再起動していました。

OSはディスク書き込みをバッファリングし、後でそれらをディスクにコミットするタイミングを選択していると思います。バッファがフラッシュされる前にデバイスの電源がオフになると、書き込みは失われます。これは、ファイルが破損していることを示しています。サイズはゼロです。

明らかな解決策は、この(恐ろしい)慣行をやめ、ユーザーにデバイスを安全に再起動するように促すことです(再起動すると書き込みがフラッシュされるため)。私はこれを奨励しようとしますが、残念ながら、ユーザーは電源を引いてデバイスを再起動できることに慣れています。これは悪いことですが、正しい方法でそれを始めるようにみんなに言うのは簡単ではありません。

したがって、私の最初の質問は、書き込みを積極的にフラッシュする方法があるかどうかです。これにより、書き込みがディスクにすばやくフラッシュされる可能性が高くなります。この動作に影響を与えるカーネルパラメータを調整する方法があると思います。

重要なファイルのアップロードのほとんどすべてが1つのアプリケーション固有のディレクトリにあることを認識しました。そのため、ディレクトリへの書き込みをリッスンし、書き込みのたびにディスクの同期を強制するプログラムを使用できるかどうかも疑問に思います。これは、OS全体ではなく、そのディレクトリに対してのみクイックフラッシュを強制するため、望ましい場合があります。同様に、ディスクの単一のパーティションにのみ影響するソリューションがある場合は、アプリケーション固有のファイルを専用のパーティションに移動するのが簡単なので、それで十分です。

Linuxにディスクへの書き込みを積極的にフラッシュするように指示する最良の方法は何ですか?特定のディレクトリに対してのみ、またはディスクパーティションに対してこれを効果的に行うソリューションはありますか?

1
millinon

fsync のファイルのみ、または(メタデータの変更なし) fdatasync のファイルシステム、 syncfs のファイルシステム、または-のすべてを同期できます。 同期 。しかし、単なるディレクトリ? sync /var/log/syslogは、ディレクトリのみを同期する例です。

1
K7AAY