记录一下那天晚上的排查过程。WordPress 6.5 站点白天响应 300ms,蜘蛛密集抓取时涨到 2.5 秒,日志里同一时间总有 wp-cron.php 的请求,几个定时任务叠在一起跑。
刚开始盯着「没有对象缓存,每次 cron 都要重新查一遍数据库」,折腾了半个多小时,排掉了。
把日志和配置对完,能解释这个现象的基本就这几处。wp-cron 由页面访问触发,蜘蛛抓取等于不断触发任务。还有一种是某个插件在 cron 里同步调用外部接口,单次卡十几秒。
另外,定时任务失败后不断重试,请求越积越多。
上来先看 cron 请求的触发频率
grep 'wp-cron.php' access.log | awk '{print substr($4,2,14)}' | uniq -c | sort -rn | head
再往下列出即将执行的任务
wp cron event list --fields=hook,next_run_relative
然后关闭页面触发改成系统定时
define('DISABLE_WP_CRON', true);
等前面都确认过,再用系统 cron 每分钟跑一次
*/5 * * * * cd /var/www && wp cron event run --due-now >/dev/null 2>&1
怎么算真的好了,看的是同一批现象。抓取高峰时段不再出现 wp-cron 请求,蜘蛛侧响应时间回到 400ms 以内,定时任务执行时间也稳定下来。
蜘蛛抓取会持续触发 wp-cron,把定时任务和页面访问解耦是这类卡顿最常见的一步。这类问题最好一次改到位,反复小改反而容易把原因搅混。
