« 【WBC】二連覇キタ━━(゜∀゜)━━ッ!! | メイン | さくらインターネット全般が発狂しているらしいです »

MT4.1+Perl版ダイナミック・パブリッシングのキャッシュ機能を再点検してみた

これは酷い(Googleウエブマスターツールによるクロール統計からページあたりのロード時間遷移)
これは酷い

先日愚痴った通り、相変わらずここのサーバーがとても重いようです。静的なページを表示する分にはそれほど重さも感じないのですが、動的なページを呼び出した途端、反応が極端に悪くなります。つまり、MTでダイナミックパブリッシングにしている小生涙目。

三連休がヒマだったので時々モニタしておりまして、そのときはたいして重くも無かったのですが、平日になるとズズーンと重くなるようです。やはり同じサーバー内で、かなり重めのスクリプトをブン回している方がいらっしゃるか、或いは超人気ブログに発展された方がいらっしゃるようですな。

直接小生が対策を下せる範囲などタカが知れているのですが、それにしましても気になっていたのが、Perl版ダイナミックパブリッシング(by The blog of H.Fujimoto様)にはキャッシュ機能があったハズ。小生も散々ハマった上どうにか正常にキャッシュ機能が使えるようになった...という経緯があるだけに、今この現状、キャッシュ機能の恩恵があんまり感じられないのは一体どういう事でしょうか。そんなところを軽くググってみたところ。

MTの動的生成でperlプラグインも動作する「mt-dynamic.cgi」亜細亜ノ蛾 - Weblog様)から一部引用

キャッシュする時間を増やしてみる

mt-dynamicは、動的生成に付きものの一時ファイル(キャッシュ)をphptempフォルダに生成する。一定時間内のアクセスに対しては、一時ファイルから呼び出される。

──ようするに、最初に誰かがページを見るときは動的生成だが、同時にphptempフォルダにhtml(php)ファイルが生成される。その後、一定時間内に他の人が同じページにアクセスすると、phptempフォルダ内のファイルが呼び出される。──という仕組みになっている。

つまり、「再構築がいらない」というメリットと「動的生成はページの表示が遅い」というデメリットのバランスを取る仕組み。

──なのだが、初期設定では「一定時間」が一分間(60秒間)になっているので、あまりキャッシュのありがたみがない。

おお!確かに、キャッシュデータが溜め込まれるらしい「phptemp」ディレクトリを覗いても、ファイルが常時3つ4つある程度ですぐに消えていくような気はしていたのですが、そういう事だったのですね。つーかまずそこを調べようとしなかった小生恥ずかしい。

そこで、mt-dynamic.phpの21行目辺りにある

