通常,有如下方式可以得到 cpu 利用率情况:
e.g. top -m 20 -d 1 -t
- <span style="font-size:14px;">User 0%, System 6%, IOW 0%, IRQ 0%
- User 1 + Nice 0 + Sys 34 + Idle 494 + IOW 0 + IRQ 0 + SIRQ 1 = 530
- PID TID PR CPU% S VSS RSS PCY UID Thread Proc
- 3385 3385 0 6% R 1460K 484K root top top
- 631 631 2 0% S 0K 0K root ksmd
- 8 8 0 0% S 0K 0K root rcu_preempt
- 5 5 0 0% S 0K 0K root kworker/0:0H
- 6 6 1 0% S 0K 0K root kworker/u8:0
- 7 7 0 0% S 0K 0K root migration/0
- 9 9 0 0% S 0K 0K root rcu_bh
- 10 10 1 0% S 0K 0K root rcu_sched
- 11 11 1 0% S 0K 0K root migration/1
- 12 12 1 0% S 0K 0K root ksoftirqd/1
- 14 14 1 0% S 0K 0K root kworker/1:0H
- 15 15 2 0% S 0K 0K root migration/2
- 16 16 2 0% S 0K 0K root ksoftirqd/2
- 18 18 2 0% S 0K 0K root kworker/2:0H
- 19 19 3 0% S 0K 0K root migration/3
- 20 20 3 0% S 0K 0K root ksoftirqd/3
- 22 22 3 0% S 0K 0K root kworker/3:0H
- 23 23 1 0% S 0K 0K root khelper
- 33 33 1 0% S 0K 0K root kworker/1:1
- 111 111 1 0% S 0K 0K root bcm_hsotgctrl_e</span>
top 命令是通过 用户空间 (userspace) 的方式, 统计得到结果。
- <span style="font-size:14px;">cpu 11469 450 27068 1882759 487 4 464 0 0 0
- cpu0 3098 117 8727 464531 67 3 408 0 0 0
- cpu1 2933 130 7136 471014 157 1 30 0 0 0
- cpu2 2983 90 5170 474272 131 0 8 0 0 0
- cpu3 2455 113 6035 472942 132 0 18 0 0 0
- intr 650070 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 72794 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2961 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 7075 0 17
- 978 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2162 7980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313 0 0 4 1 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9206 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 20872 0 34798 161365 0 0 0 0 0 0 0 0 13461
- 3 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36496 29298 21433 30846 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 2134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 190 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 197 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- ctxt 1288221
- btime 1356998414
- processes 3399
- procs_running 2
- procs_blocked 0
- softirq 249133 0 103834 1 0 0 0 34224 53095 1547 56432</span>
其中,可以通过 cat /proc/cpuinfo 来验证 cpu core 的数量。大多数情况, /proc/stat 得到的结果能够比较真实的反映系统真实状态。
然而,因为因为 kernel 何时/如何去收集系统状态信息不确定的特性, 有时得到的结果完全不可靠。
- cpu 11469 450 27068 1882759 487 4 464 0 0 0
- cpu0 3098 117 8727 464531 67 3 408 0 0 0
- cpu1 2933 130 7136 471014 157 1 30 0 0 0
- cpu2 2983 90 5170 474272 131 0 8 0 0 0
- cpu3 2455 113 6035 472942 132 0 18 0 0 0
其中, 第一行表示所有 cpu 的统计信息。第二行至第五行分别表示 cpu core 0 ~ 4 的统计信息。总的cpu统计信息值,等于每个 cpu core 对应值的累加。
每一列的数值单位为 jiffies。 jiffies 是内核的全局变量,用来表示系统启动以来的节拍数。
- user(11469) 表示从系统启动到当前时刻,处于用户态的运行时间。不包含nice值为负的进程。
- nice(450) 表示从系统启动到当前时刻,nice为负值的进程占用的cpu时间
- system(27068) 表示从系统启动到当前时刻,处于内核态的运行时间
- idle(1882759) 表示从系统启动到当前时刻,除了 iowait外的等待时间
- iowait(487) 表示从系统启动到当前时刻,io 等待时间
- irq(4) 表示从系统启动到当前时刻,硬中断花费的时间
- softirq(464) 表示从系统启动到当前时刻,软中断花费的时间
- steal(0) 表示从系统启动到当前时刻,运行其他虚拟环境中的操作系统花费的时间
- guest(0) 表示从系统启动到当前时刻,运行在通过Linux内核控制的客户操作系统上的虚拟cpu 的时间
- guest_nice(0) 表示从系统启动到当前时刻,运行在通过Linux内核控制的客户操作系统上的虚拟cpu 的时间, nice 为负值进程
- intr 650070 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 72794 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2961 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 7075 0 17
- 978 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2162 7980 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 313 0 0 4 1 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9206 0 0 0 0 0 100 0 0 0 0 0 0 0 0 0 0 0 0 20872 0 34798 161365 0 0 0 0 0 0 0 0 13461
- 3 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 36496 29298 21433 30846 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 2134 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 190 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 197 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
- sum(650070) 表示系统中所有中断次数之和
- 其后每一个数值,表示从 irq[0] ~ irq[ nr_irqs -1 ] 对应的中断产生次数
- ctxt 1288221
- btime 1356998414
- processes 3399
- procs_running 2
- procs_blocked 0
- ctxt context switch 的次数
- btime 从源代码应该表示从系统启动到当前时刻,系统时间 单位:ns。但是实际似乎不变??
- processes 系统产生的线程数
- procs_running 当前运行的线程数量
- procs_blocked 当前被 iowait 阻塞的线程数量
- <span style="font-size:14px;">softirq 249133 0 103834 1 0 0 0 34224 53095 1547 56432</span>
- sum_softirq(249133) 所有 软中断时间之和
- HI_SOFTIRQ(0)
- TIMER_SOFTIRQ(103834)
- NET_TX_SOFTIRQ (1)
- NET_RX_SOFTIRQ (0)
- BLOCK_SOFTIRQ (0)
- BLOCK_IOPOLL_SOFTIRQ (0)
- TASKLET_SOFTIRQ (34224)
- SCHED_SOFTIRQ ( 53095)
- HRTIMER_SOFTIRQ (1547)
- RCU_SOFTIRQ (56432)
显然, sum_softirq 等于所有其他单项 softirq 时间之和。 |