httpdの利用メモリを計算してみた(コード修正あり、2008/8/24に2つ目修正)
先人の知恵=Linux のプロセスが Copy on Write で共有しているメモリのサイズを調べる - naoyaのはてなダイアリーを拝借して、bashとawkでやってみた。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シリーズ)
- 作者: 安井真伸,横川和哉,ひろせまさあき,伊藤直也,田中慎司,勝見祐己
- 出版社/メーカー: 技術評論社
- 発売日: 2008/08/07
- メディア: 単行本(ソフトカバー)
- 購入: 133人 クリック: 2,270回
- この商品を含むブログ (284件) を見る