第章 服务器性能剖析
在我们的技术咨询生涯中最常碰到的三个性能相关的服务请求是如何确认服务器是否达到了性能最佳的状态找出某条语句为什么执行不够快以及诊断被用户描述成停顿堆积或者卡死的某些间歇性疑难故障本章将主要针对这三个问题做出解答我们将提供一些工具和技巧来优化整机的性能优化单条语句的执行速度以及诊断或者解决那些很难观察到的问题(这些问题用户往往很难知道其根源有时候甚至都很难察觉到它的存在)
这看起来是个艰巨的任务但是事实证明有一个简单的方法能够从噪声中发现苗头这个方法就是专注于测量服务器的时间花费在哪里使用的技术则是性能剖析(profiling)在本章我们将展示如何测量系统并生成剖析报告以及如何分析系统的整个堆栈(stack)包括从应用程序到数据库服务器到单个查询
首先我们要保持空杯精神抛弃掉一些关于性能的常见的误解这有一定的难度下面我们一起通过一些例子来说明问题在哪里
性能优化简介
问 个人关于性能的问题可能会得到 个不同的回答比如每秒查询次数CPU利用率可扩展性之类这其实也没有问题每个人在不同场景下对性能有不同的理解但本章将给性能一个正式的定义我们将性能定义为完成某件任务所需要的时间度量换句话说性能即响应时间这是一个非常重要的原则我们通过任务和时间而不是资源来测量性能数据库服务器的目的是执行SQL 语句所以它关注的任务是查询或者语句如SELECTUPDATEDELETE 等注数据库服务器的性能用查询的响应时间来度量单位是每个查询花费的时间
还有另外一个问题什么是优化?我们暂时不讨论这个问题而是假设性能优化就是在一定的工作负载下尽可能地降低响应时间
很多人对此很迷茫假如你认为性能优化是降低CPU 利用率那么可以减少对资源的使用但这是一个陷阱资源是用来消耗并用来工作的所以有时候消耗更多的资源能够加快查询速度很多时候将使用老版本InnoDB 引擎的MySQL 升级到新版本后CPU利用率会上升得很厉害这并不代表性能出现了问题反而说明新版本的InnoDB 对资源的利用率上升了查询的响应时间则更能体现升级后的性能是不是变得更好版本升级有时候会带来一些bug比如不能利用某些索引从而导致CPU 利用率上升CPU 利用率只是一种现象而不是很好的可度量的目标
同样如果把性能优化仅仅看成是提升每秒查询量这其实只是吞吐量优化吞吐量的提升可以看作是性能优化的副产品对查询的优化可以让服务器每秒执行更多的查询因为每条查询执行的时间更短了(吞吐量的定义是单位时间内的查询数量这正好是我们对性能的定义的倒数)
所以如果目标是降低响应时间那么就需要理解为什么服务器执行查询需要这么多时间然后去减少或者消除那些对获得查询结果来说不必要的工作也就是说先要搞清楚时间花在哪里这就引申出优化的第二个原则无法测量就无法有效地优化所以第一步应该测量时间花在什么地方
我们观察到很多人在优化时都将精力放在修改一些东西上却很少去进行精确的测量我们的做法完全相反将花费非常多甚至% 的时间来测量响应时间花在哪里如果通过测量没有找到答案那要么是测量的方式错了要么是测量得不够完整如果测量了系统中完整而且正确的数据性能问题一般都能暴露出来对症下药的解决方案也就比较明了测量是一项很有挑战性的工作并且分析结果也同样有挑战性测出时间花在哪里和知道为什么花在那里是两码事
前面提到需要合适的测量范围这是什么意思呢?合适的测量范围是说只测量需要优化的活动有两种比较常见的情况会导致不合适的测量
在错误的时间启动和停止测量
测量的是聚合后的信息而不是目标活动本身
例如一个常见的错误是先查看慢查询然后又去排查整个服务器的情况来判断问题在哪里如果确认有慢查询那么就应该测量慢查询而不是测量整个服务器测量的应该是从慢查询的开始到结束的时间而不是查询之前或查询之后的时间
完成一项任务所需要的时间可以分成两部分执行时间和等待时间如果要优化任务的执行时间最好的办法是通过测量定位不同的子任务花费的时间然后优化去掉一些子任务降低子任务的执行频率或者提升子任务的效率而优化任务的等待时间则相对要复杂一些因为等待有可能是由其他系统间接影响导致任务之间也可能由于争用磁盘或者CPU 资源而相互影响根据时间是花在执行还是等待上的不同诊断也需要不同的工具和技术
刚才说到需要定位和优化子任务但只是一笔带过一些运行不频繁或者很短的子任务对整体响应时间的影响很小通常可以忽略不计那么如何确认哪些子任务是优化的目标呢?这个时候性能剖析就可以派上用场了
如何判断测量是正确的?
如果测量是如此重要那么测量错了会有什么后果?实际上测量经常都是错误的对数量的测量并不等于数量本身测量的错误可能很小跟实际情况区别不大但错的终归是错的所以这个问题其实应该是测量到底有多么不准确?这个问题在其他一些书中有详细的讨论但不是本书的主题但是要意识到使用的是测量数据而不是其所代表的实际数据通常来说测量的结果也可能有多种模糊的表现这可能导致推断出错误的结论
返回目录高性能MySQL
编辑推荐
ASP NET开发培训视频教程
数据仓库与数据挖掘培训视频教程
Oracle索引技术