知识卡片
短期压测结论不可靠:系统"余量"消耗完之前,数据看起来都很好
内容
一个常见的基准测试错误是只跑很短时间(比如60秒)就据此下结论, “我测了新版本,感觉还不如旧版本快”——但这类短期测试从一开始 就无法得出可靠结论,根源在于大多数系统天生就有应对突发压力的 缓冲余量:能把一部分工作暂时”吸收”、延迟到高峰期过后再处理, 短期内即便压力很大,表现出来的数据也可能相当漂亮,因为系统 还在用这部分余量硬撑。真正的问题是,只有把这份余量持续消耗 到用尽,系统原本能扛住的短期压力尖峰才会真正撑不住,性能开始 明显下滑——书中给出一个具体案例:给系统持续加压后画出的I/O 吞吐量时序图显示,读I/O在预热完成后大约三四个小时才趋于稳定, 写I/O至少需要八个小时才能稳定下来,整个测试一共跑了72小时才 真正体现出系统的长期真实行为。这就引出一条实用的经验法则: 系统看起来变稳定所需要的时间,至少要等于系统完成预热所需要的 时间——如果预热本身就要几个小时,那测试至少也要跑几个小时 才有意义,跑60秒得到的只是”余量还没耗尽时”的假象,而不是系统 真实的稳态表现。这解释了为什么”没时间做8到12小时的完整测试” 不是一个可以将就的理由:花时间做的短期测试如果得出的是错误 结论,那这些时间本身就是纯粹的浪费,还不如干脆参考别人做过的 可靠测试结果。
参考来源
- 位置:《高性能MySQL:第3版》第2章"MySQL基准测试"2.3.2节
"基准测试应该运行多长时间"(源文件:
_epub-src/OEBPS/Text/part0009.xhtml)
- 结论依据:原文明确"大部分系统都会有一些应对突发情况的余量,
能够吸收性能尖峰,将一些工作延迟到高峰期之后执行。但当对
机器加压足够长时间之后,这些余量会被消耗尽,系统的短期尖峰
也就无法维持原来的高性能……读I/O活动在三四个小时后曲线趋向
稳定,但写I/O至少在八小时内变化还是很大……一个简单的测试
规则,就是等系统看起来稳定的时间至少等于系统预热的时间",
直接说明短期测试无法体现真实稳态表现的原因及判断稳定所需
时长的经验法则。
- 原始内容:一个简单的测试规则,就是等系统看起来稳定的时间
至少等于系统预热的时间。本例中的测试持续了72个小时才结束,
以确保能够体现系统长期的行为。