这类问题我又碰上了一次。用 sysbench 0.5 测一台 ECS 的数据库性能,oltp_read_write 只有一千二 TPS,同一套服务上线实际能跑到两千五,怀疑是压错了对象。
第一反应是「只跑默认的十秒,预热还没结束就出结果」,验证下来不成立。
这类报错背后常见的原因有几处,逐个排除就行。0.5 和 1.0 的参数名不一样,表数、线程数、只读比例都没对上;测试表太小,数据全在 buffer pool 里,跟线上数据量差一个量级;云盘是突发性能型,前几分钟的额度用完就掉速。
上来先确认版本和对应参数名
sysbench --version && sysbench --help | head -30
然后按线上数据量准备测试表
sysbench oltp_read_write --tables=10 --table-size=5000000 --mysql-db=bench prepare
拉长预热并分段取结果
sysbench oltp_read_write --threads=16 --time=300 --report-interval=10 run
等前面都确认过,再对照压测期间的磁盘与 CPU 水位
iostat -x 5 6 && pidstat -u 5 6
恢复的判定其实很直接。对齐参数和数据量后结果与线上实测差在一成以内,压测期间的 buffer pool 命中率也接近线上数值。
提醒一点。压测结论只对相同参数和相同数据量成立,换版本、换表规模都得重跑;报数时把版本、线程数、数据量写进记录,别人才复现得了。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
