WordPressが遅い!

昨日、このサイトにアクセスしようとすると、あまりに遅くて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

それはそれとして、どう状況を改善するか。何しろもはや、管理画面にアクセスすらできない状況である。管理画面から当該プラグインを削除することもできない。

結局いろいろやった末に、有効だったのは:

  1. php5-fpm を止める。(コマンドラインから kill しないと、service php5-fpm stop だけではこの状況だと死なない。)
  2. Apacheを止める。(service apache2 stop)
  3. WPのディレクトリに .maintenance ファイルを作る。(これで、Apacheとphp5-fpmを起動してもWordpressは動かなくなる。)
  4. phpMyAdminなどで、wp_options テーブルから、option_id = 102, option_name=’cron’ の行を削除する。(このレコードは巨大になっているはず。)
  5. 間髪をいれず、option_id = 102, option_name=’cron’, auto_id=’yes’ のレコードを作る。
  6. WPのプラグイン画面に行き、SNS Count Chacheプラグインを停止、削除する。
  7. .maintenanceを削除する。

WordPress組み込みの cron 機能を止める

ついでに、wp-cron自体を止めてしまって、Linuxのcronを使ってやるようにするとなお良い。それには、

  1. wp-config.php の、「define(‘DB_COLLATE’, ”);」の次の行に「define(‘DISABLE_WP_CRON’, ‘true’);」を挿入する。つまり:
    define('DB_COLLATE', '');
    define('DISABLE_WP_CRON', 'true');
    

    みたいな感じなる。これで、wp-cron.php が、WPへのアクセスのたびに起動されるというようなことはなくなった。

  2. しかし、起動しないだけではいけない。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は実際のフォルダのフルパスを入れること。)

    ではでは。

 

脚注

  1. http://kaiwangchen.github.io/2012/10/04/fpm-slowlog-sucks.html
  2. これがわかるのにめちゃくちゃ時間がかかった。分かってからログを読み返すと、ああなるほどという感じではあるのだが…。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください