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
会根据各核心的总和来进行计算。