//执行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状况
// 先安装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
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可以打印额外的锁信息)。
收工。