if ($now - $mtime > 60) {

これを変更し、

if ($now - $mtime > 60*30) {

こんな感じにすると、30分間キャッシュされる。

即座に小生も実行してみました。キャッシュ時間は思いっきり延ばして60*60*24*7(7日間)。エントリーの新規・修正ポスト時にはキャッシュをクリアするようにしてみたので、事実上、次回のポストまたはコメント等の投稿があるまでは容量が許す限りキャッシュを溜め込んでいく仕様でございます。ガッハッハ。

...これでしばらく様子を見てみたのですが、どうもオカシイ。キャッシュされているはずのページを読み込むのが、暫く経つと相変わらずクソ重いのですよ。ムムム?確かに、「phptemp」ディレクトリには、これまでに見たことも無い数のファイルが溜め込まれておりまして、一見するとキャッシュが上手く行っているように見えるのですが、キャッシュファイルを管理しているDBの方はどうなっているのか見てみると...テーブル「mt_dpcache」にあるレコードは数件のみ。理想的なのはキャッシュされているファイル数と、このレコード数が一致している状態であり、どうやら目論見が外れたと判断しなければならないようですぞ。

もう一度、mt-dynamic.phpをよく読んでみることに。結論から言うと、「phptemp」ディレクトリの中に生成されたファイルは、キャッシュファイルとして直接使用される物では無く、ほんの一瞬、一時的に保管されてすぐに用済みとなるファイル群なので、これを何秒取っておこうが、何日取っておこうが、既に仕事を終えて二度と誰からも呼び出されることが無いのです。キャッシュとして力を発揮するのは別にあるディレクトリ「phpcache」内に生成されたファイル郡の方なのでした。改めて確認してみると、確かに「phpcache」内のファイル数と、DBテーブル「mt_dpcache」のレコード数は常に一致しています。

振り出しに戻ってしまいまいた。それでは何故、キャッシュ機能をonにして、キャッシュサイズを到底到達するはずが無い数値(ヤケクソで1GBに設定してみたりしましたよ)まで大きくしてみたりしても、「phpcache」の中とDBテーブル「mt_dpcache」のレコードがあるとき突然、スッカラカンになってしまうのでしょうか。

答えはどうやら(MTディレクトリ)/plugins/PerlDynamic/PerlDynamic.plの中にありそうです。この中に「sub _clear_cache」というサブルーチンがあり、blogに何らかの変化がある度に呼び出されているようなのですが、その中に「if ($force || $blog->children_modified_on > $last_clear)」という
気になる条件式があります。「$blog->children_modified_on」というのは、DBテーブル「mt_blog」内にある、カラム「blog_children_modified_on」を参照している...のですが。ここに記録されている、言うなれば「最終更新日時」がクセ物で、たとえスパムコメントを受けて、スパムフィルターがスパムとして処理したとしても、更新されていたのです。つまり、何故か突然キャッシュが消えていたのは、殆どの場合、スパムコメントなりスパムトラックバックを受けたタイミングだったのです。ムッカ!

そこで、「PerlDynamic.pl」の(小生の場合ですが)169行目付近にある、

if ($force || $blog->children_modified_on > $last_clear) {

if ($force) {

に変更してみることに。しばらく様子を見ていると、早速スパムコメントが投げつけられて「children_modified_on」が更新されましたが...キャッシュはクリアされずに残ってますぞ!Yes I Can!!

これで多分、スパムが原因の無駄なキャッシュクリアの大半は回避できました。ただ、これで全てが無問題でオールオッケーなワケがありませんので、引き続き検証と改善策を練って行きたいと思います。お知恵の施し大歓迎でございます。

...その後、さらに暫く様子を見てみたのですが。キャッシュをちゃんと読みに行っているにも関わらず、クソ重いことがしばしばでございます。そもそも、PHPとDBの間が激重で、「mt-dynamic.php」がキャッシュの有無をDBに確認しに行くところで躓いている事多し、ってな状況っぽいです。意味ねーかもー。待つのにもう疲れたよ...という方には、RSSリーダーがオススメです。

▼フィード
http://addressclub.net/atom.xml

これでもう暫く、様子を見ながら、一方でサーバーが軽くなることを祈りながら...ダメだ、諦めてさくらインターネットのサポートにメールしよう。

■追記(2009/03/25)■
上記の変更をするのであれば、「mt-dynamic.php」の方(76行目付近)にある

if (!$is_use_cache || !$is_exist || $data["dpcache_modified_on"] < $children_modified_on)

if (!$is_use_cache || !$is_exist)

に併せて変更しないとあんまり意味が無かったです。意味が全く無いかと言えばそういうワケでもないのですが、詳細はとりあえず割愛。で、これをやると相変わらずサーバーが激重であってもかなり速く表示されるようになるのですが、今度は記事を修正更新してもキャッシュが頑固に生き残って更新した内容が反映されませんよ...と。やっぱり、スパムの場合に「blog_children_modified_on」を更新させないようにして、元々のコードで利用させていただくのがベストっぽいです。さてその、スパムの場合は「blog_children_modified_on」を更新させない、というのが相当にディープなワケですが...助けて凄い人orz

■さらに追記(2009/03/25)■
かなりウザ化しており申し訳ございません。緊急的な対応としまして、「blog_children_modified_on」を参照する代わりに表示中のエントリー・コメント・トラックバックの何れか最も更新日時の新しいものを参照するようにして、キャッシュデータよりも新しければ再構築するようにしてみました。

mt-dynamic.php

上記部分を

に変更してみました。さて、どうでしょう?

Googleブックマーク Yahoo!ブックマーク はてなブックマーク livedoor clipでブックマーク del.icio.usでブックマーク POOKMARK Airlinesに行き先登録

関連記事

トラックバック

このエントリーのトラックバックURL:
http://addressclub.net/cgi-bin/mt/mt-tb-ADC.cgi/318

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


アスキーアートを貼る場合は、
AAの直前に<span class="aa">、AAの直後に</span>を追加するといい感じになるかもです。
投稿ボタンを押してから、投稿完了までに少し時間がかかります。

アーカイブ

最近のトラックバック

携帯版

http://addressclub.net/mt4i/
Powered by MT4i

About

2009年3月24日 22:21に投稿されたエントリーのページです。

ひとつ前の投稿は「【WBC】二連覇キタ━━(゜∀゜)━━ッ!!」です。

次の投稿は「さくらインターネット全般が発狂しているらしいです」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。