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 のソースを読み返しました。
コメントやシェアをお願いします!