Web サービスを高速化するコツは壱にキャッシュ弐にキャッシュ
えーっと、いきなりですがタイトルが全てです。ここ最近痛感しているのが Web サービスの応答を高速化するコツは
- キャッシュを如何に利用するか
- キャッシュを利用可能とするための仕掛けを如何に作り込んでいくか
に尽きると思います。単純に squid 等のキャッシュサーバをフロントに置けと言うことを言っているのではなく、動的コンテンツを生成するスクリプト内にキャッシュ可能なポイントを作っていくことが重要と言うことを指しています。もう少し具体的にMVCモデルで話をしてみるとこんな感じです。
- Model ではデータベースのキャッシュヒット率を上げるとかデータベースの性能を最大限に引き出すのと同時に、アプリ内でも透過的キャッシュを利用するとかでデータベースへ利用を極力避けることで更なる高速化がねらえる。
- View なら Template のキャッシュを利用するとか毎度パースするコストを下げたり、生成したコンテンツそのものをキャッシュして再利用することで高速化がねらえる。
- Controller なら同じビジネスロジックで計算される複雑な値(結果)をキャッシュしたり、適切なアルゴリズムを利用することで高速化がねらえる。その他、エラー処理も如何に簡潔に書くかでも速度がかなり変わってくる。
と誤解を恐れず勝手にまとめてます。
なんでそもそもこんな事を書いたかと言いますと、ここ最近ですが本業の方のがサーバの負荷が高いんですよね。で3ヶ月後にリース公開の時期が迫ってきているのですが、なにしろサーバの入れ替えという行為が凄く億劫です。確かに3年も経つとサーバのスペックも大凡2倍程度は向上していてベンチとってみても2倍程度は速くなってるパターンが多いです。
が、スクリプトの応答を2倍にすることでも同じ効果が得られます。(厳密には違うけどまぁそんな感じで・・・)
で、約6年前に自分が作り置いていったプログラムを全体的に見直しています。6年前に自分には先ほどのまとめの考えは皆無で如何に高速な演算をしてエラー処理をキッチリ馬鹿マジメにするかという観点でプログラムを書いていたようです。
手っ取り早く Model、View あたりから進めようかと考えてみたところ、Model は Oracle が快調に動作しているけど透過的キャッシュを入れるのは変更点が多くて面倒くさいんで、View のテンプレートエンジンに手を加えようかと考えました。独自のテンプレートエンジンを使っていてこれがめっっさ遅い。パーサーも HTML::SimpleParse で解析した後に独自のタグをゴリゴリ解析していくというやり方。
いろいろベンチをとってみると、以外や XS でコアが書かれている HTML::TokeParser よりちょい遅い程度なんですけど HTML::SimpleParse のパース結果が変な場合があることも発見したり。よくみたらその不具合を前提とした処理でプログラムの流れが作られていたり・・・|ι´Д`|っ
むぅ・・・
高速化ポイントをまとめてみるのは簡単でも、こりゃ実際やり始めてみると一筋縄ではいかんですな。
取りあえずパース部分とコンテンツ生成部分を分離してパース結果をキャッシュすることから初めて見るか。ってかこれくらい思いつけよ6年前の自分。
コメントやシェアをお願いします!