最直接信号是frankenphp_queue_depth持续>0,说明请求排队等待空闲线程;同时frankenphp_threads_busy/frankenphp_threads_total比值长期>0.8,且htop显示大量线程处于s状态,表明线程卡在i/o或下游依赖而非cpu瓶颈。

看 frankenphp_queue_depth 指标是否持续大于 0
这是最直接的信号:只要这个值 > 0,说明新请求进不来,正在排队等空闲线程。它不是瞬时抖动,而是持续存在(比如压测中稳定在 5~20),就代表线程池已饱和。该指标需通过 /metrics 端点暴露,前提是 Caddyfile 中启用了 prometheus 指令。
查 frankenphp_threads_busy / frankenphp_threads_total 比值是否长期超 0.8
比值高 ≠ CPU 忙,而是线程全卡在 I/O 或锁上。例如 busy=15、total=16,比值≈0.94,但 htop -p $(pgrep -f frankenphp) 里大量线程状态是 S(sleep),说明它们在等数据库响应、cURL 返回或文件锁释放——此时加 CPU 核数毫无意义。
结合 curl -s http://localhost:8000/fpm-status?json 看实时队列长度
这个端点返回结构化 JSON,重点盯 queue_length 字段。它和 frankenphp_queue_depth 含义一致,但更轻量、无需 Prometheus 配置。注意:必须在 Caddyfile 的 frankenphp 块中显式启用 status 指令,否则 404。
别只信 top 里的 CPU%,用 htop -p $(pgrep -f frankenphp) 看线程状态分布
常见误判是看到 CPU idle 高就认为“还有余力”。实际上,如果多数 FrankenPHP 线程处于 S(不可中断睡眠)而非 R(运行中),说明瓶颈在外部依赖(如 MySQL 连接池耗尽、Redis 超时、未设 LOCK_NB 的 flock)。此时队列积压是结果,不是原因。
CURLOPT_HEADERFUNCTION 记录各阶段耗时)才能定位。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











