linux中/proc/stat和/proc/[pid]/stat的解析说明

 /proc/[pid]/stat记录的是系统中某个进程的状态信息,可以看到所有的信息使用空格分割开了,我们可以进行解析

7401 (kworker/u8:1) S 2 0 0 0 -1 69238880 0 0 0 0 57 0 0 0 20 0 1 0 9983671 0 0 18446744073709551615 0 0 0 0 0 0 0 2147483647 0 1 0 0 17 3 0 0 0 0 0 0 0 0 0 0 0 0 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大小上限

 /proc/stat记录的是系统中进程整体的状态信息,可以看到有不同的cpu的使用情况

user,nice, system, idle, iowait, irq, softirq
cpu  43387 3807 75716 39969147 880 0 21590 0 0 0
cpu0 9551 885 19106 9980426 201 0 5272 0 0 0
cpu1 12279 936 21144 9979398 196 0 14584 0 0 0
cpu2 11927 954 18453 10001998 255 0 1203 0 0 0
cpu3 9630 1032 17013 10007325 228 0 531 0 0 0
intr 6946342 24 0 0 0 6 0 0 0 1 0 12269 16106 0 0 0 0 3 4109 590118 1 0 33269 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 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 13077391
btime 1614745625
processes 7587
procs_running 1
procs_blocked 0
softirq 4595515 986036 637757 533 1816 0 0 1745306 581286 0 642781
cpu指标含义
user用户态时间
nice用户态时间(低优先级,nice>0)
system内核态时间
idle空闲时间
iowaitI/O等待时间
irq硬中断
softirq软中断

 

 

### /proc/stat 文件格式解析 #### 总体概述 `/proc/stat` 是 Linux 系统中的一个重要文件,位于 `/proc` 虚拟文件系统下。该文件提供了一系列关于整个系统性能的统计数据[^1]。这些数据主要用于监控 CPU 使用率、内存状态以及 I/O 操作等方面。 --- #### 主要字段及其含义 ##### 1. **CPU 统计** `/proc/stat` 的第一行通常表示整体 CPU 的使用情况。这一行以关键字 `cpu` 开头,后面跟着多个数值,分别代表不同的 CPU 时间片类别[^2]: - **user**: 用户空间占用的 CPU 时间。 - **nice**: 用户空间内改变过优先级 (Nice 值调整) 的进程所使用的 CPU 时间。 - **system**: 系统调用消耗的时间,即内核态下的 CPU 占用时间。 - **idle**: CPU 处于空闲状态的时间。 - **iowait**: CPU 等待 I/O 完成的时间。 - **irq**: 硬中断处理花费的时间。 - **softirq**: 软中断处理花费的时间。 完整的 CPU 计算公式如下: ```plaintext CPU总时间 = user + system + nice + idle + iowait + irq + softirq [^5] ``` 如果需要进一步细化分析单个核心的情况,则后续会有类似的条目,形如 `cpu0`, `cpu1` 等,分别对应各个逻辑处理器的核心统计信息。 --- ##### 2. **其他重要统计项** 除了 CPU 数据外,`/proc/stat` 还包含了多种类型的全局系统活动指标。以下是几个常见的项目及其意义[^4]: - **ctxt**: 上下文切换次数。每次线程或进程被调度器重新安排执行顺序时都会增加此值。 - **btime**: 系统启动以来经历的秒数(自 Unix epoch 开始),可用于计算开机时间。 - **processes**: 创建的新进程总数(包括线程)。 - **procs_running**: 当前正在运行的任务数量。 - **procs_blocked**: 阻塞状态的任务数目,等待某些资源释放才能继续工作。 --- #### 示例代码:读取并解析 `/proc/stat` 以下是一个简单的 Python 脚本示例,展示如何从 `/proc/stat` 提取出 CPU 利用率的相关信息: ```python def parse_cpu_stat(): with open('/proc/stat', 'r') as f: lines = f.readlines() cpu_line = None for line in lines: if line.startswith('cpu'): cpu_line = line.strip().split() break if not cpu_line or len(cpu_line) < 8: raise ValueError("Invalid format of /proc/stat") total_time = sum(map(int, cpu_line[1:])) # Sum all time slices except the label. idle_time = int(cpu_line[4]) # Idle time slice. return { "total": total_time, "idle": idle_time } if __name__ == "__main__": stats = parse_cpu_stat() print(f"Total CPU Time: {stats['total']} ms") print(f"Idle CPU Time: {stats['idle']} ms") ``` 上述脚本通过逐行扫描找到第一个匹配的关键字 `cpu` 并提取其后的各项参数来完成基本的数据采集操作[^3]。 --- #### 注意事项 由于不同版本的 Linux 内核可能对 `/proc/stat` 文件的具体实现有所差异,在实际开发过程中需要注意兼容性问题。例如较新的发行版可能会引入额外的字段或者更改原有字段的位置定义等。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值