httpdの利用メモリを計算してみた(コード修正あり、2008/8/24に2つ目修正)

先人の知恵=Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる - naoyaのはてなダイアリーを拝借して、bashawkでやってみた。Linuxカーネル 2.6.14以上だそうなので、手元のサーバのうち、CentOS4.xではこの技は使えないらしいが、Fedora Core5は使えた。CentOS(Redhat Enterprise Linux)5も大丈夫。
註:親プロセスのサイズは無視しているし、共有されている領域(当然親プロセスのメモリサイズより小さい)も無視している。この場合、MaxClientsを増やしたときの限度を調べるためのデータとして考えているから。それと、親プロセスのpidを調べるのに/var/run/httpd.pidを使ってますが、これはインストールの条件や、ディストリビューションによって違うでしょう。
(2008/8/22 16:18コード修正しました。2008/8/24 13:35頃にもコード修正しました)

#!/bin/bash

HTTPID=`cat /var/run/httpd.pid`
PROCOUNT=`ps --ppid $HTTPID | wc -l`

ps --ppid $HTTPID | awk '/^([ ])*[1-9]/{print $1}'  | while read pid
do
        awk '/^Shared_Clean/{sc+=$2}
             /^Shared_Dirty/{sd+=$2}
             /^Private_Clean/{pc+=$2}
             /^Private_Dirty/{pd+=$2}
             END{
                print "Share",sc+sd,"Private",pc+pd,"Total=VmRSS",sc+sd+pc+pd
        }' /proc/$pid/smaps
done | awk -v procount=$PROCOUNT '{share=$2; private+=$4; total+=$6}
            END{
                print "usual shared memory",share,"KB,",
                "private and dirty",private,"KB,\n",
                "VM total",total,"KB,",
                "Private realestate",private,"KB,\n",
                "Real/Virtual percentage",100*(share+private)/total,"%,\n",
                "for each process uses", (share+private)/procount,"KB"
                }'

手元のヒマなサーバで実行してみた。httpdなんて10個も走ってないし、ろくにモジュールも使ってない。

# sh  httpdmemcount.sh
usual shared memory 5532 KB, private and dirty 6844 KB,
 VM total 12376 KB, Private realestate 6844 KB,
 Real/Virtual percentage 100 %,
 for each process uses 1125.09 KB

もともとは立ち読みした「サーバインフラを支える技術」

2,3日前に本屋で立ち読みしてたら、「あれっ」と思ったのでした。httpdに必要なメモリの量は、psコマンドのデータとずいぶん乖離してたんで「経験と勘」に頼ってた、つまり、メモリのスラッシングが起きる限界のプロセス数をモニタして、MaxCilentsの数を調整してたのでした。それがちゃんと式になってたので、帰って検索したら、「このエントリー、読んだことあるやん」orz...
とりあえず多謝です。

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ?スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)