バックエンド(サーバ)側のパフォーマンスチューニングについて調べた情報をまとめてみる。
パフォチューの方法は大きく分けて3つ。
1.キャッシング
・同じ結果を何度も返す場合に有効。例えば静的なページとか。
・Railsのキャッシュ機能についての解説
・↑のサイトでは触れられてないけど、Action Cacheはフィルタ処理が実行されるらしい書いてありましたね。すみません。
・memcachedというプログラムでMySQLクエリのmemory cacheができるっぽい。解説サイト
・memcachedが落ちてもWebアプリを巻き込まないようにする方法
・DreamHostではmemcachedは使えないらしいorz
・オブジェクトをファイルシステムにキャッシュする方法。できればメモリ上にキャッシュしたいけど、それはできないのかな。
・キャッシュの有効期間はキャッシュされるデータの更新頻度によって決めるべきだが、どうやって定量化するのかがわからない。例えば、データの更新と更新の間隔が平均2日、分散0.5日の正規分布に従う場合、キャッシュの有効期間はどれだけにすべきか?
2.クラスタリング
・クラスタリングが有効かどうかは読み出しと書き込みの比率による。読み出しの比率が大きいほど有効。書き込み時はクラスター間でデータを同期するための処理が必要。
・上記理由にWebサーバ、書き込みの少ないDBについては有効。
・書き込み処理が多い場合でもDBを分割することで適用可能。
・適用事例:Google MapReduce等他多数。
・参照用DBをメモリ内に生成するという変わったクラスタリングの例。面白いかも。Magic Multi-Connectionsを使って実装してみたい。
・RailsDB負荷分散まとめ
3.アルゴリズムの改良
・全文検索にsennaやMySQLのFULLTEXTのようなインデックス検索を導入する。(DreamHostでは使えないけどね。。)
・htmlのレンダリングをErubisを使って高速化する
・ActiveRecordを使う際の注意書き。結論は「findメソッドでは必ず:selectで必要なカラムのみ指定しよう」「migraitonで:string型を使う場合は:limitを指定しよう」
フロントエンド側のチューニング
1.HTTPリクエストを減らす
・rmagickでサムネイル画像を結合して一枚の大きな画像として送る
その他
○面白そうなplug-inを発見
・acts_as_taggable_on_steroids タグ機能を追加できる
・acts_as_versioned データのバージョン管理ができる
導入しようかな。
○ログにパスワードを出力しない方法
○Railsのwiki