[blog] ブログの最悪なパフォーマンスを改善する

オンプレミス-ブログ-技術のお話し

wp-cronが原因なのは分かっていたけど

ここ最近何をReadするにも何をWriteするにも応答が遅い。遅すぎると言うほどに遅い。
DBパラメータのチューニングをしてみたりしたのだけど、それにしても猛烈に遅い。そして確認してみた感じだとDBがただひたすらディスクにWrite処理をしまくってるようだと言うことは分かるんだけど、肝心の何が遅くなってるのかがさっぱり分からない。

必死に探してたらこんな情報を見つけて非常に助かったというお話であります。

wp_optionテーブルに問題があった

実はこの情報を見つけるにあたり、これが問題かな?というのは薄々感じていて、

-rw-rw---- 1 mysql mysql     2854  3月 26 13:18 wp_options.frm
-rw-rw---- 1 mysql mysql 96468992  5月  8 00:14 wp_options.ibd
-rw-rw---- 1 mysql mysql     1061  3月 26 13:18 wp_pmxi_files.frm
-rw-rw---- 1 mysql mysql    98304  3月 26 13:18 wp_pmxi_files.ibd

上記、wp_optionsのテーブルサイズがやたら巨大なこと、Writeが直近まで行われていたようでファイルのタイムスタンプが直近の時刻を示していたことが決定打になりました。

記述されている内容に従い、このテーブルのAutoload_sizeを計測。

MariaDB [wpdb]> SELECT SUM(LENGTH(option_value)) as autoload_size FROM wp_options WHERE autoload='yes';
+---------------+
| autoload_size |
+---------------+
|      18122814 |
+---------------+
1 row in set (0.012 sec)

アカンやつや・・・さらに深掘りしてみると

MariaDB [wpdb]> SELECT 'autoloaded data in KiB' as name, ROUND(SUM(LENGTH(option_value))/ 1024) as value FROM wp_options WHERE autoload='yes'
    -> UNION
    -> SELECT 'autoloaded data count', count(*) FROM wp_options WHERE autoload='yes'
    -> UNION
    -> (SELECT option_name, length(option_value) FROM wp_options WHERE autoload='yes' ORDER BY length(option_value) DESC LIMIT 10)
    -> ;
+--------------------------------+----------+
| name                           | value    |
+--------------------------------+----------+
| autoloaded data in KiB         |    17698 |
| autoloaded data count          |      632 |
| cron                           | 17780723 |
| _transient_dirsize_cache       |   142683 |
| fs_accounts                    |    25643 |
| theme_mods_cocoon-child-master |    23384 |
| rewrite_rules                  |    20745 |
| bcn_options_bk                 |    11114 |
| bcn_options                    |    11114 |
| generate_dynamic_css_output    |     7536 |
| wp_user_roles                  |     7346 |
| wpsc_feed_list                 |     7299 |
+--------------------------------+----------+
12 rows in set (0.040 sec)

あああ、cronがぶっちぎりの首位や・・・

wp_cron由来と思われるオプションデータの削除を行う

というわけで、OptionNameにcronが使用されているところを削除することに。結局wp_cron.phpの処理がずーっと失敗続きで、クエリ結果の受領やクエリの発行が処理出来ずに溜りに溜り続けてた状況があった、あるいは処理結果が長年のWordpress稼働により蓄積しまくったのか・・実際どうなのかまでは掘れませんでしたけど、取り敢えずコイツを削除すれば良いと言うことが分かりましたのでそれに従う形となりました。

MariaDB [wpdb]> DELETE FROM `wp_options` WHERE `autoload` = 'yes' AND `option_name` LIKE '%cron%';
Query OK, 3 rows affected (0.025 sec)

その他、いくつか既に存在しないプラグイン由来のものであることが明確なものなどを削除対象にしましたところ、動きが非常に良くなりました。それにしてもwp_optionテーブルって代物は全く視野に入って居らず、トラブルシュートに相当な時間を要しました。いやはや、(〃ノωノ)ハズカチィ限りです。

Tags:

Comments are closed

PAGE TOP