MySQL一问一实验

第36问:用 mysqlslap 压测的结果,为什么比用 sys

2021-04-30  本文已影响0人  爱可生开源社区
image

问题

用 mysqlslap 压测 SQL 的结果,好像比用 sysbench 压测 SQL 的结果更平稳,为什么?

实验

随便找个数据库,

我们用以下 SQL 进行压测:

select sleep(@val := coalesce(@val, 0) + 1) from dual;

这个 SQL 每运行一次,sleep 的时间都会加一秒。第一次是 sleep(1),第二次是 sleep(2),...

我们先用 mysqlslap 进行压测:

image

查看结果:

image

解读一下 mysqlslap 的结果:

需要注意:结果中有个 Max 和 Min,经常发现大家将 Max 除以每轮 SQL 的个数,得出 SQL 延迟的最大时间,这个计算是错误的。

Max 和 Min 指的是如果 mysqlslap 进行多轮测试(iterations > 1),每轮运行时间的最大值和最小值。与单个 SQL 的延迟无关。

在本例中,如果我们将 --iterations 改成 3,到的 Max/Avg/Min 都是 15s 左右,但我们知道这些 SQL 的延迟分别是 1s,2s,...,5s,通过 Max/Avg/Min 无法计算得到单个 SQL 延迟的最大值/最小值。

再用 sysbench 测一次:

写一个 LUA 脚本(不会写的同学,可以直接复制 sysbench 自带的脚本 bulk_insert.lua,拿过来改一改):

image

然后运行 sysbench 压测:

image

查看结果,会发现 95% 分位数偏离平均值比较远,意味着同一个 SQL 的延迟变化较大。

image

通过以上简单实验,我们发现:

也就是说 mysqlslap 比 sysbench 的压测结果更平稳的原因,是大家对 mysqlslap 的结果进行处理时进行了错误的计算,导致波动被消除。

小贴士

本例中,我们特意使用了同一个 SQL。
如果业务压力来自于不同的 SQL,可以使用 ps_statement_avg_latency_histogram 获取不同 SQL 间的延迟差异图。


关于 MySQL 的技术内容,你们还有什么想知道的吗?赶紧留言告诉小编吧!

image
上一篇下一篇

猜你喜欢

热点阅读