1

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

ただし、メモリマップファイルのサイズが大きくなると(サーバーの実行中にキャッシュするのに十分なRAMがまだあります)、オペレーティングシステム(私の場合はLinux)が大量のファイルを消費しているように見えるため、システムが事実上停止することがありますファイルをディスクと同期します。この同期を制御/削減する方法はありますか?

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

4

2 に答える 2

2

マップされたファイルに書き込むと、ダーティページが作成されます。メモリページは、ある時点でバッキングストア(この場合はディスク上のファイル)に書き出す必要があります。

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

増やすこともできdirty_expire_centisecsますが、デフォルトはすでにかなり長い(5分)です(これは、ダーティデータが書き込みの対象になる前に到達する必要がある年齢です)。

/dev/shm/共有メモリへの切り替えは、ディストリビューションがそこにマウントされていると仮定すると、マップされたファイルをで作成するだけの問題であることを指摘しておく価値がtmpfsあります。

于 2010-12-09T02:50:57.997 に答える
0

メモリ マップト ファイルは と明示的に同期されますがmsync()、OS はページ フォールトが発生した場合にメモリの内容をフラッシュできます。したがって、探すべきことがいくつかあります。

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

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

于 2010-12-08T15:21:17.353 に答える