概述
=========
性能是指程序的处理效率无法达到预期值.
导致性能问题的原因总的分为两种, 外部原因和内部原因. 内部原因是指程序代码本身有问题, 无法高效地利用资源来完成计算. 外部原因是指程序代码以外的因素, 比如硬件配置和程序的负载.
解决性能问题的关键在于把瓶颈找出来, 然后消灭瓶颈.
预备
==========
为了防止进入永无止境的性能优化圈(客户提出瓶颈, 你分析瓶颈, 解决瓶颈, 客户再次提出瓶颈, 你再次进行调优, 如此反复)之中, 可以询问客户下面的问题:
- 为什么接近某个时间(比如说1分钟)才能打开就是不正常的? 根据你的设计, 所有请求应该在多少时间内返回才算合理? 平均返回时间是多少才合理?
- 没有文献说明所有情况下, 某事件(比如说Request_Begin)与某事件(比如说Page_Load)之间应该在某时间限制(比如说20秒)内完成. 例如, 在GC发生的时候所有执行都会被挂起, 所以某些函数之间停滞20秒是完全正常的事情, 我并不认为这个问题跟接近1分钟才能打开页面有直接联系. 如果怀疑是整体的性能问题, 我建议先不考虑Request_Begin和Page_Load之间的细节.
- 问题发生时候的外部环境是什么? 程序的负载是不是在理想的范围内? 有没有第三方的程序干扰?
- 有没有具体数据来说明到底有多少请求超过了1分钟? 这些请求具体的返回时间是多少?
- 你的期望值是多少? 这个期望值是如何计算出来的?
- 你设计的是一个实时系统么? 如果是, 可能Windows和ASP.NET并不是一个好的平台. 如果不是, 某些个别请求无法再期望时间内返回是无法避免的. 你能接受这样的事实么?
行动
=========
总的来说, 性能调优的步骤是:
- 获取当前的性能指标, 比如平均反应时间.
- 获取测试时外部因素的量化资料, 比如每秒钟请求数.
- 根据程序的设计, 判断上面的外部环境是否符合预期. 如果不符合预期, 那么在改善外部环境后重新测试.
- 如果外部环境符合预期, 理想的性能指标是多少? 结果是否在理想范围之内?
- 如果不在理想范围之内, 那么问题是由于内部因素导致的. 接下来应该努力找到瓶颈来解决问题.
- 观察性能相关的指标是否满足预期值, 比如CPU利用率和程序响应时间.
- 分析性能日志以获得宏观认识.
- 制定步骤, 在问题发生的关键点抓取dump文件. 比如当CPU利用率达到100%的时候, 或者系统没有响应的时候.
- 分析dump来获取问题的线索.
- 有条件的时候, 可以结合profiler工具完成细节统计和比较, 简化分析过程.
摘自<Windows用户态程序高效排错>