仙台の山奥で自転車に乗ったり転んだり

愛車の GIOS でサイクリングしたりポタリングしたり、それをブログに記録してみたり。ロードバイクや自転車や坂のことを書いてみたり。ときたまプログラムのことを忘れないようにメモってみたり。

Apacheチューニングのためのメモリ使用量計算

「/proc/(pid)/status」のメモリサイズからメモリ消費量をリストアップするスクリプトを準備した。
「サーバ/インフラを支える技術」に載っている、id:naoyaさんの共有しているメモリのサイズを計算するスクリプトとあわせて、エクセルに落とし込んでごにょごにょと計測してみる。
http://d.hatena.ne.jp/naoya/20080212/1202830671
http://archive.linux.or.jp/JM/html/LDP_man-pages/man5/proc.5.html

[www]~ $ cat memory_size.sh 
#!/bin/sh

GREP="/bin/grep"
AWK="/bin/awk"
PRINTF="/usr/bin/printf"

if [ $# -lt 1 ]; then
    echo "usage: ${0} [pid ...]" 1>&2
    exit 100
fi

$PRINTF "PID\tRSS\t(peak)\tVM\t(peak)\n"

for p in $@
do
    status="/proc/${p}/status"
    if [ -f $status ]; then
        rsssize=`$GREP '^VmRSS:' $status | $AWK '{print $2}'`
        rsspeak=`$GREP '^VmHWM:' $status | $AWK '{print $2}'`
        vmsize=`$GREP '^VmSize:' $status | $AWK '{print $2}'`
        vmpeak=`$GREP '^VmPeak:' $status | $AWK '{print $2}'`
        $PRINTF \
            "%d\t%d\t(%d)\t%d\t(%d)\n" \
            $p \
            $rsssize \
            $rsspeak \
            $vmsize \
            $vmpeak
    fi
done
for p in `pgrep httpd`; do grep "^VmHWM:" /proc/$p/status |awk '{print $2}'; done

で、すみそうな気も。

[www]~ $ ./memory_size.sh `pgrep httpd`
[www]~ $ sudo ./shared_memory_size.pl `pgrep httpd`

からエクセルにデータをもっていて、ごにょごにょと(古いプロセスと新しいプロセスのデータは破棄して、平均を算出、共有を考慮した消費量を予測)……。
Apache+CakePHPWebサービスを計測して)おおざっぱに、↓のような数値が算出できた。いまいち計算結果に自信がもてないけど……。

  • 実メモリ上ページサイズ
    • 平均26.77MB
    • 最大31.38MB
    • 最小20.9MB
  • 実メモリ上ページサイズ(ピーク)
    • 平均31.34MB
    • 最大32.91MB
    • 最小30.21MB
  • 共有率
    • 平均32%
    • 最大41%
    • 最小27%

計算結果から、Apacheプロセスのメモリ使用量を32MBと想定、平均して32%程度のメモリを共有するものとして、Apacheプロセスが消費するメモリの予想は平均21.76MB程度か。
Webサーバには4GBを搭載しているので、OSが512MB程度占有するものとして、「(4GB - 512MB) / 21.76MB」でApacheに割り当てられそうなプロセス数は164と算出できる。
余裕をもたせるとして、100〜150程度の設定が妥当そうか。