こんばんわ。misneyです。
土曜日はお休みでした。
金曜日にGさんとЯYUさん、Big Buddhaさん、aluさん、J2xCさんらと飲みに行き、結構遅くまで飲んでいたせいか夕方まで寝てました。
さて、この間の休みもそうだったんですが寝すぎで寝れません。
この時間に寝れないと暇で仕方ないのです。
と、いうことで今日はキャッシュについて話したいと思います。
キャッシュが大好きな件僕はこのキャッシュと言うのが大好きです。
プログラムで扱うキャッシュも、給料日後に増えるキャッシュも。
普段プログラムを書く時に、なるべく効率の良いキャッシュを考えながら作るのです。
・クライアントサイドのキャッシュ
訪問者のPCにデータを保存させていただく
・ページキャッシュ
URL毎に生成されるHTMLデータを保存しておく
・コンテンツキャッシュ
HTMLのブロックごとにHTMLデータを保存しておく
・クエリキャッシュ
データベースから取得した結果を保存しておく
こんな感じのキャッシュが存在するのかな?と思います。
この辺のどれを使うかを、コンテンツの内容や色々な場面に応じて考えます。
mod_cacheはページキャッシュになると思うので、ページキャッシュのお話になります。
mod_cacheについてhttpdは基本的にapacheを使用しています。
apacheは非常に多くのモジュールが存在していて、いろんな機能を使うことが出来ます。
その中の
mod_cacheについて書いてみたいと思います。
mod_cacheは、動的に生成されるページなどをキャッシュしてそれを表示してくれるような機能を持っています。
絵に書くとこんな感じ。すいません。絵心が無くて。
言葉で説明すると、下のようになるんです。
・訪問者がHTTPリクエストを送る
・mod_cacheがキャッシュの有無やリクエストヘッダを見て、キャッシュを使うか判断
・キャッシュを使っちゃおう!の場合はキャッシュデータを送り返す
・キャッシュは使わない って時は動的にページを作成
要は表示スピードが早くなるんです。
サーバーコストを下げることが出来る ⇒ ランニングコストが安くなる!
こんな恩恵が頂けるのです。
このキャッシュは以下のような場合に使えます。
・PHPやperlなど、動的に作成されるページ
・更新頻度が低い、もしくは一定時間ごとに更新される
・他のページとの整合性を取らなくても良さそう
例えば、リアルタイムにページの情報が更新されるような場合にはあまり使えないということ。
HTMLなど静的な場所にはあまり使えないということ。
(memoryを使えば少し恩恵がいただけるかも)
mod_cacheはmod_disk_cacheとmod_mem_cacheのいずれかの方法を選ぶことが出来ます。
名前のまんまですが、HDDを使うかmemoryを使うかって話ですね。
余談ですが、私はメモリを使ったキャッシュが大好きです。
memcachedを始めとして、色々と使っています。
最近はtmpfsを使うのが自分の流行です。
mod_disk_cacheとmod_mem_cacheさて、mod_disk_cacheとmod_mem_cacheのどちらが良いかというと、好みの分かれるところだと思います。
mod_mem_cacheで検索をかけて見つけた
なんとなく@さんのページを拝見すると、どうもプロセス毎にキャッシュを生成するとのこと。
マルチスレッド MPMを使うといいんじゃない?ってなことが書かれていますが、PHPを使っていると、あまりworkerは使わない気がします。
非推奨とされているからですね。
私としては通常はmod_disk_cache。リバースプロクシとして使う場合はmod_mem_cacheかなーって考えてます。
mod_disk_cacheの動きさて、mod_disk_cacheを使うと、以下のような2つのファイルがCacheDirLevels で設定した階層の下に作成されます。
hA.header
hA.data
これらはURLからキーを生成して自動的に作成されます。
2回目以降はこのファイルを使ってくれて、プログラムには渡されないって動きになります。
headerには応答ヘッダが、dataの方にHTMLデータが入っています。
プログラムが動かないから早いんですよ!って動きなのです。
動作検証実際どれくらい早さが違うかをabを使って調べてみます。
mod_disk_cacheを使った場合
Requests per second: 745.71 [#/sec] (mean)
Smartyのキャッシュ機能を使った場合
Requests per second: 223.36 [#/sec] (mean)
何も使わない場合
Requests per second: 32.82 [#/sec] (mean)
大体こんな感じの結果でした。
Requests per secondは、1秒間に何回のリクエストを受け付けられるかって感じの数字です。確か。
なので、数字が大きいほど良いってことになります。
何も使わない場合の20倍。Smartyキャッシュの3倍ほど早いってことですかね。
ちなみに、何も使わない場合でも、コンテンツキャッシュを使っている状態です。データベースへの接続や計算などが無い状態ですね。
それだけ高速化されるということなのです。
キャッシュの選び方?場面においてはmod_disk_cacheを使った方がいいってな結果だと思います。
Smartyのキャッシュもとても便利な物で、場面次第ではmod_disk_cacheより使い勝手が良いかも知れません。
任意に削除が出来る点が良いですね。
ただ、Smarty自体が重いのが懸念点で、独自にキャッシュシステムを作ってしまったり、常にLastModifiedを出したりした方が良いのかなーって思います。
mod_disk_cacheも場面によっては・・・ということに気をつけないといけません。
例えば1日一回の更新を行う様な場合はとっても簡単。
更新したら全てのキャッシュファイルを削除してしまえば良いのです。
逆にコメントを送信することが出来るページなど、いつ更新されるか解らないページにはあまり使えません。
コメントを送信した後もキャッシュされた情報(古い情報)を表示してしまう為、投稿したはずのコメントが表示されない。なんて問題が発生してしまう為です。
下手をすると逆にオーバーヘッドになってしまったり、おかしな動作をしてしまうキャッシュですが、上手く使えるように日々精進したいと思います。
最後に私は良く間違ったことを書きます。
参考程度に読んでいただければと思います。
また、間違いなどがあったらご指摘を頂けると幸いです!
[2回]
PR