mysql> set @input := 'hello world'; Query OK, 0 rows affected (0.00 sec) mysql> select benchmark(1000000,MD5(@input)); +--------------------------------+ | benchmark(1000000,MD5(@input)) | +--------------------------------+ | 0 | +--------------------------------+ 1 row in set (1.45 sec) mysql> select benchmark(1000000,SHA1(@input)); +---------------------------------+ | benchmark(1000000,SHA1(@input)) | +---------------------------------+ | 0 | +---------------------------------+ 1 row in set (1.40 sec)
虽然benchmark()函数用起来很方便,但是不适合用来做真正的基准测试,因为该函数只是简单地返回服务器执行表达式的时间,不会涉及分析和开销,等因素。
而且表达式必须像这个例子一样包含用户定义的变量(input),否则会多次执行同样的表达式会因为系统缓存命中而影响结果。
具体测试实践,请看sysbench实践,tpcc-mysql实践;
总结
四小类:写入测试,更新测试,纯度测试,混合模式
性能测试衡量指标:
服务吞吐量
TPS--每秒执行事务的总量
QPS--每秒执行请求的总量
服务响应时间
服务并发性
设计测试常见错误:
使用数据子集而不是全集,
与真实用户行为不匹配,
没有检查错误,
忽略了系统预热过程,测试时间太短;
测试方法
测试规划:
记录测试数据,
系统配置步骤,
测试步骤,
分析结果,
预热方案;
测试时间:测试应该运行足够长的时间,至少等于系统预热的时间。
获取系统性能和状态:cpu,IO,网络流量,mysql状态计数器;
运行测试:自动化测试包含:数据装载,系统预热,执行测试,记录结果。
绘图分析:直观的发现问题;
测试工具:sysbench,tpcc-mysql,benchmark()
测试小结:
IO Bound测试数据量要远大于内存,cpu Bound测试数据量要小于内存
测试时间建议大于60分钟,减小误差;有系统预热时间;
Sysbench更倾向于测试Mysql性能,Tpcc更接近于业务
运行测试程序需要同时监控机器负载,Mysql各项监控指标