久しぶりの投稿ですね。今回は、コグレさんのTwitterをきっかけに、再構築の時間が9時間を超える (テスト環境での実測値) というネタフルの再構築チューニングをお手伝いしたので、それをご紹介します。
調査編 (DMAICでいうDefine/Measure)
テスト環境を構築して計測したところ、そのほとんどがエントリーアーカイブの再構築にかかっていました。公開エントリー数が24,000を超えているとはいえ、時間がかかっている感がしますね。というわけで挑戦しましょう。
特定のブログ記事を公開するときに、大体1分程度かかるということで、パフォーマンスログを出力させてテンプレートエンジンの処理の時間を計測してみました (パフォーマンスログについて詳細を知りたい方は、movabletype.jpやmovabletype.orgを参照願います。)。
- エントリーアーカイブ (PC) : 約2秒
- エントリーアーカイブ (iPhone) : 約0.5秒
- カテゴリーアーカイブ : 約20秒
- 日付アーカイブ : 約10秒
テンプレートデザインは比較的シンプルとはいえ、モジュールのキャッシュをもっと利用できることがわかったのですが、その前にデータベース (MySQL) の状況を確認してみました。ストレージエンジンはMyISAMを使っているので、キーブロックバッファの利用状況を、key_read_requestsとkey_readsの値を確認してチェックしました。1 - key_reads/key_read_requestsの値が、キーブロックのキャッシュのヒット率となり、70%前後という結果でした。
分析編 (DMAICでいうAnalyze)
テンプレートデザインのチューニングの前に、MySQLのチューニングをした方がよさそうだということがわかったので、key_buffer_sizeを標準サイズ (8MB) から16MBに変更し、再度実測すると、7時間になりました。ですが、まだまだですね。この結果では。
というわけで、次の作業は「ストレージエンジンをMyISAMからInnoDBに変更する」を実施して計測します。シックス・アパートのエンジニアが以前試験したところ、MyISAMよりもInnoDBの方がパフォーマンスがいいという結果を聞いていたので、ワクワクしながら、次のコマンドを実行してInnoDBに変更していきます。
mysql> ALTER TABLE [テーブル名] ENGINE='InnoDB';
加えて、InnoDBのパフォーマンスチューニングをあわせて実行します。innodb_buffer_pool_read_requestsとinnodb_buffer_pool_readsの値を見つつ、innodb_buffer_pool_sizeの値を変更していきます。innodb_buffer_pool_sizeを16MBにすると、98%とヒット率が高くなることがわかってきました。
さて、実際の結果は、なんと「1時間6分」。自分の目を疑い、先週末は何度も計測してみましたが、変わりません。すばらしい。
- ストレージエンジンをMyISAMからInnoDBに変更する
- InnoDBのバッファプールのキャッシュ率を高めるようにmy.cnfの設定 (innodb_buffer_pool_size) を変更する
こうして、前述のアクションをとることでかなりチューニングできることがわかったわけです。
実践編 (DMAICでいうImprove)
さあ、あとは本番環境に適用するのみです。コグレさんのご都合を確認し、以下の手順で作業を実施しました。
- 現行環境のバックアップ。データベースとMT環境、公開された内容もすべてバックアップします。
- OSのアップデート。メンテナンスの時の必須作業の一つですね。
- Movable Typeを最新版 (4.261) にアップデート。これは、最新版の方が不具合も修正されていますし、必須の作業です。
- 利用しないプラグインを除外する。案外とやられていませんが、利用しないプラグインは、pluginsディレクトリから除外しておきましょう。
- MySQLの設定を変更。my.cnfの値とストレージエンジンの変更ですね。
- サーバーをリブートして、本番環境での測定。
本番環境でも、1時間強という変わらぬ結果に確認し、コグレさんに報告。
まとめ
今回、お手伝いしたことで痛感したことは「チューニングの大切さ」です。最近、再構築のチューニングについてご相談を受けることが増えてきたのですが、せっかく専用サーバーだというのに、チューニングしていないケースが多いことに気づきます。サイトの納品の前にできる限りのチューニングを実施し、かつ定期的なチェック (DMAICですね) をすることで、お客様の運用に関する負荷を軽減できたり、「MTは再構築がいけてないから○○だよね。」という評価に対する回答にもなります。
継続は力なりということね。