美文网首页
Linux平台Cpu使用率的计算

Linux平台Cpu使用率的计算

作者: 夕颜00 | 来源:发表于2020-08-21 13:34 被阅读0次

    另外可以参考几篇文章:
    Linux平台Cpu使用率的计算
    一个用了统计CPU 内存 硬盘 使用率的shell脚本
    linux下统计某个进程的CPU占用和内存使用
    linux系统/proc/stat信息与top的cup信息的联系及区别
    shell脚本案例(三)利用top命令精确监控cpu使用率

    一. 概述

    1.1 CPU时间

    cpu指标 含义
    user 用户态时间
    nice 用户态时间(低优先级,nice>0)
    system 内核态时间
    idle 空闲时间
    iowait I/O等待时间
    irq 硬中断
    softirq 软中断

    iowait时间是不可靠值,理由如下:

    • CPU不会等待I/O执行完成,而iowait是等待I/O完成的时间。 当CPU进入idle状态,很可能会调度另一个task执行,所以iowait计算时间偏小;
    • 多核CPU,iowait的计算并非某一个核,因此计算每一个cpu的iowait非常困难;

    相关资料:http://man7.org/linux/man-pages/man5/proc.5.html

    二. proc/stat

    proc/stat节点记录的是系统进程整体的统计信息

    2.1 stat数据

    Gityuan$ adb shell cat /proc/stat
    //CPU指标:user,nice, system, idle, iowait, irq, softirq
    cpu  130216 19944 162525 1491240 3784 24749 17773 0 0 0
    cpu0 40321 11452 49784 403099 2615 6076 6748 0 0 0
    cpu1 26585 2425 36639 151166 404 2533 3541 0 0 0
    cpu2 22555 2957 31482 152460 330 2236 2473 0 0 0
    cpu3 15232 1243 20945 153740 303 1985 3432 0 0 0
    cpu4 5903 595 6017 157410 30 10959 605 0 0 0
    cpu5 4716 380 3794 157909 23 118 181 0 0 0
    cpu6 8001 515 8995 157571 48 571 180 0 0 0
    cpu7 6903 377 4869 157885 31 271 613 0 0 0
    
    intr ...
    ctxt 22523049
    btime 1500827856
    processes 23231
    procs_running 1
    procs_blocked 0
    softirq 3552900 843593 733695 19691 93143 468832 12783 257382 610426 0 513355
    
    

    时间单位,sysconf(_SC_CLK_TCK)一般地定义为jiffies(一般地等于10ms)

    2.2 说明

    1. intr:系统启动以来的所有interrupts的次数情况
    2. ctxt: 系统上下文切换次数
    3. btime:启动时长(单位:秒),从Epoch(即1970零时)开始到系统启动所经过的时长,每次启动会改变。
      • 此处指为1500827856,转换北京时间为2017/7/24 0:37:36
    4. processes:系统启动后所创建过的进程数量。当短时间该值特别大,系统可能出现异常
    5. procs_running:处于Runnable状态的进程个数
    6. procs_blocked:处于等待I/O完成的进程个数

    另外:

    cat /proc/uptime
    82044.14 215440.94
    
    
    • 第一个值代表从开机到现在的累积时间(单位为秒), 开机后运行82044秒
    • 第二个值代表从开机到现在的CPU空闲时间,单位为秒

    技巧:结合btime获取当前的绝对时间,1500827856 + 82044 = 1500909900, 转换成北京时间2017/7/24 23:25:00,也就是当前执行命令cat /proc/uptime的时间点。

    三. proc/[pid]>/stat

    proc/<pid style="box-sizing: border-box;">/stat用于获取某一个进程的统计信息,实现过程见fs/proc/array.c的do_task_stat()</pid>

    3.1 stat数据

    Gityuan$ adb shell cat /proc/8385/stat
    1557 (system_server) S 823 823 0 0 -1 1077952832 //1~9
    2085481 15248 2003 27 166114 129684 26 30  //10~17
    10 -10 221 0 2284 2790821888 93087 18446744073709551615 //18~25
    1 1 0 0 0 0 6660 0 36088 0 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 0
    
    

    3.2 解释

    1. pid: 进程ID.
    2. comm: task_struct结构体的进程名
    3. state: 进程状态, 此处为S
    4. ppid: 父进程ID (父进程是指通过fork方式,通过clone并非父进程)
    5. pgrp:进程组ID
    6. session:进程会话组ID
    7. tty_nr:当前进程的tty终点设备号
    8. tpgid:控制进程终端的前台进程号
    9. flags:进程标识位,定义在include/linux/sched.h中的PF_*, 此处等于1077952832
    10. minflt: 次要缺页中断的次数,即无需从磁盘加载内存页. 比如COW和匿名页
    11. cminflt:当前进程等待子进程的minflt
    12. majflt:主要缺页中断的次数,需要从磁盘加载内存页. 比如map文件
    13. majflt:当前进程等待子进程的majflt
    14. utime: 该进程处于用户态的时间,单位jiffies,此处等于166114
    15. stime: 该进程处于内核态的时间,单位jiffies,此处等于129684
    16. cutime:当前进程等待子进程的utime
    17. cstime: 当前进程等待子进程的utime
    18. priority: 进程优先级, 此次等于10.
    19. nice: nice值,取值范围[19, -20],此处等于-10
    20. num_threads: 线程个数, 此处等于221
    21. itrealvalue: 该字段已废弃,恒等于0
    22. starttime:自系统启动后的进程创建时间,单位jiffies,此处等于2284
    23. vsize:进程的虚拟内存大小,单位为bytes
    24. rss: 进程独占内存+共享库,单位pages,此处等于93087
    25. rsslim: rss大小上限

    说明:

    • 第10~17行主要是随着时间而改变的量;
    • 内核时间单位,sysconf(_SC_CLK_TCK)一般地定义为jiffies(一般地等于10ms)
    • starttime: 此值单位为jiffies, 结合/proc/stat的btime,可知道每一个线程启动的时间点
      • 1500827856 + 2284/100 = 1500827856, 转换成北京时间为2017/7/24 0:37:58

    第四行数据很少使用,只说一下该行第7至9个数的含义:

    • signal:即将要处理的信号,十进制,此处等于6660
    • blocked:阻塞的信号,十进制
    • sigignore:被忽略的信号,十进制,此处等于36088

    作者:锐心凌志
    链接:https://www.jianshu.com/p/9fae17dc5f93
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    相关文章

      网友评论

          本文标题:Linux平台Cpu使用率的计算

          本文链接:https://www.haomeiwen.com/subject/uqyujktx.html