前回の記事で書いた通り、ヘルスチェックに失敗していたせいでLCUが上がったのかと推測していました。しかし、今日またAWSのログを見てみましたが、相変わらず山があります。1月3日にヘルスチェックをなおしたので、4日は上がらないことを期待してましたがやっぱり上がってます。

ヘルスチェックは定期的に動いているはずなので、やっぱりヘルスチェックが原因でたまにLCUが爆上がりするというのはやはりおかしいですよね。ということで次の手をやっていきます。
CloudWatch を見ていくと、
- ActiveConnection が上がる時間帯がある
- それに引っ張られて ConsumedLCUs がスパイクする
という状況。チャッピーに聞いたところWordPressのwp-cronが怪しいとのこと。というわけで今回は、wp-cron を止めてOSのcronによる定期実行に変更します。
そもそもwp-cron とは?
wp-cron は WordPress に標準で組み込まれている 擬似 cron です。
- 投稿の予約公開
- プラグインの定期処理
- 自動更新やクリーンアップ
などを担当しています。ただし重要な特徴があります。
wp-cron はアクセスがあったタイミングでしか実行されない
しかし逆を言えば
- 誰かがサイトを見る
- 管理画面を開く
- クローラが巡回する
たびに「実行待ちの cron があれば /wp-cron.php を叩く」という仕組みのようです。つまり何らかのアクセスがあると負荷が上がるという今回の状況に合致する気がします。
修正前のアクセスログ
Apache の access_log を確認すると、こんなログが大量に出ていました。
POST /wp-cron.php?doing_wp_cron=...
User-Agent: WordPress/6.9
特徴は:
- 実行間隔が 不規則
- POST リクエスト
- アクセス起点で発火
つまり、
- 少量のアクセスでも
- wp-cron が同期的に実行され
- PHP 処理が居座る
- ActiveConnection が増えて負荷が上がってLCUも上がる
という状態と予想されます。
管理画面を開きっぱなしもトリガーになる
補足ですが、チャッピーによるとWordPress の管理画面を開きっぱなしにしていると、
- Heartbeat API(Ajax通信)
- 自動保存
- セッション維持
などで内部通信が走るとのことで、これも wp-cron のトリガーになり得る らしいです。この可能性もありましたね。僕は管理画面をブラウザで開きっぱなしにしていたので。。
対策:wp-cron を止めて OS の cron に任せる
やったことはシンプル。wp-cronを止めてOSのcronで定期実行する。
1️⃣ WordPress 側の wp-cron を無効化
wp-config.php に以下を追加。(再起動は不要)
define('DISABLE_WP_CRON', true);
2️⃣ OS の cron で wp-cron を定期実行
crontab に以下を登録。
* * * * * curl -sS https://akkeys-lifework-lab.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
- 1分に1回
- GET リクエスト
ログで見るビフォーアフター
Before(アクセス起点)
POST /wp-cron.php
User-Agent: WordPress/6.9
実行タイミング:バラバラ
After(cron 起点)
GET /wp-cron.php
User-Agent: curl/8.3.0
実行タイミング:毎分
実行回数も 1/10 以下 に減少していました。
まとめ
- 外部アクセスにALBの負荷を左右されなくなった
- wp-cron はALB 配下では負荷要因になる可能性がある
- 時間発火なので管理画面を開きっぱなしでも気にしなくてよくなる
まだLCUが下がるかどうかは検証が必要ですが、今回の対策はここまでです。1月4日の18時ごろ設定を変えたので、それ以降落ち着いていれば効いたってことになりますね。また後ほど報告したいと思います。しかし、ちゃんと対策しないとバンバンお金持っていかれちゃいますね。無知な人が搾り取られる。世界の縮図か。