栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux获取某个进程的CPU占用率并比对TOP命令验证结果

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux获取某个进程的CPU占用率并比对TOP命令验证结果

通过/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) 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/323691.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号