2010-12-08 1 views
1

現在、プロセス間でデータを共有するために大きなmmapファイルを使用するApacheモジュールを作成しています。これは起動時に作成され、サーバーがシャットダウンすると削除されます(後の段階で保持することを選択できます)。私はこれをApache APRライブラリを使って実装しましたが、少なくとも小規模なファイルではうまくいきます。Apacheモジュールのメモリマップファイルの過度の同期

しかし、メモリマップされたファイルのサイズが大きくなると(サーバーが稼動しているときにキャッシュするために十分なRAMがまだ残っています)、システムはオペレーティングシステムのように仮想的に停止します(私の場合Linux)ファイルをディスクと同期させるために多くのリソースを消費します。この同期を制御/削減する方法はありますか?

私は現時点ではディスクに同期されたコンテンツを必要としないので、代わりに共有メモリセグメントを使用してください。私はまだメモリマップされたファイルの同期を制御する方法に興味があります。

答えて

2

ダーティページ - バッキングストア(この場合はディスク上のファイル)に書き込む必要があるメモリページです。

汚れたページの書き込みは、/proc/sys/vm/のいくつかのつまみで調整可能です。特に、マッピングされたファイル内のダーティデータの量が通常、システム全体のメモリに比べて大きい場合は、dirty_ratioを大きく(たとえば60に)、dirty_background_ratioを少し大きく(たとえば30に)増やしたい場合があります。

dirty_expire_centisecsを増やすこともできますが、既定値は既にかなり長いです(5分)(ダーティデータが届くまでには書き出しに適する年齢です)。

共有メモリへの切り替えは、マップファイルを/dev/shm/に作成するだけです。ディストリビューションにはtmpfsがマウントされていることが前提です。

0

メモリマッピングされたファイルは、明示的にmsync()と同期されますが、OSはページフォールトの発生時にメモリの内容をフラッシュできます。だから、いくつか探してみましょう:

  1. Apache APRライブラリのソースコードは、多くのmsync()を持っていますか?
  2. アプリケーションがメモリ内をジャンプしていますか?つまり、非連続メモリにアクセスしていますか?これは、不適切なデータ構造やネストされたループインデックスが多次元配列インデックスと一致しない場合によく発生します。

コードをプロファイリングして、予期せぬ数のページフォールトにつながる非効率性があるかどうかを確認できます。

+0

APRライブラリは、メモリマップファイルの作成を処理するだけで、msync()呼び出しは含まれません。私は自分のコードでmsync()も呼び出さない。しかし、ファイルにはキャッシュされたデータが含まれているので、私のコードはメモリ内でかなりジャンプします。 – Chris

+0

ワニスウェブキャッシュに関するアーキテクチャノートのいくつかをお読みください。これらの論文は、メモリマッピングを効率的に処理する方法を示しています。 – chrisaycock

関連する問題