MT の コメントの投稿が急に遅くなりました

ここ数ヶ月ですが自分のブログのコメント書込がすんげぇ〜遅いなぁ〜と思いつつも放置しておりましたが、Timeout とかするようになったのでさすがにちょっと調査をしてみました。最初にぐぐれば回答がすぐに見つかったのに、なまじソースを把握しているものだから追っかけてしまいました。

えーっと結論からすると、Six Apart - Movable Type サポート: コメントの投稿が急に遅くなりました に全て書かれています。

Q. コメントを投稿すると、以前に比べて非常に長い時間がかかります。10 秒以上待たされたり、タイムアウトが発生する場合もあります。
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つずつ止めてみる。

img01.jpg

SpamLookup - Lookups が遅いことが判明。ぐぐったら Six Apart の情報に辿り着く。と言った感じ。久々に MT のソースを読み返しました。

- スポンサーリンク -