当一个系统运行缓慢性能下降的时候很难知道原因是什么是内存洩漏磁盘子系统瓶颈还是某个特定应用程序在可扩展性方面有限制?有一些途径可以发现和了解引起性能问题的根源并且有可能消除它
本文给出了从哪里入手的一些建议文中介绍了如何着手性能方面的考虑以及如何定位常见的性能瓶颈还介绍了与性能密切相关一些概念比如私有的共享内存(ISMIntimate Shared Memory)与优先内存页面调度文章重点是放在Solaris 操作环境下
着手性能问题
性能或许比计算机系统其它方面的行为更需要有通盘的考虑为了识别来自一个或多个组件的问题根源必须要采取结构化的方法
实际的结果是解决性能问题过程中最重要的一个部分是定义你正在试图解决的问题从实际应用的方面来讲这意味着定义一个操作或者测试用例从而可以
A) 知道系统当前有多快
B) 知道系统需要快X倍或者知道系统曾经在不同环境下快过X倍
设置基线是开始的第一步性能分析是由简单明确地定义所需解决的问题开始的自上而下的一个过程如果你想要一个系统运行得快一些你仍然需要定义这个系统的哪些属性是你想要改进的以及哪些代价是你可以接受或者不可以接受的除非你能够明确地描述出问题症状/机会想要识别出问题的根源只会是碰运气
性能分析很象是侦探工作我们通过证据和观察建立事实依据非常小心不要陷入预先想象的与事实不符的结论中——只有在具备非常压倒性的证据时才确认猜想
对所有假设都要怀疑其他人声称的事实实际上只是个可能正确也可能不正确的假设如果这个假设是错误的你可能会是在不正确的依据下工作从而得出不正确的结论
这里有一些警告Solaris操作环境在大多数情形下对于工作负荷的自我性能优化都是很好的发行版本越新需要手工做的性能优化就越少性能问题的根源经常被发现是因为一个试图优化性能的行为引起的首先需要注意应用程序最后才是操作环境
任何对系统配置的更改比如象内存大小和磁盘布局这样的性能设置都应该检查其当前的正确性同样一个带参数的系统升级也有可能对新操作环境的性能带来影响
性能监测
从暴露出来的问题开始
什么操作使你看到性能问题的症状?
比如说是特定类型的数据库查询文件或网络操作比你期望的慢?在给出测试用例方面你能把操作步骤做到多具体例如一个SQL查询或者行的C程序?
最大程度利用你的知识尽可能准确地说明什么地方出了什么问题以定义你的问题良好的问题说明的例子就像这样
一个SQL查询在VXFS上比在UFS上要花两倍的时间
SVR消息队列操作在操作环境版本A上比在操作环境版本B上要多花百分之的时间
登录进系统A比登录进系统Y多花三倍的时间
一个问题说明不应该包括解决方法或者是可能的解决方法
在大部分的时候对问题有一个清晰的说明就意味着完成了解决问题过程的一大半了在对你试图解决的问题进行说明的时候考虑到用户观点的因素也很重要这意味着要从应用程序的角度来看这和人们的天性相反人们总是通过实验试图去证明或者证伪一个可能的原因而不是依据观察得到的事实来评估一个原因的可能性程度
不恰当的问题说明就象这样
mpstat的wt列表明等待时间过多
用户任务花时间太长
一个系统和它的应用程序的功能正确性问题与性能问题之间的边界往往是一个灰色地带整个系统挂起与进程挂起的问题不在本文讨论范围之内如果你怀疑系统的功能不正确而不是性能问题那么给你的SUN解决方案中心打电话以找到一个解决问题的方法高性能系统的前提是它的功能首先要正确
作为你积极的维护计划的一部分检查/var/adm/messages中有没有比如磁盘重试之类的硬件问题或者有没有额外的消息产生也是很有价值的
察看系统的历史信息也非常有价值如果你的系统曾经有过更好的性能画一条时间曲线详细记录何时第一次发现性能变差以及从什么时候开始性能一直很差
知道你的系统在正常情况下会怎样
保存你的系统是如何正常运转的样例是一个好主意你可以很容易地收集和保存每月的性能数据比如
*stat类vmstat mpstat iostat vxstatsar
ps的输出以显示哪些进程在运行 (在Solaris 操作环境下是prstat)另外有不少商业的和无支持的产品都可以用来做性能监测一个免费的无支持的可选产品是SE Toolkit(要获得其各种版本的信息请看Sun Performance SE Toolkit page)SE Toolkit报告磁盘活动CPU利用情况TCP和网络连接内存以及其他更多信息在我们的经验里它安装方便不需要重启系统并且生成容易理解的图形显示
很多这类产品都存在一个共同的问题就是对不同的硬件配置有不同的门限值例如特定的门限值对于MHz的系统可能显得太过会让这个系统慢得象是在爬一样但是对于一个MHz的系统却可能是可以接受的
寻找性能瓶颈
一旦你已经定义了需要解决的性能问题下一步骤就是缩小范围到瓶颈产生的地方
这个阶段有必要问这样一些问题
应用程序能告诉我它看到哪些是瓶颈?拿Oracle作例子一个Oracle数据库管理员应该知道BSTAT/ESTATS是什么以及如何运行和理解它们还是那句话从应用程序的角度来看问题BSTATS/ESTATS可以显示限制了Oralce性能的瓶颈这可以作为进一步分析的指导
大部分的时间花在哪里是内核还是用户进程?通过vmstatmpstatsarpsprstat可以回答这个问题
具有相近类型的所有资源是否同样繁忙?这个问题的意义在于寻找资源的不平等分布比如一个磁盘可能是瓶颈所在或者一个CPU会比其他CPU更忙对CPU看mpstat对磁盘用iostat哪个或哪些进程在使用最多的资源?用这些命令可以看到使用CPU和内存最多的进程
ps eo pidpcpuargs | sort +n
CPU百分比
ps eo pidvszargs | sort +n
K字节的虚拟内存
/usr/ucb/ps aux |more
输出被排序使用CPU和内存最多的进程排在上面
Solaris 操作环境提供了prstat它给出CPU和内存使用情况的一个动态注解prstat cvm的输出结果非常有用
我们现在来看看怎用使常见的Solaris命令来开始性能分析
vmstat命令是简单的这里我们可以看到一个对于正在执行的应用程序CPU能力不足的例子
% vmstat
procs memory page disk faults cpu
r b w swap free re mf pi po fr de sr m m m m in sy cs us sy id
vmstat输出的第一行总是可以忽略在procs下面标着r的一列是等待获得CPU的进程运行队列中的进程数id列是CPU空闲时间这台机器没有足够的CPU资源以满足进程运行的需要这可以从它的大部分CPU时间花在用户空间里看出来(看us列)
这里有两种办法可供采用——第一增加更多的CPU或者第二对应用程序的代码作性能分析看看是不是应用程序的某部分可以优化对代码片断作优化可能会需要非常大量的努力——而且有时候收到的效果很少在关系到时间的时候最好在考虑你可能的投资回报时现实一点