it-swarm-ja.com

大きなファイルの同期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 /読み取りできるようにしながら、必要なパフォーマンスを得ることができることがわかりました。

6
Haru

問題(ファイルの状態の監視)を完全に間違って解決しています。ファイルの状態を定期的に再チェックする(そして時々I/O同時実行の問題が発生する)代わりに、プログラムは特定のファイル(またはファイルのコレクション)が変更されたときにカーネルに通知するように要求するだけです。

これを行うメカニズムはすべての最新のUnixに存在しますが、残念ながら、それらは同じではありません...

UnixのBSDファミリでは、これは kqueue/kevent で行われます。 Linuxにはinotifyがあります。 Solarisには、pollと/ dev/pollがあります。

OS実装の詳細を隠し、ポータブルAPIを提供するクロスプラットフォームライブラリがあります。移植性が必要な場合は、File Alterations Monitorまたは gamin (/ usr/ports/devel/gaminに移植)と呼ばれる最新のサブセットを探してください。アプリケーションが(無料)BSD専用の場合は、kqueue/keventを直接使用できます。

1
Mikhail T.

freeBSDは、他のUNIXと同様に、空きメモリを使用してディスクI/Oをキャッシュします。空きメモリが多く、ユーザーが少ないシステムでは、非常に大きなファイルを完全にメモリに保存できます。より多くのメモリが使用されているように見えるようにします。

close()fclose())およびfsyncfflush() )は、OSにキャッシュの書き込みを強制する唯一のシステムコールです。これは、次の場合にのみ当てはまります。他のプロセスでファイルが開かれていません。freeBSDには、キャッシュされたデータを書き込むだけで、メタデータを物理ディスクに書き込むfdatasyncがありません。

BSD 4.4以降mincore()syscallを使用してページングとファイルキャッシュを追跡できます。

したがって、数回の書き込みごとにフラッシュする必要があります。

ディスクキャッシングパラメータで遊ぶ:

http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-disk.html
1
jim mcnamara

http://www.unix.com/man-page/FreeBSD/4/syncer/

あなたの問題を明確に説明します。シンカーはダーティバッファー(更新されたキャッシュ)をディスクに定期的にフラッシュします。これらの「定期的な」フラッシュは避けたいものです。 sysctlが問題に対して何ができるかを確認してください。

0
jim mcnamara