最近一台外贸站的主机面板 CPU 长期顶着 90% 以上,前台打开不算特别慢,但一有人挂着 /wp-admin/,负载就往上蹿。top 里 php-fpm worker 轮流占满,Nginx 访问日志里出现大量 POST /wp-admin/admin-ajax.php。很多人第一反应是「加机器」或「关插件」,更省事的顺序是:先确认是不是 Heartbeat / 某插件在狂刷 admin-ajax,再针对性降频。
先确认:是不是 admin-ajax 在刷盘
别先改配置。打开一台能复现的电脑,登录后台后保持编辑页或仪表盘开着,同时:
只读统计访问日志示例(路径按你的主机调整):
# 最近访问里 admin-ajax 占比粗看
grep 'admin-ajax.php' /var/log/nginx/access.log | tail -n 5000 | wc -l
# 按分钟粗看密度(POST body 在 access 里不一定有,需配合浏览器或慢日志)
grep 'admin-ajax.php' /var/log/nginx/access.log | tail -n 2000 \\
| awk '{print $4}' | cut -d: -f1-2 | uniq -c | sort -nr | head
若短时间内同一 IP、同一登录会话打出几十次 admin-ajax.php,而前台匿名流量并不高,优先怀疑后台会话里的 Heartbeat 或插件轮询,而不是「整站被打」。无人开后台时负载应接近基线——这是后面验收时要对比的参照。

用 Network / Query Monitor 揪出调用方
在 Network 里点开单条 admin-ajax.php:
- Form Data / Payload 看 action、_nonce、是否带 interval
- Initiator 看是 heartbeat.min.js 还是某个插件脚本(路径里常有插件目录名)
- 耗时特别长的 action 记下来,后面优先处理「贵」的,不只是「密」的
装了 Query Monitor 时,打开 AJAX / Queries 面板,对照同一次后台停留:哪个 action 触发了多少查询、是否重复跑同一组 SQL。没有 QM 时,临时开慢查询日志或 php-fpm slowlog,也能把「刷得勤」和「单次很重」分开。两者叠加(又勤又重)最伤 CPU。
需要把 Heartbeat、对象缓存、全页缓存和慢查询放在同一张图里对照时,可以参考 WordPress 性能分层排查,先确认瓶颈落在「后台轮询层」再动刀,避免和 CDN / 页面缓存问题搅在一起。
安全降频:先限 Heartbeat,再查插件轮询
核心 Heartbeat 默认在后台大约 15 秒一次,多人同时开着编辑页时,admin-ajax 会线性叠加。常见做法是后台拉长间隔、前台关掉,而不是一刀切禁用导致自动保存失效。
在主题或站点专用小插件里(生产请先备份,并在低峰验证):
// 后台:15s → 60s;前台:停用 Heartbeat
add_action('init', function () {
if (!is_admin()) {
wp_deregister_script('heartbeat');
return;
}
});
add_filter('heartbeat_settings', function ($settings) {
$settings['interval'] = 60; // 秒
return $settings;
});
注意:
- 文章编辑页仍建议保留 Heartbeat(自动保存、修订、多人编辑提示依赖它),只降频通常比完全 deregister 更稳。
- 若必须在编辑页也停,先和编辑确认可接受「丢自动保存」。
- 不要在未确认调用方前,用安全插件「一键屏蔽全部 admin-ajax」——结账、表单、部分后台功能也会走这条入口。
Heartbeat 降下来之后,若 Network 里仍有高频非 heartbeat 的 action,按插件名 / 脚本 Initiator 逐个禁用验证:页建器自动保存与预览轮询、统计插件实时面板、会员在线状态、Woo 相关 fragment 刷新都是常客。改一项测一项,避免一次关一串说不清是谁贡献的。
也有人会在 functions.php 里用 heartbeat_received / heartbeat_nopriv_received 相关钩子做自定义逻辑——若你或某插件往 Heartbeat 响应里塞了重查询,降频只能缓解,根因仍要拆掉那段回调。改完后用同一后台会话对比改前改后的 Network 截图,比只看「感觉快了」更有说服力。
验证 CPU 真的下来了
验收清单
- Network / access log 已区分 heartbeat 与其它 action=,并记下高频调用方
- Heartbeat:后台已降频(如 60s);前台按需禁用;编辑页自动保存仍可用
- 非 Heartbeat 的狂刷插件已定位并关闭轮询 / 换设置 / 替换
- 挂后台 5–10 分钟后 CPU / php-fpm 明显回落;匿名前台关键路径正常
- 未用「全局封禁 admin-ajax」这类过宽规则;变更已记录便于回滚
后台 CPU 被 admin-ajax 打满时,先数清楚谁在刷、刷的是 Heartbeat 还是插件 action,再降频或关轮询,通常比直接加 CPU 配额更可控。



