操作系统性能监控
改善性能的3个活动:性能监控 -> 性能分析 -> 性能调优
用户态CPU使用率,执行应用程序代码的时间占CPU时间的百分比。
系统态CPU使用率,应用执行操作系统调用的时间占总CPU时间的百分比。
系统态CPU使用率高意味着共享资源有竞争者或IO设备之间有大量的交互。
提高应用性能和扩展性的一个目标是尽可能降低系统态CPU使用率。
typeperf :收集操作系统性能统计数据的命令行工具
CPU调度程序运行队列,已经准备好运行、正等待可用CPU的轻量级进程。
当运行队列长度达到虚拟处理的4倍或更多时,系统的响应就会非常迟缓了。解决方法:增加CPU、分析系统中运行的应
用改进CPU使用率。
监控CPU使用率(以下3个性能计数器分别表示:用户态CPU使用率、系统态CPU使用率、总CPU使用率)
typeperf "\Processor(_Total)% User Time" "\Processor(_Total)%Privileged Time" "\Processor(_Total)%
Processor Time"
监控内存利用率(可用内存、每秒的页面调度)(-si 指定报告间隔)
typeperf -si 5 "\Memory\Available Mbytes" "\Memory\Pages/sec"
当应用运行所需的内存超过可用物理内存时,就会发生页面交换。如果发现垃圾收集时间变长,系统有可能正在进行页面交换。
- 如果系统使用的内存量保持稳定,也没有启动新应用,却依然有页面调度,说明系统可能在进行页面交换。
- 如果系统报告可用内存很少,也没有页面调度,说明系统没有页面交换,只不过系统大部分物理RAM都被占用了。
- 如果系统在进行页面调度,但内存充足没有页面交换,说明有应用在启动。
让步式上下文切换,执行线程主动释放CPU。
抢占式上下文切换,线程因为分配的时间片用尽而被迫放弃CPU或者被其他优先级更高的线程所抢占。
抢占式上下文切换率高表明预备运行的线程数多于可用的虚拟处理器。
给应用分配处理器:
进程:右键,“设置相关性”,
多核系统上运行的Java应用可能会发生大量的线程迁移,减少迁移的策略是创建处理器组并将Java应用分配给这些处理
器组。
网络IO使用率
单次读写数据量小而网络读写量打的应用会消耗大量的系统态CPU,产生大量的系统调用。
策略是:减少网络读写的系统调用,使用非阻塞的Java NIO而不是阻塞的java.net.Socket,减少处理请求和发送响应的
线程数,也可以改善应用性能。
建议使用Java NIO框架,参考Grizzly项目:https://grizzly.java.net/
磁盘IO使用率
改进磁盘IO使用率的策略:
- 更快的存储设备;
- 文件系统扩展到多个磁盘;
- 操作系统调优使得可以缓存大量的文件系统数据结构;
- 从应用角度看,减少或消除与磁盘的交互。
开启磁盘缓存可以改善严重依赖磁盘IO的应用的性能。但是一旦开启磁盘缓存,意外的电源故障可能会造成数据损坏。