スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
このエントリーをはてなブックマークに追加

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
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。