MT の コメントの投稿が急に遅くなりました
ここ数ヶ月ですが自分のブログのコメント書込がすんげぇ〜遅いなぁ〜と思いつつも放置しておりましたが、Timeout とかするようになったのでさすがにちょっと調査をしてみました。最初にぐぐれば回答がすぐに見つかったのに、なまじソースを把握しているものだから追っかけてしまいました。
えーっと結論からすると、Six Apart - Movable Type サポート: コメントの投稿が急に遅くなりました に全て書かれています。
A. 標準プラグイン「SpamLookup」がデフォルトで参照しているサーバーのひとつ、「opm.blitzed.org」が停止したため、コメントの投稿の際、非常に長い時間がかかったり、タイムアウトとなる現象が発生しています。
〜中略〜
この現象は、Movable Type 3.2 以降のバージョンをお使いのほぼすべての環境で発生します。
また、この現象が発生している場合、お使いのMovable Typeに対してトラックバックを送信する送信側のシステムで、コメントの投稿と同様に長い待ち時間が発生します。
この問題は、「SpamLookup」プラグインの参照サーバー一覧から、該当のサーバーの記述を削除することで回避が可能です。
お手数ですが、以下の手順でサーバー一覧から「opm.blitzed.org」を削除してください。
1. システム管理者でMovable Typeにログインします。
2. 「システムメニュー」−「プラグイン」に進みます。
3. 「SpamLookup - Lookups」プラグインの「設定を表示」をクリックします。
4. 項目「アドレスのチェック」の「ブラックリスト」に入力されている「opm.blitzed.org」を削除
5. 「変更を保存」ボタンをクリックして保存します。
テスト環境で上記の通り opm.blitzed.org を削除したらパフォーマンスが改善しました。意外と知られていないっぽいので記事にしてみました。 MT3.2 とか使っている方は対処をすると良いと思います。
さて、以下は自分がこの情報に辿り着くまでの道順です。
まずはコメント登録の実行部である MT/App/Comments.pm を解析する。
post メソッドが「投稿する」を押したときによばれる関数。
sub post {
my $app = shift;
my $q = $app->{query};
...snip...
if ($comment->url) {
if (my $fixed = is_valid_url($comment->url, 'stringent')) {
$comment->url($fixed);
} else {
return $app->handle_error($app->translate(
"Invalid URL '[_1]'", $comment->url));
}
}
return $app->handle_error(time); ## 実験1
$comment = $app->eval_comment($blog, $commenter, $comment, $entry);
return $app->handle_error(time); ## 実験2
return $app->preview('pending') unless $comment;
return $app->handle_error(time); ## 実験3
どうやら eval_comment が遅いらしい。
sub eval_comment {
my $app = shift;
my ($blog, $commenter, $comment, $entry) = @_;
...snip...
my $not_declined = MT->run_callbacks('CommentFilter', $app, $comment);
return unless $not_declined;
return; ## 実験1
MT::JunkFilter->filter($comment);
return; ## 実験2
どうやら MT::JunkFilter->filter($comment); が遅いらしい。
MT/JunkFilter.pm を解析してみる。
sub filter {
my $pkg = shift;
my ($obj) = @_;
my $blog = MT::Blog->load($obj->blog_id);
my $threshold = $blog->junk_score_threshold;
# Have the item scored by plugin tests, save any log messages:
my ($score, $log_msgs) = $pkg->score($obj);
if (defined $score) {
$obj->junk_log(join("\n", @$log_msgs));
return; ## 実験1
$obj->junk_score($score);
}
どうやら $obj->junk_log が遅いらしい。MySQL の mt_comment テーブルの comment_junk_log フィールドの中身をみてみる。SpamLookup Link Filter (1): なんちゃらと文字化けしたログが書き込まれている。
ここで SpamLookup プラグインが原因で遅くなっていることが判明。SpamLookup の機能を1つずつ止めてみる。
SpamLookup - Lookups が遅いことが判明。ぐぐったら Six Apart の情報に辿り着く。と言った感じ。久々に MT のソースを読み返しました。


コメントやシェアをお願いします!