知识卡片
性能的正式定义是响应时间,优化"CPU利用率"是个陷阱
内容
“性能”这个词几乎人人都在用,但不同人心里想的可能是完全不同 的东西——每秒查询数、CPU利用率、可扩展性……这些理解各有道理, 但用来指导优化工作时会互相打架。真正该采用的定义很单纯:性能 就是完成某个任务所需要的时间,对数据库而言就是查询的响应 时间。这个定义之所以重要,是因为它排除了一类看起来合理、实则 会把人带偏的替代指标——把CPU利用率当作优化目标就是一个典型 陷阱:如果目标是”降低CPU利用率”,那减少资源使用就成了正确 方向,但资源本来就是拿来消耗、拿来干活的,有时候多消耗资源 反而能让查询跑得更快。书里给出一个具体反例:把老版本InnoDB 升级到新版本后,CPU利用率经常会明显上升,这并不代表性能变差 了,恰恰相反,往往说明新版本把资源利用得更充分了——真正该看 的是查询的响应时间有没有变好,而不是CPU利用率这个”现象”(虽然 版本升级偶尔也会引入bug,比如索引失效导致CPU利用率异常飙升, 但这也只能靠响应时间是否变差来判断,不能靠CPU利用率本身下 结论)。同样,把”每秒查询量”(吞吐量)当作优化目标也是同一类 误区的变体——吞吐量提升其实是响应时间优化的副产品(吞吐量正好 是响应时间的倒数),直接以吞吐量为目标容易只顾表面数字、忽略 真正决定用户体验的单次查询耗时。判断一个优化方向是不是走对了, 永远要回到”完成这个任务花了多长时间”这个最朴素的问题上。
参考来源
- 位置:《高性能MySQL:第3版》第3章"服务器性能剖析"3.1节"性能
优化简介"(源文件:_epub-src/OEBPS/Text/part0010.xhtml)
- 结论依据:原文明确"我们将性能定义为完成某件任务所需要的时间
度量,换句话说,性能即响应时间……如果你认为性能优化是降低
CPU利用率,那么可以减少对资源的使用。但这是一个陷阱……很多
时候将使用老版本InnoDB引擎的MySQL升级到新版本后,CPU利用率
会上升得很厉害,这并不代表性能出现了问题,反而说明新版本的
InnoDB对资源的利用率上升了……如果把性能优化仅仅看成是提升
每秒查询量,这其实只是吞吐量优化。吞吐量的提升可以看作性能
优化的副产品",直接说明性能的正确定义及两类常见的替代指标
陷阱。
- 原始内容:我们将性能定义为完成某件任务所需要的时间度量,
换句话说,性能即响应时间,这是一个非常重要的原则。我们通过
任务和时间而不是资源来测量性能。