apache 默认 access_log 不记录 pid,但可通过 logformat 中 %p 占位符显式添加,用于统计各子进程请求数、分析负载均衡性及结合 error_log 定位异常进程(如段错误、优雅重启等),在 prefork 和 worker/event mpm 下均有效。

Apache 默认访问日志(access_log)不记录服务进程 ID(PID),但可通过自定义 LogFormat 显式加入 %P 占位符实现——这是分析多进程负载分布最直接、最可靠的依据。
用 %P 记录每个请求对应的进程 ID
Apache 的 %P 日志变量表示“处理该请求的子进程 PID”,它在 prefork 和 event/worker MPM 下均有效,且与实际工作进程一一对应。只需修改 LogFormat 并重启即可生效:
- 编辑
httpd.conf或extra/httpd-vhosts.conf,添加或修改日志格式:
CustomLog "logs/access_log" combined_with_pid
重启 Apache 后,每行日志末尾就会追加一个数字,例如 12345,即当前处理该请求的 httpd 子进程 PID。
通过 PID 统计各进程请求数,判断负载是否均衡
日志有了 PID,就能用简单命令快速汇总每个进程承担了多少请求:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- Linux 下统计最近 10 万行中各 PID 出现频次(降序):
输出类似:
842 12345796 12346
783 12347
...
若数值相差过大(如最高是最低的 3 倍以上),说明 prefork 的子进程间负载不均,可能源于请求处理时长差异大(如混跑 PHP 脚本与静态文件)、或某些进程卡在慢后端连接未释放。
结合 error_log 中的 pid 信息交叉验证异常进程
当发现某 PID 请求量异常低或为零,可查 error_log 看它是否频繁报错或提前退出:
- 筛选该 PID 的全部日志(含启动、崩溃、模块错误):
常见线索包括:child pid 12345 exit signal Segmentation fault(段错误崩溃)、Graceful restart requested, doing restart(被优雅重启中断)、或大量 mod_php: unable to fork(资源耗尽无法派生)。这些都会导致该进程实际服务请求数骤减。
注意不同 MPM 下 PID 的含义略有区别
prefork:每个 PID 对应一个独占进程,%P 稳定可靠;
worker/event:PID 是工作进程 ID,同一 PID 会复用线程处理多个请求,%P 仍有效,但单个 PID 的请求数天然更高;
无论哪种模式,只要日志含 %P,就可用于识别“哪个具体进程实例”在响应——这是定位资源争用、内存泄漏、模块挂起等问题的关键起点。










