weblog of key_amb

主にIT関連の技術メモ

Cache::FastMmapと仮想メモリ

FastCGIの全プロセスでデータを共有したくて、Cache::FastMmapを使ってみた。

共有のshare fileを使う。

package MyApp::API::Cache;

use Cache::FastMmap;

my $fastMmap = Cache::FastMmap->new(
	share_file  => '/tmp/sharefile-myapp-fastmmap',
);

みたいな形。

これによりサーバー、プロセスのメモリ/仮想メモリ使用量がどう変わるかのイメージが以下:

使用前
top - 09:53:59 ...
:
Mem:   2097284k total,   251180k used,  1846104k free, ...
Swap:  1052248k total,    47064k used,  1005184k free, ...

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26136 key_amb   17   0 92485  99m 7452 S  0.0  4.9   0:03.25 index.fcgi
:
Cache::FastMmap 使用後
top - 09:53:59 ...
:
Mem:   2097284k total,   232180k used,  1846104k free, ...
Swap:  1052248k total,    85064k used,   967184k free, ...

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26136 key_amb   17   0  130m  80m 7452 S  0.0  4.0   0:03.25 index.fcgi
:

以下、まとめ:

  • プロセスでメモリに持っていたデータを仮想メモリ領域にマッピングすることで、プロセスごとのメモリ使用量は減り、仮想メモリの使用量が増える。
  • サーバ全体としては、データ量×プロセス数分のメモリ使用量が減り、データ量分の仮想メモリ使用量が増える。

問題点

  • Cache::FastMmap::newはファイル新規作成時に排他制御しないらしく、上のMyApp::API::Cacheを複数プロセスで同時にuseするとエラーになることがあった。その対処はまた別の記事で。