性能调优可以分为3个阶段:性能监控、性能分析及性能调优。
- 性能监控:以非侵入式收集或查看应用运行性能数据的活动,定位性能问题的第一步就是监控。
- 性能分析:以侵入式收集运行性能数据的活动,会影响应用的吞吐量或响应性。一般在性能监控之后,关注的范围比性能监控更集中。
- 性能调优:为改善应用响应性或吞吐量而更改参数、源代码或属性配置的活动,是解决性能问题的最后一步。
本文从操作系统性能监控和JVM性能监控两方面介绍性能监控。
操作系统性能监控
影响操作系统性能的关键组件包括CPU、内存、磁盘及网络,下面将分别介绍每种组件的监控方式。
CPU使用率
CPU使用率分为用户态CPU使用率和系统态CPU使用率:
- 用户态CPU使用率:执行应用程序代码的时间占总CPU时间的百分比
- 系统态CPU使用率:执行操作系统调用的时间占总CPU时间的百分比
系统态CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互,提供应用性能和扩展性的一个目标是尽可能降低系统态CPU使用率。
vmstat
vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,是对系统整体的监控
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 407656 0 2868804 0 0 43 594 1 0 0 0 100 0 0
procs:进程统计数据
r:正在运行或等待CPU周期的进程数
b:不间断休眠,即等待I/O的进程数
memory:内存统计数据
swpd:使用的虚拟内存大小
free:可用物理内存大小
buff:用作缓冲的内存大小
cache:用作缓存的内存大小(将从磁盘读取的文件缓存到内存中,可用减少磁盘I/O)
swap:虚拟内存使用数据
si:每秒从磁盘交换进内存的大小
so:每秒从内存交换到磁盘的大小
io:磁盘使用数据
bi:每秒从磁盘读取的块数(块的大小应该是1kb)
bo:每秒写入到磁盘的块数
这两个值越大,能看到CPU在I/O等待的时间占比也会越大
system:系统调用使用数据
in:每秒中断数,包括时钟周期中断
cs:每秒上下文切换次数
CPU:
us:执行用户代码的CPU时间占比
sy:执行系统调用的CPU时间占比
id:空间CPU时间的百分比
wa:I/O等待时间的百分比
st:虚拟机使用的CPU时间占比
top
top命令不仅包括CPU使用率也包括进程统计数据和内存使用率
top - 19:34:34 up 9 days, 9:13, 1 user, load average: 1.51, 1.46, 1.28
Tasks: 50 total, 1 running, 49 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.1%us, 0.1%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 8388608k total, 7992464k used, 396144k free, 0k buffers
Swap: 1953124k total, 0k used, 1953124k free, 2881236k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4038 root 20 0 114m 10m 2432 S 1.0 0.1 51:34.08 hids-net
179101 user 20 0 15.9g 4.7g 18m S 1.0 58.4 89:31.61 java
53 user 20 0 1462m 7568 3428 S 0.3 0.1 51:57.70 log_agent
LOAD Average:
最近1、5、15分钟内平均活跃进程数(包括正在运行和等待CPU时间的进程),用这个数值除以CPU数量,就是每个CPU的负载
TASK and CPU States:
Tasks是进程的统计信息,Cpu(s)是CPU周期的使用占比
ni:改变过优先级的进程的CPU时间占比(nice命名用于改变进程优先级,值越低优