性能调优得先从系统开始侦查,先看看怎么查询CPU相关信息吧:
- 关于top
//执行top命令:
top
top - 11:39:32 up 68 days, 23:29, 2 users, load average: 0.00, 0.01, 0.05
Tasks(): 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie(僵尸进程数)
Cpu(s): 0.2%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4044428k total, 3764292k used, 280136k free, 174952k buffers
Swap: 4190204k total, 412k used, 4189792k free, 3114472k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 24460 2260 1344 S 0 0.1 0:01.97 init
2 root 20 0 0 0 0 S 0 0.0 0:00.10 kthreadd
3 root 20 0 0 0 0 S 0 0.0 2:08.17 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:00.41 migration/0
...
//Cpu参数:
%us(没有经过优先级调整的用户进程所占cpu时间百分比)
%sy(内核进程所占cpu时间百分比)
%ni(经过优先级调整的用户进程所占cpu时间百分比)
%id(cpu空闲时间所占百分比)
wa(cpu等待IO完成所占时间百分比)
%hi(硬件中断所占cpu时间百分比)
%si(软件中断所占cpu时间百分比)
%st(虚拟CPU等待真实CPU处理的时间百分比)
//进程参数:
PID: 进程id
USER:进程用户
PR: 优先级
NI: nice值,负数表示优先级更高,正数表示优先级更低,0表示进程调度后,优先级不会被调整
VIRT(kb):进程只用的虚拟内存,包括代码,数据,共享库,交换的页数及映射的页数
RES(kb):进程使用的内存
SHR(kb):进程占用的共享内存kb
S:进程状态,主要包括:
'D':不可中断的睡眠
'R':运行中
'S': 睡眠中
'T': 停止了
'Z': 僵尸状态
%CPU: 所占cpu
%MEM:所占内存
TIME+:CPU时间(百分率)
COMMAND:命令行名称或程序名称
// 查看某进程状况
top -p <pid>
在top中,按1可以查看多个cpu(核)状态,按shift+h可以按线程查看cpu状况
- 关于pidstat
// 先安装sysstat
yum install sysstat
// 每隔2秒打印信息,共打印3次:
pidstat 2 3
02:44:27 PM PID %usr %system %guest %CPU CPU Command
02:44:29 PM 6625 0.50 0.00 0.00 0.50 0 java
02:44:29 PM 20919 0.00 0.50 0.00 0.50 1 pidstat
02:44:29 PM PID %usr %system %guest %CPU CPU Command
02:44:31 PM 308 0.00 0.50 0.00 0.50 0 usb-storage
02:44:31 PM 20919 0.00 0.50 0.00 0.50 1 pidstat
02:44:31 PM PID %usr %system %guest %CPU CPU Command
Average: PID %usr %system %guest %CPU CPU Command
Average: 308 0.00 0.17 0.00 0.17 - usb-storage
Average: 6625 0.17 0.00 0.00 0.17 - java
Average: 20919 0.00 0.33 0.00 0.33 - pidstat
// 打印某进程的线程的cpu消耗状况,比top更好的一个功能
pidstat -p 6625 -t 1 1
02:48:43 PM TGID TID %usr %system %guest %CPU CPU Command
02:48:44 PM 6625 - 0.00 0.00 0.00 0.00 0 java
02:48:44 PM - 6625 0.00 0.00 0.00 0.00 0 |__java
02:48:44 PM - 6626 0.00 0.00 0.00 0.00 0 |__java
02:48:44 PM - 6627 0.00 0.00 0.00 0.00 1 |__java
02:48:44 PM - 6628 0.00 0.00 0.00 0.00 0 |__java
02:48:44 PM - 6629 0.00 0.00 0.00 0.00 1 |__java
02:48:44 PM - 6630 0.00 0.00 0.00 0.00 0 |__java
02:48:44 PM - 6631 0.00 0.00 0.00 0.00 0 |__java
02:48:44 PM - 6632 0.00 0.00 0.00 0.00 1 |__java
// 信息说明
%usr 任务在用户态执行所占cpu(不包括在虚拟cpu中)
%system 任务在内核态执行所占cpu
%guest 任务在虚拟cpu中执行所占cpu
- 除top和pidstat外,vmstat也可以查询一些基本信息:
vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
5 0 796 1271444 165744 2141660 0 0 0 2 2 3 0 0 100 0
对于java应用,CPU消耗主要体现在us, sy值上:
对于us过高时,可以粗略通过几步定位到哪个java线程,再定位到代码中:
1. top (shift+h)查看cpu使用较高的线程tid(需转换成16进制)
2. 通过jstack <pid> 将栈打印出,查找tid对应的信息即可
对于sy过高,主要是线程切换比较频繁,在java中可能由于线程比较多,且频繁因为IO,锁等不断处于阻塞或执行状态导致,也可通过上述方法来定位。(jstack -l可以打印额外的锁信息)。
收工。