Hatena::ブログ(Diary)

kazuhoのメモ置き場

2009-12-21

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 だとほぼ関係ないけど。

kosakikosaki 2009/12/21 20:03 ワーカープロセス数で割るぐらいなら、最初からPssで計算してもいいのでは?
スクリプト読んでないので外してるかもしれませんが。
Pss = RSS / 共有プロセス数 です。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kazuhooku/20091221/1261392787