linux程序怎么监控cpu,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 在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 将栈打印出,查找tid对应的信息即可

对于sy过高,主要是线程切换比较频繁,在java中可能由于线程比较多,且频繁因为IO,锁等不断处于阻塞或执行状态导致,也可通过上述方法来定位。(jstack -l可以打印额外的锁信息)。

收工。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值