3.2-ja 再構築時のパフォーマンス(その2)
3.2-ja 再構築時のパフォーマンスで頂いたコメント・トラックバック等の情報より、再構築時に500エラーが発生する原因と対処方法です。
原因は、「BerkeleyDB 使用で recently_commented_on でのメモリ消費が大きい」ということらしいです。具体的な内容につきましては下記に引用させて頂いた通りです。
recently_commented_onはlastnやdaysオプションと一緒に指定することはできませんでしたが(中略)?3.2では指定された範囲のエントリーを対象に最近コメントされたエントリーをリストアップする機能となりました。(中略)これを実現するために追加されたMTへのナイーブなコード追加が甚大な影響を及ぼしています。
(中略)指定された範囲のMT::Entryオブジェクトをすべてメモリ上に読み込んだ後、それら個々のエントリーに付けられた最終コメント時刻の降順にソートし、recently_commented_onオプションで指定した数だけ先頭から取り出すということを行っています。もっと悪いことには、lastnなどで範囲指定することなく使用すると、上記の操作がすべてのエントリーを対象に行われることになります。
ということで、同エントリーにて対処用パッチも提供されております(3日付で最新版が出ています)。それを該当のスクリプトに適用させることでインデックステンプレートの再構築は問題なく実行できることを確認できました。なおパッチは BerkeleyDB で MTEntryNext 等が正常に動作しない問題の対処も含まれています。
パッチの適用方法は、該当の Perl スクリプトを任意のエディタで開き、パッチの行頭左に「+」マークがある行を追加(「+」は除く)し、「-」マークの行を削除します。作業前に予めバックアップをとってください。またパッチのあてかたを間違えると mt.cgi 実行時に 500エラーになりますのでご注意ください(元に戻せば良いので慌てることはありません)。
2005.10.04 追記:勝手ながら下記にパッチの変更箇所を挙げさせて頂きました。赤色を削除して青色を追加します。これはパッチの修正方法が分からない方のための補助的な位置付けです。パッチの内容は適宜変更される可能性がありますので、基本的には原本を参照してください。
正規のパッチ適用方法はAzrael:Tagwire、MT-XSearch、Cygwin導入メモに詳しく書かれています。
lib/MT/Entry.pm
sub comment_latest {
my $entry = shift;
unless ($entry->{__comment_latest}) {
return undef unless $entry->comment_count;
require MT::Comment;
$entry->{__comment_latest} = MT::Comment->load({
my $iter = MT::Comment->load_iter({
entry_id => $entry->id,
visible => 1
}, {
'sort' => 'created_on',
direction => 'descend',
limit => 1,
});
$entry->{__comment_latest} = $iter->();
}
$entry->{__comment_latest};
}
lib/MT/ObjectDriver/DBM.pm
my $idx;
my(%ids, @ids);
my $unlock;
$args->{'sort'} = '' if $args->{'sort'} eq 'id';
if (my $col = $args->{'sort'}) {
my $idx_file = _db_index($driver, $class, $col);
($this_db, $idx, $unlock) =
:
(略)
:
%object_cache = ();
}
use constant MAX_CACHE_SIZE => 1000;
sub load {
my $driver = shift;
$driver->run_callbacks($_[0] . '::pre_load', \@_);
:
(略)
:
unless (wantarray) {
$unlock->();
if ($terms && !(ref $terms)) {
if (exists $object_cache{$class} && (scalar keys %{$object_cache{$class}} > MAX_CACHE_SIZE)) {
# garbage collection
$object_cache{$class} = {};
}
$object_cache{$class}->{$terms} = $obj;
}
return($obj);
アーカイブテンプレートについては再構築時のメモリ問題が引き続き発生しています。3.2-ja 再構築時のメモリ量増加についてではサブカテゴリーが原因と書きましたが、カテゴリーリスト・月別アーカイブリストも影響を及ぼしているようです。
ということで、もう少し真面目に、3.171-ja と 3.2-ja の日別アーカイブおよびエントリーアーカイブの再構築時の最大メモリ量について計測してみました。結果は下表の通りです。
計測は、例えば日別アーカイブの「カレンダー」は、他の(疑いのある)4つのリストはテンプレートに設定せず、中央カラムのエントリーは公開テンプレートと同じ状態で再構築したものです。
実施環境(DB・エントリー・コメント・トラックバック数等)は3.2-ja 再構築時のメモリ量増加についてと同様です。またいずれも 500エラーにならず正常に完了しています。
3.171-ja | 3.2-ja | |
カレンダー | 約23MB | 約31MB |
エントリーリスト | 約23MB | 約30MB |
カテゴリーリスト | 約23MB | 約180MB |
サブカテゴリーリスト | 約23MB | 約330MB |
月別アーカイブリスト | 約23MB | 約130MB |
3.171-ja | 3.2-ja | |
カレンダー | 約22MB | 約24MB |
エントリーリスト | 約22MB | 約28MB |
コメントリスト | 約23MB | 約64MB |
トラックバックリスト | 約23MB | 約26MB |
カテゴリーリスト | 約23MB | 約70MB |
サブカテゴリーリスト | 約23MB | 約116MB |
月別アーカイブリスト | 約23MB | 約56MB |
3.171-ja が22MB?23MB で安定しているのに対し、3.2-ja ではカテゴリーリスト・サブカテゴリーリスト・月別アーカイブリストのメモリ量が増加しています(赤色)。その3つのリストについて、日別アーカイブがエントリーアーカイブの倍近い値になっているのは、再構築数(エントリーアーカイブ:40/日別アーカイブ:80)の違いでしょうか。
青色の個別エントリーアーカイブのコメントリストはやや高めの値ですが、パッチによって劇的に改善されたものです(パッチ適用前は数百MB上昇して500エラー)。
- 3.2-ja 再構築時のパフォーマンス(その3)
- 3.2-ja アップグレード方法
- 3.2-ja 再構築時のパフォーマンス
- 3.2-ja 再構築時のメモリ量増加について
- Movable Type 3.2 日本語版リリース
- Movable Type 3.2日本語版ベータ2公開
- Movable Type 3.2日本語版公開ベータテスト開始
≫ Movable Type 3.2にアップグレード? from Harry's Blog
Movable Type 3.2導入後の再構築時に500エラーが多発しています... [続きを読む]
≫ MovableType の難解 from 編集後記
★ PCやケータイなど家電製品・電子機器の取扱説明書といえばその不親切さで悪評高... [続きを読む]
≫ MT-3.2ja 再構築の対処 from 文車に燃ゆ恋文
MovablrTypeを 3.2にアップグレードしてから、再構築に異常に時間がかかるようになっていた件で、やはり同じ問題に悩む方が多いようです。まにてん堂さんの... [続きを読む]
≫ Movable Type 3.2日本語版の不具合問題再び from ちはろぐ
目立つ不具合はBerkeleyDB上の事なので他のDBを使えるヒトはMT3.2への移行を控えなくても良いと思います。 [続きを読む]
≫ Movable Type 3.2へバージョンアップ。 from +++ e d o m i - r u u .
最近、コメントスパムとトラックバックスパムが1日に100件弱届くようになったため... [続きを読む]
≫ 再構築時のエラー from Gangalee Web Log
がちょくちょく起こり初めました。 特にエントリーアーカイブの再構築で500エラー... [続きを読む]
≫ エントリーが作成されない件 その2 from つまらん日記
エントリーの再作成で失敗する件について、「小粋空間」さんでも、いろいろ書いてありました。 [続きを読む]
こんばんわ、harryです。 当方の環境では、Recent Commnets やRecent Trackbacksだけでなくカレンダー、日別アーカイブおよびカテゴリーアーカイブ、エントリーアーカイブとすべてを削除すると何とか再構築できるようになりました。
後の対処方法は、MySQL化とOgawa::Memorandaさん作製のpatchを当てる手と思いますが、patchはどのようにすれば良いのでしょうか? 勉強不足で申し訳ございませんが、ご教授いただければ幸いです。 MySQL化はレンタルーサーバ(ロリポップ)でできるようですのでいずれトライしてみます。 よろしくお願い致します。
ベンチマーク、お疲れ様です。とても参考になりました。MT 3.2ではDBからロードしたデータをメモリー上にキャッシュしておき、後で再利用するようになっています。その分メモリー消費量が大きくなる反面、高速化されるのですが、BerkeleyDBの場合にはそのキャッシュが作りっぱなしになっています。
このあたりの対処を加えた新しいパッチを作りました。もう少しメモリ消費が抑えられるのでは、と思っています。
これである程度うまく行けばSixApartに改変を要求する予定です。
>harryさん
こんにちは。
ご質問の件ですが、エントリーに追記しましたのでご参考になれば幸いです。
>(o)さん
こんにちは。
パッチ提供くださりありがとうございます。
で、先ほど試してみたのですがメモリ量増加に変化はありませんでした。修正したのは DBM.pm の load 関数と、すぐ上の MAX_CACHE_SIZE ですが、設定誤りでしたらご指摘ください。
ふと思い立って ObjectDriver ディレクトリ全てを 3.171-ja のものに入れ替えて再構築してみたところ、やはり事象は変わりませんでした。
メモリ量増加の補足ですが、再構築開始時のメモリ量は約20MB(3.1x並)で、毎秒2?3MB上昇しています。
以上です。
それではどうぞよろしくお願い致します。
久しぶりにコメントします(3.17か3.171のテンプレートに改変が必要なことのようだったよーな)
レンタルサーバ上でOS:FreeBSD 4.10-RELEASE-p16、Webサーバ:Apache/1.3.33、Perl 5.8.4、BerekelyDBの組み合わせで、(o)さんの2005-10-04 00:35版パッチを適用後で再構築数20の状態。
個別、日別、週間、月別アーカイブ(これは目次のみ作成)作成、カテゴリーアーカイブは不作成。最近のエントリーやコメント(0……)やトラックバックなどの部分はアーカイブとは分離して作成し、古めの手法でSSIでIncludeで合成して表示。
シェルにログインしてメモリー使用量を確認しながら再構築していたところ、いずれも大体最大120MBほど使用。
「インデックステンプレートを再構築」を行ったら500MBを超えてサーバーエラーになりました(苦笑)
……よくこの状態で「インデックステンプレートを再構築」+αの処理をしていると思われる、新規エントリーの投稿やトラックバック受信が出来るなぁ……と言う感想です(投稿も未公開トラックバックの公開処理も、どちらの処理も時間はかからないです)
SixApart社にはBerekelyDB用ObjectDriverの改良と、このメモリー使用量関連の改良を行ったMT3.2のマイナーチェンジバージョンを出して欲しいところですね。
yujiroさん ご丁寧にありがとうございました。
早速試してみたいと思います。
>ちはさん
こんばんは。
ご無沙汰しております。
色々苦労されたようで、お疲れ様です。
メモリ使用量の改善については(o)さんのおかげで改善されましたね。
あとはSix Apartの改良版を待ちたいと思います。
>harryさん
こんばんは。
ご連絡ありがとうございました。
ではでは!
yujiroさん、どうもです。追記レポートをお届けに?
新規にMT3.2jaを設置して、データファイルを(o)さんが最初に指摘していたように現行の日記BlogのBerekelyDBのデータベースをSQLiteにmt-db2sql.cgiで変換(Webサーバ上で実行するとタイムアウトして500サーバエラーになるとの話があるのでシェル上で実行)して、再構築を行ったところメモリー使用量30?40MB程度で推移しました。
MySQLサーバが使えなくても、SQLiteが使えるPerl環境の場合はそっちに移行してしまうのも、(o)さんの指摘通りに良い手かもしれません。
……ちなみにうちのレンタルサーバでPerlライブラリのDBD-SQLiteが使えるようになったのは2005/9/3……ぎりぎりセーフ。アハハハ……
日記Blog本体は人柱用に当分BerekelyDBで行こうと思ってます(バカ……)
MobableType 3.2 アップグレードに苦戦して、コチラを参考にサイドバーに設置していた「最近のコメント」と「最近のトラックバック」を外して何とかしのいでいます。それでも、Search のテンプレートが崩れてしまっています、トホホ。
>kojyoさん
こんばんは。
記事参照ありがとうございます。
また作業お疲れ様です。
3.2の改善版をお待ちになるのも良いですが、他のDBへの移行も選択肢として考えられてはいかがでしょうか。
yujiroさん お世話になります。
Cygwin導入を導入して、Oさんのpatchを当ててみたのですが、状況改善されず、また500エラーの出方が日々ひどくなるので、本日思い切ってMYSQLに変えてみました。 なんとか苦労して再セットアップしたのですが、やはり貴テンプレートに変えると再構築に時間がかかりやはり500エラーが発生します。
MT標準のテンプレートでもすべて再構築時に500エラーが発生することがあります。 (10回くらい再構築しそのうち一回だけですが・・) しばらくこれで様子を見たいと思います。
最初に送ったトラックバックのエントリーを削除してしまったので、当方のトラックバックは削除しておいて戴きたく。
今後ともよろしくお願い致します。
>harryさん
こんばんは。
MySQLでの500エラーはレンタルサーバに依存した問題かも知れません(以前そういう話題があがってました)。
トラックバックは別途削除しておきます。
ご連絡ありがとうございました。
"Ogawa::Memoranda" さんの CGI スクリプト "mt-db-convert.cgi" が MobableType 3.2 対応になったようなので、恐る恐るデータベースを SQLite に変換してみました。
問題解決しました。
アドバイスありがとうございました。