欢迎光临
我们一直在努力

WordPress 后台 Heartbeat / admin-ajax.php 把 CPU 打满:先定位谁在狂刷,再降频

最近一台外贸站的主机面板 CPU 长期顶着 90% 以上,前台打开不算特别慢,但一有人挂着 /wp-admin/,负载就往上蹿。top 里 php-fpm worker 轮流占满,Nginx 访问日志里出现大量 POST /wp-admin/admin-ajax.php。很多人第一反应是「加机器」或「关插件」,更省事的顺序是:先确认是不是 Heartbeat / 某插件在狂刷 admin-ajax,再针对性降频。

先确认:是不是 admin-ajax 在刷盘

别先改配置。打开一台能复现的电脑,登录后台后保持编辑页或仪表盘开着,同时:

  • 主机侧:top / htop 看 php-fpm 是否随后台会话升高;再盯 Nginx / Apache access log,把时间窗对准「有人挂着后台」的那几分钟。
  • 浏览器:F12 → Network,过滤 admin-ajax.php,看 30–60 秒内请求次数、耗时、Payload 里的 action=。把瀑布图按 Time 排序,一眼能看出「密」还是「单次很重」。
  • 区分两类请求:action=heartbeat(核心 Heartbeat)和 其它插件自定义 action(常是轮询库存、统计面板、页建器预览、购物车碎片刷新)。
  • 只读统计访问日志示例(路径按你的主机调整):

    # 最近访问里 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 真的下来了

  • 同一账号只开一个后台标签,观察 5–10 分钟:admin-ajax.php 次数应明显减少(例如从「每分钟几十次」降到接近降频后的预期)。
  • top / 主机监控:php-fpm CPU 随会话回落;无人开后台时负载应接近改之前的基线。
  • 抽查:写一篇草稿能否自动保存;关键插件设置页、列表页无报错;前台表单 / 结账若依赖 admin-ajax,匿名路径仍正常。
  • 若只在「多人同时挂后台」时爆,把间隔调到 60–120 秒,或约定非编辑时关掉多余后台标签——运维成本往往低于盲目升配。
  • 验收清单

    • Network / access log 已区分 heartbeat 与其它 action=,并记下高频调用方
    • Heartbeat:后台已降频(如 60s);前台按需禁用;编辑页自动保存仍可用
    • 非 Heartbeat 的狂刷插件已定位并关闭轮询 / 换设置 / 替换
    • 挂后台 5–10 分钟后 CPU / php-fpm 明显回落;匿名前台关键路径正常
    • 未用「全局封禁 admin-ajax」这类过宽规则;变更已记录便于回滚

    后台 CPU 被 admin-ajax 打满时,先数清楚谁在刷、刷的是 Heartbeat 还是插件 action,再降频或关轮询,通常比直接加 CPU 配额更可控。

    赞(0)
    未经允许不得转载:171主机测评 » WordPress 后台 Heartbeat / admin-ajax.php 把 CPU 打满:先定位谁在狂刷,再降频
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址