FC2ブログ

Wordpressのカテゴリーが過剰に増えて激重サイトになってた仮説の検証

検証に使用したマシンスペック

  スペック
CPU Xeon3050
メモリ DDR2 2GB
HDD 40GB 5400 rpm
OS CentOS 6.2 x86 64bit
PHP 5.3.3
MySQL 5.1.61
Wordpress 3.1.2

 

重いサイトについて

既に、運用しているWordpressのサイトのレスポンスが劇的に重いと掲載しました。

・Linux CentOS低予算自宅サーバ奮闘メモ ApacheBenchを使ってWordpressで公開しているページのパフォーマンス測定
http://centlinuxer.blog37.fc2.com/blog-entry-66.html

 

・Linux CentOS低予算自宅サーバ奮闘メモ 新しいサーバでwordpressにApacheBenchを試してみた
http://centlinuxer.blog37.fc2.com/blog-entry-75.html

いずれも、siteBという表記で記載しているサイトの事ですが、何が原因でサイトが重いのか?の犯人特定にまでは至っていませんでした。
前回も記載しましたが、検証用のサーバでApache Benchを試してみたところ、

# ab -c 1 -n 10 http://siteB.info/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking siteB.info (be patient).....done


Server Software: Apache
Server Hostname: siteB.info
Server Port: 80

Document Path: /
Document Length: 2173881 bytes

