PeerCast Gateway が重かったので DB を tmpfs に置いてみた
某日、PeerCast Gateway のページロードが超重くなった(10秒くらい)。 この時使用していたユーザーは4人で、以前4人までなら大丈夫だったので、 ちょっとびっくり。
チャンネルのリレーはちゃんとできているから、どうもペカステじゃなくて純 粋にWebアプリ側の問題らしい。VPSのコントロールパネルを見ると、結構ディ スクアクセスが多い。
多い時で500KB/秒くらいか。ログファイルの書き出しなどでは考えにくい量な ので、DBの更新処理だと見当をつけた。atop でプロセスのディスクI/Oを見る とやはりruby で書かれた Web アプリのプロセスが大方を占める。
そう言えば通知の既読を管理するために、ユーザーの最終使用時刻をページロー ドの度に更新している。深夜はVPSのディスクが忙しくなるので、アクセスが 遅くなってWebアプリのプロセスがブロックしているのかもしれない。
でも、時刻フィールドを更新するのにこんなに書き込むか? バックエンドが SQLiteだからかも。本番環境で使うものじゃないよっていう説はあるかもしれ ない……。
対策として、安直にデータベースファイルをRAMディスクなファイルシステム である tmpfs に置くことにした。今流行のインメモリデータベースだぜ。い えーい。
ここのやり方やデー
タ永続化用 rc スクリプトを参考にした。アプリのディレクトリは
/home/plonk/jimson
で、db/
にデータベースファイルがあるので、その辺を
カスタマイズする。
/etc/fstab:
tmpfs /home/plonk/jimson/db tmpfs defaults,size=50M 0 0
/etc/init.d/ramdisk:
#! /bin/sh
# /etc/init.d/ramdisk
#
PERSISTENT_LOC=/home/plonk/db-backup/
RAMDISK_LOC=/home/plonk/jimson/db/
/etc/init.d/ramdisk:
case "$1" in
start)
echo "Copying files to ramdisk"
rsync -av ${PERSISTENT_LOC} ${RAMDISK_LOC}
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched from HD >> /var/log/ramdisk_sync.log
;;
sync)
echo "Synching files from ramdisk to Harddisk"
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
rsync -av --delete --recursive --force ${RAMDISK_LOC} ${PERSISTENT_LOC}
;;
stop)
echo "Synching files from ramdisk to Harddisk"
echo [`date +"%Y-%m-%d %H:%M"`] Ramdisk Synched to HD >> /var/log/ramdisk_sync.log
rsync -av --delete --recursive --force ${RAMDISK_LOC} ${PERSISTENT_LOC}
;;
*)
echo "Usage: /etc/init.d/ramdisk {start|stop|sync}"
exit 1
;;
esac
exit 0
rsync コマンドに渡すディレクトリ名は、最後がスラッシュで終わらないと挙 動が変わるので注意。
とりあえずディスクアクセスが減った。ページロードが重くなる問題が解決し たかは、わからないけど。