/proc/stat解析

linux 中/proc/stat 解析

1. CPU时间

时间单位为:jiffies

cpu指标 含义
user 用户态时间,一般/高优先级,仅统计 nice <= 0
nice 用户态时间(低优先级,nice>0)
system 内核态时间
idle 空闲时间,不包含 IO 等待时间
iowait I/O等待时间,磁盘 IO 等待时间
irq 硬中断
softirq 软中断
steal 被盗时间,虚拟化环境中运行其他操作系统上花费的时间(since Linux 2.6.11)
guest 来宾时间,操作系统运行虚拟 cpu 花费的时间(since Linux 2.6.24)
guest_nice nice 来宾时间,运行一个带 nice 值的 guest 花费的时间(since linux 2.6.33)

常见的 1 jiffies = 0.01s = 10ms

Man 手册中 iowait 有单独说明, iowait 时间是不可靠值,理由如下:

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

2. /proc/stat

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cpu  569277041 161 1239423941 13792698342 4421519 63 261061 0 0 0 
cpu0 36548809 19 75599707 1833303595 2847733 50 70315 0 0 0
cpu1 93287418 21 205361841 1652355397 810540 13 52821 0 0 0
cpu2 82897815 21 181812772 1686282177 381546 0 19937 0 0 0
cpu3 73354848 16 160007992 1717410685 109400 0 31101 0 0 0
cpu4 71613450 19 155951863 1723168504 76874 0 17392 0 0 0
cpu5 71898442 19 156722918 1722118907 69832 0 20591 0 0 0
cpu6 70493620 20 153452493 1726916191 64370 0 16469 0 0 0
cpu7 69182636 24 150514352 1731142883 61222 0 32431 0 0 0
intr 28774147259 50 202 0 0 281 0 0 0 0 0 0 0 0 0 19258320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 64534847 0 172069257 0 34231269 1 35995704 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 581800915603
btime 1596006075
processes 100117838
procs_running 2
procs_blocked 0
softirq 32802697252 0 800172422 999 282776267 9629235 0 173 1147810484 0 14358750 483177850
  1. intr:系统启动以来的所有 interrupts 的次数情况
  2. ctxt:系统上下文切换次数
  3. btime:启动时长( 单位:秒 ),也就是系统启动的时间
  4. process:系统启动后创建过的进程数量。当短时间该值特别大,系统可能出现异常
  5. procs_running:处于 Runnable 状态的进程个数
  6. procs_blocked:处于等待 I/O 完成的进程个数
1
2
cat /proc/uptime
19720650.14 139613840.55
  1. 第一个值代表从开机到现在的累积时间(单位为秒), 开机后运行82044秒
  2. 第二个值代表从开机到现在的CPU空闲时间,单位为秒

3. /proc/[pid]/stat

/proc/[pid]/stat 用于获取某一个进程的统计信息

1
8229 (monitor_agent) R 1 8228 8228 0 -1 4202560 1455535378942 0 0 0 411556780 939600865 0 0 20 0 1 0 620250541 32653312 655 18446744073709551615 134512640 134741549 4294169792 4294169300 4151465013 0 0 288428039 18944 0 0 0 17 2 0 0 3521 0 0 134742016 134743284 168185856 4294174356 4294174399 4294174399 4294176744 0
  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