linuxで httpd が使ってるメモリ総量を調べる話

Perl等のLLでウェブアプリケーションサーバを書いていると、普通はマルチプロセスモデル (apache なら prefork とか) で運用することになると思う。で、それらがどれだけメモリを使っているか、っていうのはチューニングにおいて重要になってきたりする (んじゃないかと思う) けど、そもそもメモリの総使用量をどうやって測定するのか。

20:20追記: PSSを使ってワンライナーで測定するのが簡単 (コメント欄参照)。kosakiさんありがとうございます。

$ sudo perl -le 'for my $p (@ARGV) { open my $fh, "< /proc/$p/smaps" or die $!; map { /^Pss:\s*(\d+)/i and $s += $1 } <$fh> } print $s' `pgrep plackup`
914325

以下は初回投稿時の記事:

Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる - naoyaのはてなダイアリー の naoya さんのスクリプトを使ってワンライナー的に処理してみた。

$ sudo ./shared_memory_size.pl `pgrep plackup` | perl -le '<>; while (<>) { /^(\d+)\s+(\d+)\s+(\d+)/ or die; $s += $1 == 11628 ? $2 : ($2 - $3) } print $s'
927352

この環境 (パストラック) は、Plack::Server::Standalone::Prefork::Server::Starter を使って 40 worker (+親プロセス) で動かしてるんだけど、メモリの総使用量は 927,352KB なのがわかる。ワーカープロセス数で割ってみると、1プロセスあたり 23.2MB。

上の 11628 てのが、親プロセスの pid なので、適当に書き換えるなりすると mod_perl のメモリ使用総量を計算したりするのにも使えるはず。ただ、プロセスの親子関係や prefork のモデルによっては誤差が大きくなるかもしれないので注意は必要。

あと、mmap されてる領域のサイズは反映されてないと思う。Perl だとほぼ関係ないけど。