Apacheのプロセス毎のメモリ使用量【小ネタ】

Apacheに関する小ネタです。

Apacheのパラメータチューニングをする上でプロセス毎のメモリ使用量を調べたいという場面があると思います。

その時参考にしたサイトはこちらです。
https://youhey.hateblo.jp/entry/20110115/1295060276
https://naoya-2.hatenadiary.org/entry/20080212/1202830671

プロセス毎のメモリ使用量は単純に「/proc/(PID)/status」のVmHWMを見ればいいわけではないようです。親プロセスから子プロセスをforkすると、子プロセスが親プロセスのメモリ空間を共有するため、共有分を考慮しないといけません。

※この共有分を考慮しないと、1プロセスあたりのメモリ使用量を実際よりも多く見積もってしまうため、オーバースペックのWEBサーバになってしまう可能性があります。

naoyaさんのサイトでは共有分を計算するのにPerlを使っていますが、私はPerl使いではないので、別の手段は無いかと考えた結果、「/proc/(PID)/smaps」をawkで解析する手法にたどり着きました。

「/proc/(PID)/smaps」はrootユーザにしかread権限が無いので、それを踏まえて以下のコマンドを実行します。(Apacheのプロセス名がhttpdである前提)

echo -e "PID\tPPID\tRSS\tSHARED\tPRIVATE";ps -ef|grep httpd|grep -v grep|while read line;do args=(${line});echo -ne ${args[1]}"\t"${args[2]}"\t";sudo cat /proc/${args[1]}/smaps|awk 'BEGIN{rss=0;shared=0;}/Rss/{rss+=$2;}/Shared/{shared+=$2;}END{printf("%.1f\t%.1f\t%.1f\n",rss/1024,shared/1024,(rss-shared)/1024);}';done

Apache起動直後は子プロセスが親プロセスのメモリのほとんどを共有しているため、ある程度Webサーバにアクセスがあった後に計測した方がより適切な結果が得られるようです。

Apacheのメモリ使用量を計測する際の参考になれば!