先週の中頃から悩んでいたWordPressが応答不能になってしまう問題ですが、ようやく根本的な原因がつかめたので後々のためにメモ。
分かってしまえば目新しい物ではなく、以前からブログで不調を訴えている人も、解決策を提示してくれている人もいた。検索の仕方が悪かったようだ。
で、問題はMySQLテーブルはInsert/Deleteを繰り返していくと領域に無駄ができ、パフォーマンスが落ちる問題がある。これがMySQLのオーバーヘッド。WordPressでMySQLを使っていると何かの原因でオーバーヘッドが大きくなり、MySQLにログインできるものの、オーバーヘッドが大きなテーブルからデータを参照できなくなる。こうなるとインデックスページを表示する処理も、個別ページを表示する処理も、管理画面を表示する処理もMySQLのクエリで処理が詰まってしまう。詰まってしまうといくつものリクエストが待たされてしまうのでMySQLの同時接続数を超えてしまう。こうなるとエラー画面として問題が表面化してくる。これが今回の原因の直接的な原因。
で、なぜオーバーヘッドが増えるのかは不明。ポストデータやコメントデータは増えやすいようだが、自分の場合はオプションを保存するテーブルがオーバーヘッドの問題になっていました。なので一度オーバーヘッドを対策すればしばらく問題とならないケースと、すぐにオーバーヘッドが増えてしまって、根本的な解消にならないケースがあります。
MySQLのオーバーヘッドを直すには最適化処理をテーブルに行えばOKです。phpMyAdminならテーブルを選択して最適化を指示すればOK、SQLで叩くには
OPTIMIZE TABLE `wp_wordpress_options`
でOKです。
ポストデータやコメントは一度問題を解消してしまえばしばらく起きないようですが、自分の場合optionテーブルはすぐまたオーバーヘッドがたまってしまう問題がありました。で、対策としてサーバのcronで定期的にテーブルの最適化を行うように指示しました。
cronにこんなのを書けばOKです。
0 * * * * /home/hogehoge/cron/optimize-mysql >/dev/null 2>&1
optimize-mysqlはこんな感じ
#!/bin/sh
/usr/local/mysql/bin/mysqlcheck -o -r –all-databases -uhogehoge -phugahuga
最後に参考情報を載せておきます。XREAだけでなく、coreserver、さくらも結局ダメみたいですね。
こんにちは。
うちはさくらのスタンダードですが、かろうじて接続可能な状態でした。
DBの最適化をやってみても、一向に変化がありません。
自動アップグレードによる弊害が心配(根拠はありませんが)で、データベースから丸ごと再インストールしました。
今のところ、快適です。
うちも1度はDBを作り直したんですが。
どこのサーバに引っ越しても少なからずついて回る問題みたいですね。
短絡的に引っ越すことにならなくてよかったです。