昨日、このサイトにアクセスしようとすると、あまりに遅くてtimeoutしてしまうようになった。大したアクセスではないのだが。どうもphp5-fpmがものすごくCPUをとっているようなので、そのあたりにトレースをかけにいった。しかし、それを読んでもぱっとしない。そもそも、dumpが途中でdump failedでちょん切れるし。どうもslow log は信用出来ないらしいという情報もあるし1。
そのログはこんな感じである。
[06-Jan-2016 12:56:04] [pool www] pid 4835
script_filename = /var/www/index.php
[0x00007ff1e09ae330] unserialize() /var/www/wp-includes/functions.php:319
[0x00007ff1e09ae188] maybe_unserialize() /var/www/wp-includes/option.php:133
[0x00007ff1e09ae088] get_option() /var/www/wp-includes/cron.php:438
[0x00007ff1e09adf40] _get_cron_array() /var/www/wp-includes/cron.php:223
[0x00007ff1e09addd0] wp_next_scheduled() /var/www/wp-includes/update.php:649
[0x00007ffec1ff3ba0] wp_schedule_update_checks() unknown:0
[0x00007ff1e09adbf8] call_user_func_array() /var/www/wp-includes/plugin.php:525
[0x00007ff1e09ada58] do_action() /var/www/wp-settings.php:392
[0x00007ff1e09ad930] +++ dump failed
このようなものが様々なバリエーションで出てくる。
結局、昨日入れたSNS Count Cacheというプラグインが巨大なCronを作って、それがCPUを消費してしまっていたのだった2。
それはそれとして、どう状況を改善するか。何しろもはや、管理画面にアクセスすらできない状況である。管理画面から当該プラグインを削除することもできない。
結局いろいろやった末に、有効だったのは:
- php5-fpm を止める。(コマンドラインから kill しないと、service php5-fpm stop だけではこの状況だと死なない。)
- Apacheを止める。(service apache2 stop)
- WPのディレクトリに .maintenance ファイルを作る。(これで、Apacheとphp5-fpmを起動してもWordpressは動かなくなる。)
- phpMyAdminなどで、wp_options テーブルから、option_id = 102, option_name=’cron’ の行を削除する。(このレコードは巨大になっているはず。)
- 間髪をいれず、option_id = 102, option_name=’cron’, auto_id=’yes’ のレコードを作る。
- WPのプラグイン画面に行き、SNS Count Chacheプラグインを停止、削除する。
- .maintenanceを削除する。
WordPress組み込みの cron 機能を止める
ついでに、wp-cron自体を止めてしまって、Linuxのcronを使ってやるようにするとなお良い。それには、
- wp-config.php の、「define(‘DB_COLLATE’, ”);」の次の行に「define(‘DISABLE_WP_CRON’, ‘true’);」を挿入する。つまり:
define('DB_COLLATE', ''); define('DISABLE_WP_CRON', 'true');
みたいな感じなる。これで、wp-cron.php が、WPへのアクセスのたびに起動されるというようなことはなくなった。
- しかし、起動しないだけではいけない。wp-cron.phpを、節度を持ったタイミングで起動してやる必要がある。数時間おきに起動してやるくらいで調度良いのではないか。そのためには。www-dataのcrontabに、起動コマンドを登録してやる必要がある。
crontabの起動シンタックスは以下のとおりである。sudo crontab -u www-data -eこれで、エディタが立ち上がってくるので、以下を登録する。
0 */6 * * * cd $wordpress_dir; /usr/bin/php -q wp-cron.php(上記では6時間おきに走るようにしている。$worpdress_dirは実際のフォルダのフルパスを入れること。)
ではでは。