某日、PeerCast Gateway のページロードが超重くなった(10秒くらい)。 この時使用していたユーザーは4人で、以前4人までなら大丈夫だったので、 ちょっとびっくり。

チャンネルのリレーはちゃんとできているから、どうもペカステじゃなくて純 粋にWebアプリ側の問題らしい。VPSのコントロールパネルを見ると、結構ディ スクアクセスが多い。

cpu disk traffic

多い時で500KB/秒くらいか。ログファイルの書き出しなどでは考えにくい量な ので、DBの更新処理だと見当をつけた。atop でプロセスのディスクI/Oを見る とやはりruby で書かれた Web アプリのプロセスが大方を占める。

atop

そう言えば通知の既読を管理するために、ユーザーの最終使用時刻をページロー ドの度に更新している。深夜は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 コマンドに渡すディレクトリ名は、最後がスラッシュで終わらないと挙 動が変わるので注意。

cpu disk traffic

とりあえずディスクアクセスが減った。ページロードが重くなる問題が解決し たかは、わからないけど。