Linux Top 命令计算进程CPU使用率
Linux Top 命令计算进程CPU使用率
top 命令是一个实时进程监控工具,在 Linux 中通过读取系统文件(尤其是 /proc 文件系统)来获取进程的 CPU 使用率。其实现中关键的部分是对进程的 CPU 使用率进行采集和计算。这里我简要介绍 top 命令的实现思路,以及它如何通过源码计算进程的 CPU 使用率。
top 命令的源码最初是用 C 语言编写的,通常可以在 procps 项目中找到其源码(例如 procps-ng 项目)。以下是 top 计算进程 CPU 使用率的主要步骤和原理:
1. 数据获取
top 从 /proc/stat 和 /proc/[pid]/stat 文件中获取 CPU 使用数据:
-
系统级 CPU 数据(
/proc/stat):/proc/stat文件包含系统总的 CPU 使用时间。第一行cpu后面跟着的数值代表了 CPU 在不同状态下的时间(如用户态、内核态、空闲等)。- 每个数字的单位是 “jiffies” (时间片),这是系统中断的最小时间单位。
-
进程级 CPU 数据(
/proc/[pid]/stat):- 每个进程的状态文件
/proc/[pid]/stat包含了该进程的 CPU 使用信息,包括用户态时间 (utime)、内核态时间 (stime)、子进程的用户态时间 (cutime)、子进程的内核态时间 (cstime)。 - 这些数据同样以 jiffies 为单位。
- 每个进程的状态文件
2. CPU 使用率的计算步骤
top 通过周期性读取和比较前后两次的数据差值来计算 CPU 使用率。其计算流程如下:
-
采样初始时间点:
- 读取系统级别和进程级别的 CPU 数据,得到初始的
total_cpu_time和process_cpu_time。 - 其中,
total_cpu_time是所有 CPU 核心的总时间,包括用户态、内核态和空闲时间的总和。 process_cpu_time是某个进程的总时间(包含utime、stime、cutime、cstime的和)。
- 读取系统级别和进程级别的 CPU 数据,得到初始的
-
采样第二时间点(经过一个刷新周期,例如 1 秒):
- 再次读取
/proc/stat和/proc/[pid]/stat中的数据,得到新的total_cpu_time和process_cpu_time。
- 再次读取
-
计算差值:
total_delta = total_cpu_time(T2) - total_cpu_time(T1)process_delta = process_cpu_time(T2) - process_cpu_time(T1)
-
计算 CPU 使用率:
- 使用以下公式计算进程的 CPU 使用率:
CPU 使用率(%)= (process_delta / total_delta)×100
- 如果系统是多核,则再乘以 CPU 核数,使得 CPU 使用率可以反映在多核环境下的真实使用量。
在实际的 top 源码中,数据采集和计算更加复杂,包含:
- 多核的支持,计算时乘以核心数。
- 进程的调度优先级和
nice值的影响。 - 不同类型的时间(用户态、系统态等)的具体占比等。
4. 关键源码实现位置
在 procps-ng 的 top 源码中:
linux/Display.c:包含了主要的数据读取和显示逻辑。proc/readproc.c:实现了对/proc文件系统的解析,用于读取 CPU 和进程的状态信息。
总结
top 命令使用两个时间点的系统和进程 CPU 时间差值来计算进程的 CPU 使用率。这种方法避免了直接采样瞬时数据的误差,提供了相对准确的 CPU 使用率。在多核系统中,CPU 使用率可以超过 100%,并且 top 会根据各核心的总和来进行计算。

浙公网安备 33010602011771号