Hyperf MySQL协程压测核心是验证高并发下协程链路稳定性,需关注连接池配置、真实协程SQL路径、协程语义压测工具及实时指标监控,而非单纯追求QPS。

Hyperf 的 MySQL 协程压测不是单纯“测数据库”,而是测整个协程链路在高并发下的稳定性与吞吐能力:从协程调度、连接池复用、SQL 执行到结果返回,每个环节都可能成为瓶颈。关键不在于跑多高 QPS,而在于能否持续稳定、不丢连接、不爆内存、不出现连接超时或空闲泄漏。
以下四点是实操中最核心的压测维度和做法:
✅ 压测前必须确认的协程环境配置
- 确保
config/autoload/server.php中启用了协程运行时:'settings' => [ 'enable_coroutine' => true, // 必开 'worker_num' => 4, // 建议设为 CPU 核心数 ], - 数据库连接池配置需匹配压测强度(示例):
'pool' => [ 'min_connections' => 5, 'max_connections' => 50, // 压测时建议设为 30–100,视机器资源而定 'wait_timeout' => 5.0, // 连接等待超时不能太短,否则大量报错“Unable to get connection” 'max_idle_time' => 30.0, // 避免连接长期空闲被 MySQL 主动断开(结合 MySQL 的 wait_timeout 参数) ] - 检查 MySQL 服务端配置是否宽松:
wait_timeout=300、max_connections=500+、innodb_buffer_pool_size足够,避免服务端先扛不住。
✅ 用真实协程 SQL 路径写压测用例
别用 file_get_contents 或同步 PDO——那测的不是 Hyperf。压测接口应走完整协程链路:
- 使用
Hyperf\Database\Connection或 Eloquent 模型 - 确保查询触发的是
Swoole\Coroutine\MySQL底层(可通过DB::connection()->getPdo()检查是否为Swoole\Coroutine\MySQL实例) - 示例压测接口(
/api/test-db):public function testDb() { $user = User::where('id', rand(1, 10000))->first(); // 触发协程查询 return $this->success($user?->toArray() ?? []); }
✅ 选对压测工具并模拟协程语义
WRK、ab、JMeter 本身不理解协程,但能有效施加 HTTP 并发压力;重点是:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 启动足够多的并发连接(如
wrk -t12 -c400 -d30s http://127.0.0.1:9501/api/test-db) - 观察指标要聚焦:
-
mysql pool used(hyperf:monitor可查)是否接近max_connections -
coroutine count(Server::stats()['coroutine_num'])是否突增后未回落 → 可能有协程卡住未结束 - 错误日志中是否高频出现
Connection refused、Too many connections、Wait timeout
-
- 补充用
co-phpunit跑单接口协程单元压测(适合验证连接池行为):php ./bin/co-phpunit --filter=testConcurrentSelect tests/Feature/DbStressTest.php
✅ 关键指标监控与瓶颈定位
压测中实时看这几项,比只盯 QPS 更有用:
-
连接池健康度:
php bin/hyperf.php db:pool-status查看used / total、wait_num(> 0 表示有协程在排队拿连接) -
协程生命周期:
在测试代码里加Co::stats()日志,关注coroutine_num和coroutine_peak_num -
MySQL 侧状态:
SHOW STATUS LIKE 'Threads_connected';、SHOW PROCESSLIST;看是否有大量 Sleep 连接或阻塞查询 -
内存与 GC:
memory_get_usage(true)+ 观察gc_collect_cycles()是否频繁触发,协程泄漏常表现为内存缓慢上涨
不复杂但容易忽略。










