对系统或程序进行相关性能分析,有助于分析研究运行时出现的问题或查找出问题根源。而没有方法论指导的分析,如盲头苍蝇,费时费力。为确保软件满足或超过设计的期望值,有必要分析应用程序的性能以发现潜在的问题。性能分析一个必不可少的环节是使应用程序的组件可见。当能够了解组件是如何交互时,就可以诊断潜在的性能问题。
主要采用的方法论,包括:USE 方法:找出资源瓶颈;TSA 方法:分析程序用时;Off-CPU分析:分析任何类型的线程延时;http://www.brendangregg.com/activebenchmarking.htmlActive Benchmarking(动态基准)分析,进行精确有效的基准分析。
以下将列举出一个综览清单,开始部分包含一些个人不建议的反对的做法,不妨作为一个反面教材来参考。
1. 推诿他人(反对的)
- 尝试找出一个系统或环境的组件,但是该组件与你无关。
- 假设问题出在该组件上。
- 把问题推至与该组件真正相关的团队。
- 当发现其实也与该团队无关时,重做第一步,继续找别人的茬。
2. 指路明灯(反对的)- 采用以下任一方法来选择简便工具:自己熟悉的;在Internet找来的;随机找来的。
- 运行工具。
- 找出显眼的问题。
3. 酒徒做法(错误做法)
随机变更事物直到问题离去。
4. 随机变更(错误做法)
- 测量一个性能基线。
- 随机找出并变更一个属性。
- 沿着某一个方向进行变更操作。
- 测量系统性能。
- 换个方向继续执行变更。
- 测量系统性能。
- 步骤4或6的结果好于基线吗?如果是,继续执行;否则,执行回退。
- 回到步骤1。
5. 被动的基准(错误做法)
- 选择一个基准工具。
- 采用不同的选项组合运行工具。
- 根据结果做一个幻灯片。
- 按着幻灯片来进行管理。
6. 临时的检查清单法
运行 A,如果出现 B,执行 C。
7. 问题陈述法
- 什么让你觉得出现了性能问题?
- 系统之前运作良好吗?
- 最近执行了什么变更(例如:软件,硬件,负载)?
- 是潜伏期或运行时间方面的性能减退问题吗?
- 该问题会影响其他人或程序吗(还是仅仅是自己)?
- 运行环境是怎么样的?用了什么软件或硬件?版本?配置?
8. 系统法9. 工作负荷特征描述法
- 谁正在引起工作负荷?PID,UID,IP地址等。
- 为什么会产生工作负荷?代码路径
- 工作负荷是什么?IOPS,tput命令,类型
- 这些负荷随着时间是怎样变化的?
10.自上而下分析法
- 从最高级开始
- 检查下一级别的细节
- 找出最关注部分进行分解
- 如果问题得不到解决,重做第2步
11.逐层分析法
从以下方面进行造成延迟的测量:
- 多语言
- 执行文件
- 运行库
- 系统调用
- 核心:文件系统,网络
- 设备驱动
12.延迟分析法
- 测量运行时间(延迟)
- 划分成同步的逻辑部件
- 继续进行划分直到找出延迟的根源
- 量化:估算系统恢复后带来的速度提升
13.工具法
- 列出可用的性能分析工具
- 针对每个工具各自特点列出有用的指标
- 针对每项指标,作出相关解释
- 运行挑选后的工具,针对选出的指标进行分析
14.USE方法
对于每项资源,作出如下检查:
- 利用率(Utilization)
- 饱和度(Saturation)
- 错误(Errors)
15. 栈配置法
- 跟踪线程堆栈信息,针对on-CPU和off-CPU进行分析
- 联合分析
- 把堆栈倒置进行分析
16.off-CPU分析法
- 针对堆栈中每一计划调度线程进行off-CPU时间分析
- 对类同的堆栈进行联合分析
- 对于最长和最短用时进行分析
17.TSA方法
1. 针对每一引起重视的线程,测量操作系统线程状态的时间。例如:
2. 使用合适的工具对最高和最低发生频率事件进行分析。
18.动态基准法
- 以一个足够长的周期来运行测量基准。
- 运行的时候,使用其他工具进行性能分析,查找出限制因素。
英文出自:brendangregg