Apache启动后CPU持续90%+是异常信号,表明存在资源死循环或阻塞,常见于模块冲突、KeepAlive/MaxRequestWorkers配置不当、PHP扩展不兼容或脚本死循环。

Apache 启动后 CPU 占用持续 90%+ 是什么信号
这不是正常现象,说明 Apache 进程内部发生了资源死循环或阻塞,常见于模块冲突、配置错误、日志写入异常或第三方扩展(如 mod_php 与某些扩展不兼容)引发的无限重试。Windows 任务管理器里看到多个 httpd.exe 进程高负载,基本可排除系统级干扰,问题就在 XAMPP 自身配置或运行时环境。
检查 httpd.conf 中的 KeepAlive 和 MaxRequestWorkers 设置
默认配置在低配机器上极易触发线程堆积:KeepAlive 开启但超时过长,配合过高的 MaxRequestWorkers,会让空闲连接长期占着线程不释放,最终耗尽资源并引发调度争抢。
实操建议:
- 打开
XAMPP\apache\conf\httpd.conf,找到KeepAlive行,设为KeepAlive Off(开发环境通常不需要持久连接) - 搜索
MaxRequestWorkers(旧版叫MaxClients),将其从默认的150降至32或64(视你物理内存而定,每进程约占用 2–5MB) - 确认
Timeout不超过30,避免慢请求拖垮整个服务
禁用可疑模块特别是 mod_php 和第三方扩展
XAMPP 默认启用 mod_php,但若你同时安装了独立 PHP(如通过 Windows PATH 注入),或启用了冲突扩展(如 php_xdebug.dll、php_opcache.dll 配置不当),Apache 可能在初始化阶段反复加载失败并重试,表现为 CPU 拉满但无响应。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
排查步骤:
- 临时注释掉
httpd.conf中所有LoadModule php和LoadModule xdebug行(在行首加#) - 重启 Apache,观察 CPU 是否回落;若恢复正常,再逐个启用,定位具体模块
- 检查
php.ini中opcache.enable=1是否搭配了不合理的opcache.validate_timestamps=0(开发中应设为1,否则可能引发文件监控异常)
查看 error.log 是否存在重复报错或 infinite loop 提示
CPU 持续高位时,XAMPP\apache\logs\error.log 往往被刷屏式写入,典型如:PHP Warning: Unknown: failed to open stream: Permission denied 或 Segmentation fault (core dumped) —— 这些不是单次错误,而是每秒重复数十次,说明 Apache 正在不断 fork 新进程尝试恢复,却始终失败。
关键动作:
- 用记事本或 VS Code 打开
error.log,滚动到底部,看最后 20 行是否密集出现同一类警告 - 特别注意路径权限问题:XAMPP 安装在
C:\Program Files\下时,Windows 可能阻止 Apache 写入日志或读取htdocs,建议重装到非系统目录如C:\xampp - 如果日志为空但 CPU 仍高,用
Process Explorer(微软官方工具)右键httpd.exe→ Properties → Threads 标签页,看哪个线程的 Stack 显示大量php_execute_script或zend_do_fcall,基本锁定是 PHP 层面死循环
php.ini 设置或某个扩展 DLL 在特定 Windows 权限/路径组合下触发了隐性死锁。盯住 error.log 最后几行 + 关掉 KeepAlive + 禁用 mod_php,三步做完还高,那大概率是你项目里的某个 PHP 脚本在 auto_prepend_file 或 index.php 里写了死循环,而不是 Apache 本身的问题。

















