关于性能调优

概述

=========

性能是指程序的处理效率无法达到预期值.

 

导致性能问题的原因总的分为两种, 外部原因和内部原因. 内部原因是指程序代码本身有问题, 无法高效地利用资源来完成计算. 外部原因是指程序代码以外的因素, 比如硬件配置和程序的负载.

 

解决性能问题的关键在于把瓶颈找出来, 然后消灭瓶颈.

 

预备

==========

为了防止进入永无止境的性能优化圈(客户提出瓶颈, 你分析瓶颈, 解决瓶颈, 客户再次提出瓶颈, 你再次进行调优, 如此反复)之中, 可以询问客户下面的问题:

  1. 为什么接近某个时间(比如说1分钟)才能打开就是不正常的? 根据你的设计, 所有请求应该在多少时间内返回才算合理? 平均返回时间是多少才合理?
  2. 没有文献说明所有情况下, 某事件(比如说Request_Begin)与某事件(比如说Page_Load)之间应该在某时间限制(比如说20秒)内完成. 例如, 在GC发生的时候所有执行都会被挂起, 所以某些函数之间停滞20秒是完全正常的事情, 我并不认为这个问题跟接近1分钟才能打开页面有直接联系. 如果怀疑是整体的性能问题, 我建议先不考虑Request_Begin和Page_Load之间的细节.
  3. 问题发生时候的外部环境是什么? 程序的负载是不是在理想的范围内? 有没有第三方的程序干扰?
  4. 有没有具体数据来说明到底有多少请求超过了1分钟? 这些请求具体的返回时间是多少?
  5. 你的期望值是多少? 这个期望值是如何计算出来的?
  6. 你设计的是一个实时系统么? 如果是, 可能Windows和ASP.NET并不是一个好的平台. 如果不是, 某些个别请求无法再期望时间内返回是无法避免的. 你能接受这样的事实么?

行动

=========

总的来说, 性能调优的步骤是:

  1. 获取当前的性能指标, 比如平均反应时间.
  2. 获取测试时外部因素的量化资料, 比如每秒钟请求数.
  3. 根据程序的设计, 判断上面的外部环境是否符合预期. 如果不符合预期, 那么在改善外部环境后重新测试.
  4. 如果外部环境符合预期, 理想的性能指标是多少? 结果是否在理想范围之内?
  5. 如果不在理想范围之内, 那么问题是由于内部因素导致的. 接下来应该努力找到瓶颈来解决问题.
  6. 观察性能相关的指标是否满足预期值, 比如CPU利用率和程序响应时间.
  7. 分析性能日志以获得宏观认识.
  8. 制定步骤, 在问题发生的关键点抓取dump文件. 比如当CPU利用率达到100%的时候, 或者系统没有响应的时候.
  9. 分析dump来获取问题的线索.
  10. 有条件的时候, 可以结合profiler工具完成细节统计和比较, 简化分析过程.

摘自<Windows用户态程序高效排错>

posted on 2009-12-07 09:37  中道学友  阅读(318)  评论(0编辑  收藏  举报

导航

技术追求准确,态度积极向上