应优先启用 event mpm 模式,它通过事件驱动分离监听与工作线程,减少上下文切换和阻塞等待;再依内存与 cpu 精算 maxrequestworkers 和 threadsperchild,收紧 keepalivetimeout 至 2 秒,并剥离阻塞型任务。

Apache 在高频并发请求下出现 CPU 竞争,本质是请求处理模型与系统资源分配不匹配导致的——进程/线程频繁创建销毁、锁竞争加剧、上下文切换开销大。解决重点不在“压低 CPU 使用率”,而在于**减少无效调度、规避阻塞等待、让单位 CPU 更高效地服务更多连接**。
换用 event MPM 并合理调参
prefork(一请求一进程)和 worker(多线程)在高并发时易因进程/线程数量膨胀引发严重 CPU 竞争。event MPM 是当前最适配高频并发的模型:它用少量线程 + 事件驱动机制管理大量连接,尤其擅长处理 KeepAlive 空闲连接和慢速客户端。
- 确认已启用:
apache2ctl -V | grep MPM输出应含event - 关键参数示例(4核8G 云服务器):
StartServers 3<br> MinSpareThreads 32<br> MaxSpareThreads 96<br> ThreadsPerChild 32<br> MaxRequestWorkers 512<br> MaxConnectionsPerChild 10000
注意:MaxRequestWorkers不可超过ThreadsPerChild × 进程数,且需预留内存(每个线程约 2–4MB) - 禁用 prefork 和 worker 模块:
a2dismod mpm_prefork mpm_worker,再a2enmod mpm_event
收紧 KeepAlive 与超时设置
过长的 KeepAliveTimeout 会让大量线程卡在“等下一个请求”的空闲状态,既不释放资源,又持续参与调度竞争。
PHP中文网提供Apache 2.4.62 官方 tar.gz 源码包下载,通过源码编译安装,开发者能够灵活定制模块、优化性能并精准控制安装路径,满足多样化的业务需求。
- 关闭无意义的长连接:
KeepAlive On保留,但大幅缩短超时:KeepAliveTimeout 2 - 限制单连接请求数:
MaxKeepAliveRequests 100(避免一个连接长期霸占线程) - 对 API 或动态接口,可在特定 Location 中关闭:
<location><br> KeepAlive Off<br></location>
剥离阻塞型任务,交由异步或外部服务
CPU 竞争常源于 Apache 子进程被阻塞(如 PHP 同步调用数据库、文件读写、远程 HTTP 请求),导致线程无法及时响应新请求。
- 静态资源全交给 Nginx 反向代理处理,Apache 专注动态逻辑
- 耗时操作改用消息队列(如 RabbitMQ、Redis Pub/Sub)异步执行,Apache 立即返回响应
- 数据库查询加索引、启用查询缓存;PHP 应用启用 OPcache,避免重复编译
- 禁用非必要模块(如
mod_info、mod_status生产环境慎开),减少模块间锁竞争
系统级协同优化
Apache 的 CPU 表现受内核调度和资源限制直接影响:
- 提高文件描述符上限:
echo '* soft nofile 65535' >> /etc/security/limits.conf<br> echo '* hard nofile 65535' >> /etc/security/limits.conf
并在 Apache 启动脚本中加入ulimit -n 65535 - 调优 TCP 栈:
net.core.somaxconn = 65535<br> net.ipv4.tcp_max_syn_backlog = 65535<br> net.ipv4.tcp_tw_reuse = 1
写入/etc/sysctl.conf后执行sysctl -p - 绑定 CPU(可选):对多核服务器,可用
taskset -c 0,1,2,3 systemctl restart apache2固定 Apache 工作线程到指定核心,减少跨核缓存失效
不复杂但容易忽略:CPU 竞争往往是表象,背后常是 I/O 阻塞、低效代码或配置错配。先切到 event MPM,收紧超时,再剥离阻塞任务,三步做完,多数高频场景的 CPU 峰值能下降 40% 以上。










