質問: 大きなファイルの同期freebsd 私はこれに頭を悩ませるのに苦労しています。私のテストセットアップでは、1gファイルで「ls-la」を継続的に呼び出し、最後に実行されてからの時間を出力するシェルスクリプトがあります。次に、プログラムを実行してファイルの一部を変更し、ディスクに同期します。fsyncを呼び出すか、システムが同期を行うか、またはpwriteを使用してさまざまな部分を書き込む(まだそのビットをテストしている)かどうかは関係ありません。同期が発生すると、「ls-la」は全体でフリーズします同期の時間-7〜40秒(変更の希薄性によって異なります)。msyncを使用して一度にチャンクを同期する場合、または書き込み中にfsyncをより頻繁に実行しようとすると、期間ははるかに長くなります(10倍の長さかもしれませんが、実行頻度によってはさらに長くなります)。上記のmsyncは、ページがシーケンシャルであっても、16kb /トランザクションでのみ書き込みます。openbsdが「部分的なファイル書き込み」などを実装していることをどこかで読んだことがあります。今はよく覚えていません。とにかく、ファイルがずっとロックダウンされることなく、fsyncの効率で同様のことを行うことができますか?実際、「a」の問題(この「b」が解決策だと思います)は、単に大きなファイルを処理し、必要に応じてメモリをすばやく解放できるように、ディスクに書き込むように「奨励」することです。あります。 no_syncを省略するだけでは、変更がほぼ同時に発生し、この状況が発生するため、適切ではありません。他のmadviseオプションのどれも役に立たないようです。つまり、同期しないと、メモリが不足して突然スワップが開始されるまでページが動かなくなったように見えます(ただし、16kb /トランザクションと非常に低いmb /秒です)。freebsdで大きなファイルをどのように処理しますか?解決:msyncチャンクを調整し、msync呼び出しでms_syncの代わりにms_asyncを使用することで、他のプロセスがファイルを開いてmmap /読み取りできるようにしながら、必要なパフォーマンスを得ることができることがわかりました。
回答: http://www.unix.com/man-page/freebsd/4/syncer/ あなたの問題を明確に説明します。シンカーはダーティバッファー(更新されたキャッシュ)をディスクに定期的にフラッシュします。これらの「定期的な」フラッシュは避けたいものです。 sysctlが問題に対して何ができるかを確認してください。