メモリを活用したサーバの高速化(分析〜対処)

最近ヤマレコのサーバが遅くなっていたので、色々と調べてみました。
今回は高速化の対応として、メモリをうまく使うツールを導入することにしました。

サーバ性能監視ツールによる分析

まず、現状のサーバ性能を見るために、
http://munin.projects.linpro.no/:muninをインストールして、
グラフを眺めてみました。



図:CPU利用率


CPU利用率を見ると、夜間のバッチ処理で少し負荷が上がりますが、
全体的に見て余裕があるので、おそらくI/O待ちで
性能ネックになっているのだろうと考えました。

PAE対応によるメモリ拡張

muninのメモリ利用量グラフを見て初めて気づいたのですが、
メモリを6GB積んでるはずなのに、3GBしか認識されていませんでした。
メモリを有効活用するために、KernelをPAE対応に変更しました。


方法はyumでインストールするだけなので、非常に簡単でした。

# yum install kernel-PAE


あとは、grubの設定を書き換えて、PAE対応のカーネルで起動するようにします。

# vi /etc/grub.conf


古いカーネルがデフォルト起動になっている(default=1)
ので、PAE対応のカーネルがデフォルトになるように修正(default=0)します。

default=0
timeout=5
splashimage=(hd0,2)/boot/grub/splash.xpm.gz
hiddenmenu
title Fedora (2.6.23.17-88.fc7PAE)
        root (hd0,2)
        kernel /boot/vmlinuz-2.6.23.17-88.fc7PAE ro root=/dev/md2 rhgb quiet
        initrd /boot/initrd-2.6.23.17-88.fc7PAE.img
title Fedora (2.6.23.17-88.fc7)
        root (hd0,2)
        kernel /boot/vmlinuz-2.6.23.17-88.fc7 ro root=/dev/md2 rhgb quiet
        initrd /boot/initrd-2.6.23.17-88.fc7.img

リブートすると、メモリが増えていることが分かります。

#cat /proc/meminfo
MemTotal:      6099484 kB
...



図:メモリ利用率の遷移


まぁ、もともと余裕があったのですが、とりあえず6GBまで認識するようになりました。

phpのコードをメモリキャッシュする(APC

メモリを有効活用する方法として、PHP の実行コードをキャッシュする手段を取ります。

# yum install http-devel
# pecl install APC


php.iniを編集します。以下の行を追加しました。

extension=apc.so
apc.shm_size=324
apc.user_entries_hint=320000

メモリが余ってるので、今回は300M程キャッシュに割り当てました。

あとはapacheを再起動するとOK!


/usr/share/pear/apc.php
HTTPDのフォルダにコピーしてみると、利用状況が確認できます。


図:APCの利用状況



図:APCの利用状況(グラフ)


100MB強のキャッシュ利用なので、300MB程度で十分足りているようです。


このAPCの導入だけで、体感速度が何倍も速くなった気がします。
興味のある方は、比較評価をやってるサイトもあるので探してみてください。

DBのインメモリキャッシュを使う

本当はここまでやりたいのですが、十分性能が速くなってしまったので
棚上げにしておきます。


APCmemcachedを使って、
・一度DBから読み込んだら、メモリキャッシュに格納
・DBに書き込むときに、メモリキャッシュを消す or 更新する
という作りにすれば良いはずです。


また性能が落ちてきたら、これも対応します。