第1章 策略、方法、方法论
略…
第2章 操作系统性能监控
2.1 定义
性能监控、性能分析及性能调优
- 性能监控,
非侵入
方式收集或查看应用程序性能数据的活动
。 - 性能分析,以
侵入
方式收集运行性能数据的活动
。 - 性能调优,一种为改善应用
响应性能
或吞吐量
而更改参数(Tune-able)、源代码或属性配置的活动
。
2.2 CPU使用率
带着下面这个目标/问题去读
如何让多处理器、多核系统上运行的多线程应用
有效
地利用CPU周期
发散的联想下:
1)消耗很多的CPU就意味着程序的性能或扩展性提高了?或者达到了最高?
大多数操作系统的CPU使用率分为用户态CPU使用率
和系统态CPU使用率
,理想情况下,应用达到最高性能和扩展性时,此时系统态CPU使用率
应该是0%,所以尽可能降低系统态CPU使用率
是提高应用性能的目标之一。
2.2.1 命令行监控CPU使用率
2.3 CPU调度程序运行队列
系统运行队列长度等于虚拟处理器个数时,用户不会明显感觉到性能下降。(此处虚拟处理器
的个数指系统硬件线程的个数,也是Java API Runtime.availableProcessors()返回值)
当运行队列长度达到虚拟处理器个数的4倍或更多时,系统的响应应该就非常迟缓了。
一般性指导原则:
如果在很长一段时间里,运行队列的长度达到处理器个数的
3~4倍或更高
,则需要立即引起注意或采取行动。
如何采取行动,作者给出了两个方面的思路:
1)增加CPU以分担负载或减少处理器的负载量,这种方式从根本上减少了每个虚拟处理器上的活动线程数,从而减少了运行队列中的轻量级进程数。
2)分析系统中运行的应用,Java程序员可以用更高效的算法和数据结构得到更好的性能。
2.3.1 监控CPU调度程序运行队列:Windows
\System\Processor Queue Length(在Performance Monitor的Add Counters中添加计数器System > Processor Queue Length)监控运行队列长度。
2.3.2 监控CPU调度程序运行队列:Linux
2.4 内存使用率
系统内存相关属性,例如:页调度、页交换、加锁、线程迁移中的让步式和抢占式上下文切换。
PS:以上,作者只是提到了这些名词,看下后续章节有没有展开描述。
系统在进行页交换或使用虚拟内存时,会对应用的响应性和吞吐量造成较大影响。
JVM垃圾收集器在系统进行页交换时的性能也很差,由于要回收不可达对象所占空间,JVM需要访问大量的内存,而如果Java堆的一部分被置换出去,此时就必须先置换进内存以便垃圾收集器扫描存活对象,这会增加GC持续的时间(STW)。
2.4.1 监控内存利用率:Windows