sysbench命令报“command not found”常见于源码安装未指定--prefix或PATH未更新,或包管理器安装时源未启用;Ubuntu需开启universe源后apt install,CentOS需先启用EPEL;prepare前须手动创建数据库sbtest及用户授权;卡顿因单线程建表,默认参数未优化,应调高threads、关闭autocommit、调整InnoDB日志刷盘策略;QPS低多因元数据锁或缓冲池不足,需升级sysbench、设置report-interval与buffer_pool_size。

sysbench 安装后 sysbench 命令报 “command not found”
常见于源码编译安装未加 --prefix 或未更新 $PATH,也可能是用包管理器装错包名(比如 Ubuntu 的 sysbench 包在 universe 源里,默认不启用)。
- Ubuntu/Debian:先确认源已开启
universe,再运行sudo apt update && sudo apt install sysbench - CentOS/RHEL 8+:用
dnf install epel-release sysbench,EPEL 必须先启 - 源码安装后:检查
./configure --prefix=/usr/local是否执行,然后确认/usr/local/bin在$PATH中,或直接用绝对路径调用/usr/local/bin/sysbench
压测前必须手动创建数据库和用户,sysbench 不会自动建库
很多人跑 sysbench oltp_read_write --db-driver=mysql ... prepare 报错 Unknown database 'sbtest',是因为 sysbench 只操作表,不建库。MySQL 默认也不允许从命令行自动建库(权限和安全限制)。
- 先手动登录 MySQL 执行:
CREATE DATABASE sbtest CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; - 再建专用压测用户并授权:
CREATE USER 'sbuser'@'localhost' IDENTIFIED BY 'pass123'; GRANT ALL ON sbtest.* TO 'sbuser'@'localhost'; -
--mysql-db=sbtest和--mysql-user=sbuser必须显式指定,不能依赖默认值
sysbench prepare 卡住或生成数据极慢
本质是单线程建表 + 插入,默认每张表 100 万行,但没开并发、没调批量、没关 autocommit,I/O 和事务开销拉满。
- 加
--threads=8(根据 CPU 核数设,别盲目堆高) - 加
--time=0(prepare 阶段不用限时间) - 关键参数:
--mysql-storage-engine=innodb --table-size=100000 --tables=4,小表 + 多表比大表更快预热 - 如果磁盘慢,提前在 MySQL 里关掉
innodb_flush_log_at_trx_commit=2和sync_binlog=0(仅测试环境!压完记得改回)
压测时 QPS 上不去,mysqladmin processlist 看到大量 Waiting for table metadata lock
这是典型 DDL 与 DML 冲突,常见于用老版本 sysbench(如 1.0.20 之前)在 prepare 后立刻 run,而某些场景下它会悄悄重建索引或分析表——触发元数据锁阻塞。
- 升级到
sysbench 1.1.0+,它默认禁用自动ANALYZE TABLE - 压测命令中显式加
--skip-trx=on(跳过事务包装,适合只读场景)或--mysql-ignore-errors=1213,2013(忽略死锁和连接中断) - 观察
SHOW ENGINE INNODB STATUS\G里的LATEST DETECTED DEADLOCK,确认是否因隔离级别(默认 REPEATABLE-READ)导致间隙锁争用
真实压测里,--report-interval=10 和 --time=300 要配合用,避免刚热起来就停;另外 innodb_buffer_pool_size 至少设为物理内存的 50%~70%,否则全盘刷脏页,QPS 会断崖下跌。


















