Linux之监控CPU

性能调优得先从系统开始侦查,先看看怎么查询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可以打印额外的锁信息)。

收工。

你可能感兴趣的:(linux,cpu,top,pidstat)