通过/proc/stat文件查看所有的CPU活动信息
可以看到总CPU 使用和每个CPU的使用情况,其中典型含义解释如下:
CPU 223447 240 4504182 410802165 59753 412 586209 0 0
- user(223447) 从系统启动开始累积到当前时刻,处于用户态的运行时间,不包含 nice 值为负的进程。
- nice(240) 从系统启动开始累积到当前时刻,nice 值为负的进程所占用的 CPU 时间。
- system(4504182) 从系统启动开始累积到当前时刻,处于核心态的运行时间。
- idle(410802165) 从系统启动开始累积到当前时刻,除 IO 等待时间以外的其他等待时间。
- iowait(59753) 从系统启动开始累积到当前时刻,IO 等待时间。(since 2.5.41)
- irq(412) 从系统启动开始累积到当前时刻,硬中断时间。(since 2.6.0-test4)
- softirq(586209) 从系统启动开始累积到当前时刻,软中断时间。(since 2.6.0-test4)
- stealstolen(0) Which is the time spent in other operating systems when running in a virtualized environment.(since 2.6.11)
- guest(0) Which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.(since 2.6.24)
以上信息我们可以得到总的CPU活动时间为:
totalCPUTime = user + nice + system + idle + iowait + irq + softirq
通过/proc/[PID]/stat 文件查看某一进程的CPU活动信息
cat /proc/1/stat 1 (init) S 0 1 1 0 -1 4202752 3026 2635222 9 483 5 165 102346 3188016 20 0 1 0 1 19820544 384 18446744073709551615 1 1 0 0 0 0 0 4096 536962595 18446744073709551615 0 0 0 4 0 0 34 0 0
文件信息解释
- pid=6873 进程(包括轻量级进程,即线程)号
- comm=a.out 应用程序或命令的名字。
- task_state=R 任务的状态,R:runnign, S:sleeping (TASK_INTERRUPTIBLE), D:disk sleep (TASK_UNINTERRUPTIBLE), T: stopped, T:tracing stop, Z:zombie, X:dead。
- ppid=6723 父进程ID。
- pgid=6873 线程组号。
- sid=6723 该任务所在的会话组 ID。
- tty_nr=34819(pts/3) 该任务的 tty 终端的设备号,INT(34817/256)= 主设备号,(34817-主设备号)= 次设备号。
- tty_pgrp=6873 终端的进程组号,当前运行在该任务所在终端的前台任务(包括 shell 应用程序)的 PID。
- task->flags=8388608 进程标志位,查看该任务的特性。
- min_flt=77 该任务不需要从硬盘拷数据而发生的缺页(次缺页)的次数。
- cmin_flt=0 累计的该任务的所有的 waited-for 进程曾经发生的次缺页的次数目。
- maj_flt=0 该任务需要从硬盘拷数据而发生的缺页(主缺页)的次数。
- cmaj_flt=0 累计的该任务的所有的 waited-for 进程曾经发生的主缺页的次数目。
- utime=1587 该任务在用户态运行的时间,单位为 jiffies。
- stime=1 该任务在核心态运行的时间,单位为 jiffies。
- cutime=0 累计的该任务的所有的 waited-for 进程曾经在用户态运行的时间,单位为 jiffies。
- cstime=0 累计的该任务的所有的 waited-for 进程曾经在核心态运行的时间,单位为 jiffies。
- priority=25 任务的动态优先级。
- nice=0 任务的静态优先级。
- num_threads=3 该任务所在的线程组里线程的个数。
- it_real_value=0 由于计时间隔导致的下一个 SIGALRM 发送进程的时延,以 jiffy 为单位。
- start_time=5882654 该任务启动的时间,单位为 jiffies。
- vsize=1409024(page) 该任务的虚拟地址空间大小。
- rss=56(page) 该任务当前驻留物理地址空间的大小;Number of pages the process has in real memory,minu 3 for administrative purpose. 这些页可能用于代码,数据和栈。
- rlim=4294967295(bytes) 该任务能驻留物理地址空间的最大值。
- start_code=134512640 该任务在虚拟地址空间的代码段的起始地址。
- end_code=134513720 该任务在虚拟地址空间的代码段的结束地址。
- start_stack=3215579040 该任务在虚拟地址空间的栈的结束地址。
- kstkesp=0 esp(32 位堆栈指针) 的当前值, 与在进程的内核堆栈页得到的一致。
- kstkeip=2097798 指向将要执行的指令的指针, EIP(32 位指令指针)的当前值。
- pendingsig=0 待处理信号的位图,记录发送给进程的普通信号。
- block_sig=0 阻塞信号的位图。
- sigign=0 忽略的信号的位图。
- sigcatch=082985 被俘获的信号的位图。
- wchan=0 如果该进程是睡眠状态,该值给出调度的调用点。
- nswap 被 swapped 的页数,当前没用。
- cnswap 所有子进程被 swapped 的页数的和,当前没用。
- exit_signal=17 该进程结束时,向父进程所发送的信号。
- task_cpu(task)=0 运行在哪个 CPU 上。
- task_rt_priority=0 实时进程的相对优先级别。
- task_policy=0 进程的调度策略,0=非实时进程,1=FIFO实时进程;2=RR实时进程
processCPUTime = utime + stime
CPU占用率计算方法:
在T1时间计算此时的totalCPUTime 记为totalCPUTimeT1 processCPUTime记为processCPUTimeT1
间隔一段时间例如0.5s
在T2时间计算此时的totalCPUTime 记为totalCPUTimeT2 processCPUTime记为processCPUTimeT2
processCPUUse = (processCPUTimeT2 - processCPUTimeT1) / (totalCPUTimeT2 - totalCPUTimeT1)
其中有些多核版本 top统计到的CPU利用率会超过100%(因为是相对某个独立CPU),此时需要计算totalCPUTime为在cpux上的个参数计算 (在/proc/stat 第n+1列 其中n为该进程所运行CPU) 有些版本top统计到的CPU 不会超过100%(总CPU占用)此时需要计算totalCPUTime为在cpu上的个参数计算 (在/proc/stat 第1列 其中n为该进程所运行CPU)



