单靠hyperf_db_query_duration_ms无法暴露连接池瓶颈,因其仅记录pdo执行耗时,不包含排队时间,也不反映连接数超限、锁等待或mysql拒绝新连接等底层问题;必须结合mysqld_exporter提供的mysql_global_status_threads_connected、aborted_connects等原生指标联动分析才能准确定位。

单靠 hyperf_db_query_duration_ms 指标完全看不出连接池是否已满——它只记录 PDO 执行耗时,不包含排队时间,更不反映连接数上限、锁等待或 MySQL 层拒绝新连接的信号。
为什么 hyperf_db_query_duration_ms 无法暴露连接池瓶颈
这个指标是 Hyperf 在 PDO::prepare 开始到 execute 返回之间打点的,属于“框架层耗时”,天然屏蔽了以下真实瓶颈:
- 连接池队列中等待获取连接的时间(Hyperf 日志里只会显示“wait timeout”,但无排队时长统计)
- MySQL 已达
max_connections上限,新连接被直接拒绝,PDO 报错SQLSTATE[HY000] [2002] Connection refused或超时,而hyperf_db_query_duration_ms根本不会触发 - 连接池配置的
min_connections/max_connections与实际 QPS 不匹配:比如设了max: 20,但高峰 QPS 稳定在 300,大量请求卡在连接获取阶段 - PHP 进程重启或连接泄漏导致空闲连接未归还,
threads_connected持续攀升却未触发告警
必须抓取的 MySQL 原生指标(mysqld_exporter 提供)
要定位连接池是否成为瓶颈,得看 MySQL 自身状态,而不是 PHP 框架里的耗时。以下指标必须出现在 Prometheus 中,并在 Grafana 里建立联动面板:
-
mysql_global_status_threads_connected:当前已建立的连接数,对比max_connections值(可通过mysql_global_variables_max_connections获取) -
mysql_global_status_threads_created:自启动以来创建的连接总数,若该值每秒持续增长且threads_connected不降,说明连接复用失败或泄漏 -
mysql_global_status_aborted_connects:失败连接数,突增说明账号权限不足、网络不通或 MySQL 主动拒绝(如 max_connections 超限) -
mysql_global_status_threads_running:当前活跃线程数,远低于threads_connected时,大概率是大量连接处于 Sleep 状态,但连接池仍不断新建连接
注意:mysqld_exporter 必须启用 --collect.global-status(默认开启),否则这些指标为空。
mysqld_exporter 权限配置错误会导致关键指标缺失
如果 mysql_global_status_threads_connected 一直为 0 或报错,不是 MySQL 没数据,而是 exporter 账号权限不够。典型错误日志:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
Error pinging mysqld: error getting info from MySQL: SELECT command denied to user 'exporter'@'x.x.x.x' for table 'processlist'
正确授权语句(仅最小权限):
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_strong_password'; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%'; FLUSH PRIVILEGES;
禁止授予 FILE、SHUTDOWN、GRANT OPTION —— 这些权限在生产环境会带来严重安全风险。
Grafana 中识别连接池饱和的实操信号
不要只盯着单个指标曲线,要组合判断。以下组合出现即表明连接池已成瓶颈:
-
mysql_global_status_threads_connected> 90% ×mysql_global_variables_max_connections,且持续 >5 分钟 -
hyperf_db_query_duration_ms的 P95 无明显升高,但应用层 HTTP 503/timeout 错误激增 -
mysql_global_status_aborted_connects出现阶梯式上升,同时mysql_up == 0(说明 MySQL 实例本身还活着,但拒绝新连) - 在相同 QPS 下,
mysql_global_status_threads_created每秒新增 >5,而threads_connected波动剧烈 —— 典型连接未复用或短连接滥用
真正难排查的是“伪正常”:hyperf_db_query_duration_ms 平稳、MySQL 连接数也没爆,但业务 RT 升高。这时候得查 mysqld_exporter 是否漏配了 --collect.info-schema.processlist —— 缺失它,你就看不到有多少连接卡在 Waiting for table metadata lock 或 Locked 状态。