Concurrency Level: 1
Time taken for tests: 52.878 seconds
Complete requests: 10
Failed requests: 0
Write errors: 0
Total transferred: 21740790 bytes
HTML transferred: 21738810 bytes
Requests per second: 0.19 [#/sec] (mean)
Time per request: 5287.777 [ms] (mean)
Time per request: 5287.777 [ms] (mean, across all concurrent requests)
Transfer rate: 401.52 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 3796 5287 4636.3 3825 18482
Waiting: 3603 5086 4612.0 3631 18212
Total: 3796 5287 4636.5 3825 18483

Percentage of the requests served within a certain time (ms)
50% 3825
66% 3832
75% 3847
80% 3858
90% 18483
95% 18483
98% 18483
99% 18483
100% 18483 (longest request)

同時アクセス数:1

連続アクセス数:10

というアクセスに対して、Time taken for tests:   52.878 secondsと言う事で、1ページあたり5秒程度待ってくださいという散々たる結果でありました。wordpressの管理画面を開いてみると。

WS000430

※管理画面を開くのは比較的素早く開く。


バカみたいにカテゴリーが入っている。このカテゴリーはプログラム的に自動的に突っ込んでるわけですが、とにかく多い。そいうワケで、このカテゴリーが怪しいので、カテゴリーを全消去した後にApache Benchで計ってみたいと思います。

カテゴリーの消し方

上記にも書いたプログラム的に突っ込んでいるというのは、wordpress-javaというJavaのライブラリを利用していますが、現時点でどうやらカテゴリーを消すAPIが無い模様。

Wordpressの管理画面からカテゴリー画面へ遷移すると、カテゴリーを複数選択して一括削除という操作が行えるのですが、これが20件毎。こんなクリックを連打してたら、腱鞘炎になるぜ!と言う事で、FirefoxのSelenium IDEプラグインに自動的にやらせました。

WS000429

手順としては、

  1. まずwordpressの管理画面で、カテゴリーを複数選択して一括削除する操作を記録させます。
  2. カテゴリーによっては、MySQLのレスポンスが著しく遅いものがあるので、[オプション] - [設定]の一般タブにある「記録時のデフォルトのタイムアウト」を600000(10分)にしておきます。
  3. Selenium IDE画面のソースタブから、<tbody>~</tbody>内のタグをコピーして繰り返し実行できるようにします。
  4. テーブルタブに戻ると、3のコピーした内容が表示されます。問題なさそうなら再生ボタンを押下します。

これでひたすら管理画面からカテゴリーを削除してくれます。詳しい使い方はSelenium IDEのサイトからどうぞ。

あまりスマートなやり方ではないですがwここに時間をかけてられないので。とは言え、この操作(プロセスで言うとMySQL)のレスポンスは遅いです。

カテゴリーを消し終わったサイトBのレスポンス

WS000431

未分類というカテゴリーが残るので、0にはできません。これを上記と同じ条件でApache Benchを実行してみたいと思います。

# ab -c 1 -n 10 http://siteB.info/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking siteB.info (be patient).....done


Server Software: Apache
Server Hostname: siteB.info
Server Port: 80

Document Path: /
Document Length: 65961 bytes

Concurrency Level: 1
Time taken for tests: 3.575 seconds
Complete requests: 10
Failed requests: 0
Write errors: 0
Total transferred: 661610 bytes
HTML transferred: 659610 bytes
Requests per second: 2.80 [#/sec] (mean)
Time per request: 357.452 [ms] (mean)
Time per request: 357.452 [ms] (mean, across all concurrent requests)
Transfer rate: 180.75 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 351 357 5.3 359 364
Waiting: 260 265 4.5 267 271
Total: 351 357 5.3 359 364

Percentage of the requests served within a certain time (ms)
50% 359
66% 360
75% 363
80% 364
90% 364
95% 364
98% 364
99% 364
100% 364 (longest request)

Time taken for tests:   3.575 secondsという事で約1/17のスピードで圧倒的に速くなりましたね!!

これでカテゴリーが犯人だと言えるじゃないでしょうか。

まとめと対策案

記事数も決して少ない数字ではありませんが、記事を増やす分にはレスポンスにそんなに影響はないようです。過剰なカテゴリー数にWordpressは弱いと言えるでしょう。とは言え、カテゴリーを無くすような極端な事を普通はできないので、対策案を考えてみました。

  1. カテゴリー数をむやみに増やさず、単にキーワードで記事を串刺したい場合は検索リンクにする
  2. MySQLのチューン や wordpress内部のチューン
  3. ハードの力業で行くならCPUのパワーアップとHDDをSSDに交換する
  4. 高速なWebサーバソフトウェアに変更する(Apache → nginx+FastCGI)など
  5. WP Super Cacheを使う

上記1のカテゴリー数を減らすのは当たり前な対策ですが、カテゴリーのメリットの一つとして、一つのキーワードで記事を串刺し表示にできる事ですね。これだけの機能を有したいのであれば別にカテゴリーである必要はありません。検索と同じです。なので、

http://siteB.info/?s=検索キーワード

※日本語キーワードの場合はエンコードさせた方が良い


というようなリンクを貼ってやれば、そのリンクを踏めば記事を串刺しに表示できます。ただし、自分でリンクを仕込ませる必要があるので、例えばwordpressのテンプレートを編集して、この記事のカテゴリー一覧を表示させるような事を考えたら一筋縄に行かないでしょう。その代わり、検索結果の表示レスポンスは、上記のように6000件投稿があっても高速かつカテゴリーのように増やすとレスポンスが悪化するような制限がありません。

2に関しては特に調べてませんが、過剰カテゴリーをごり押ししたい場合に考えると良いのではないでしょうか。wordpressの内部をいじって、ページ表示方法を工夫すると良いと思います。また、MySQLのプロセスに負荷がかかるので、かからないような工夫だとかキャッシュすればイケるんじゃねーの?くらいです。いずれにせよ、対応の難易度は上がると思います。

3はそのままですが、先ほども書いたように、MySQLに負荷がかかってるので、それを改善すべくハード的な案です。

4と5はwordpressの高速化でよく紹介されているやり方で、いずれやってみたいです。

このエントリーをはてなブックマークに追加

コメントの投稿

非公開コメント

プロフィール

白鯖

Author:白鯖
安い寄せ集めの部品で構築し、CentOS5をインストールしました。主に、Webサーバ、アプリケーションサーバとして運用中。ハードの知識はあまり無いプログラマですが、全部自前で作るのは、手間はかかるけど、レン鯖より面白いです。

ハードウェア構成

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
Max TDP控え目なCPU
安くて静音なクーラー
検索フォーム
ユーザータグ
RSSフィード
はてな
スポンサード リンク
おすすめ書籍
twitter