跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

mysql如何进行数据库连接性能测试_使用mysqlslap基准测试

mysqlslap测连接性能需用--concurrency控制并发建连、--iterations=1避免复用、--query="SELECT 1"禁用复杂SQL;其耗时含TCP握手、认证、查询三阶段,processlist快照与统计不一致因连接动态生命周期及系统级限制(如ulimit)。 mysql slap 连接数压测怎么写命令 直接跑默认参数的
mysqlslap
没意义,它默认只建 1 个连接、执行 1 次查询,完全测不出连接层瓶颈。真要测连接性能,核心是控制并发连接建立行为,而不是查数据。 实操建议: 用
--concurrency
控制并发连接数(不是查询并发),比如
--concurrency=100
表示同时发起 100 次 TCP 连接 + 认证 必须加
--iterations=1
,否则默认跑多次会复用连接,测的就不是“建连开销” 禁用查询执行:用
--query="SELECT 1"
最简语句,或更彻底地用
--no-defaults --skip-secure-auth
避免额外握手开销 加上
--auto-generate-sql
反而干扰结果——它会建临时表、触发元数据锁,测的是 SQL 引擎启动成本,不是连接本身 典型命令:
mysqlslap --host=localhost --user=root --password=xxx --concurrency=200 --iterations=1 --query="SELECT 1" --create-schema=test
为什么 show processlist 看到的连接数和 mysqlslap 报的不一致 因为
mysqlslap
统计的是“成功完成一次完整连接+查询+断开”的次数,而
SHOW PROCESSLIST
是某一毫秒的瞬时快照。压测过程中连接是动态创建又销毁的,尤其高并发下大量连接可能在认证阶段失败或超时,根本进不了 processlist。 常见错误现象: MySQL(Linux) MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。 下载
mysqlslap
报 “Failed to connect” 但
SHOW PROCESSLIST
里没看到对应连接——说明连接在 TCP 握手后、MySQL 认证前就被拒绝(如 max_connections 达到、max_connect_errors 触发) 实际 processlist 连接数远低于
--concurrency
设置值——可能是
wait_timeout
或
connect_timeout
太短,连接还没执行完就被服务端主动踢掉 报错
Too many connections
却发现
SHOW VARIABLES LIKE 'max_connections'
显示值很大——注意:Linux 用户级限制(
ulimit -n
)可能先于 MySQL 限制生效,socket 文件描述符耗尽会导致连接被系统拒绝 mysqlslap 测出来的时间包含哪些开销 它报告的 “Average number of seconds to run all queries” 不是纯网络 RTT,而是从客户端调用
mysql_real_connect()
开始,到收到最后一条查询响应并关闭连接为止的总耗时。中间混着三类延迟: TCP 连接建立(SYN/SYN-ACK/ACK) MySQL 认证流程(包括 SSL 握手,如果启用了
--ssl-mode=REQUIRED
) 单次简单查询执行 + 结果返回(哪怕只是
SELECT 1
,也要走权限检查、解析、优化器轻量路径) 所以如果你发现平均耗时 >100ms,别急着怀疑网络——先查 MySQL 错误日志有没有
Aborted connection
,再确认是否启用了 DNS 反向解析(
skip-name-resolve
未配置时,每个新连接都会触发 hostname lookup,慢得离谱)。 替代方案:比 mysqlslap 更准的连接层测试方式
mysqlslap
本质是个 SQL 压测工具,连接只是副产品。真要单独压连接建立性能,用原生工具更干净: 用
sysbench
的
oltp_common
模式配合
--threads=N --events=1 --time=0
,它会严格按线程数起连接且不发 SQL 写个 Python 脚本循环调用
pymysql.connect()
并计时,加
timeout=3
防卡死,比 shell 脚本更容易捕获异常类型(如
OperationalError(1040, 'Too many connections')
) 用
ab
或
wrk
完全不行——它们不理解 MySQL 协议,只能测 HTTP 接口 真正容易被忽略的是:MySQL 的连接接受能力不仅取决于
max_connections
,还受
table_open_cache
、
thread_cache_size
和操作系统
epoll
就绪队列长度影响。压到瓶颈时,先看
SHOW STATUS LIKE 'Threads_created'
是否飙升——如果是,说明线程缓存没起作用,连接反复创建销毁,这才是第一要调的点。

相关文章