Fork me on GitHub

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 使用率。其计算流程如下:

  1. 采样初始时间点

    • 读取系统级别和进程级别的 CPU 数据,得到初始的 total_cpu_timeprocess_cpu_time
    • 其中,total_cpu_time 是所有 CPU 核心的总时间,包括用户态、内核态和空闲时间的总和。
    • process_cpu_time 是某个进程的总时间(包含 utimestimecutimecstime 的和)。
  2. 采样第二时间点(经过一个刷新周期,例如 1 秒):

    • 再次读取 /proc/stat/proc/[pid]/stat 中的数据,得到新的 total_cpu_timeprocess_cpu_time
  3. 计算差值

    • total_delta = total_cpu_time(T2) - total_cpu_time(T1)
    • process_delta = process_cpu_time(T2) - process_cpu_time(T1)
  4. 计算 CPU 使用率

    • 使用以下公式计算进程的 CPU 使用率:

      CPU 使用率(%)= (process_delta / total_delta)×100

  • 如果系统是多核,则再乘以 CPU 核数,使得 CPU 使用率可以反映在多核环境下的真实使用量。

在实际的 top 源码中,数据采集和计算更加复杂,包含:

  • 多核的支持,计算时乘以核心数。
  • 进程的调度优先级和 nice 值的影响。
  • 不同类型的时间(用户态、系统态等)的具体占比等。

4. 关键源码实现位置

procps-ngtop 源码中:

  • linux/Display.c:包含了主要的数据读取和显示逻辑。
  • proc/readproc.c:实现了对 /proc 文件系统的解析,用于读取 CPU 和进程的状态信息。

总结

top 命令使用两个时间点的系统和进程 CPU 时间差值来计算进程的 CPU 使用率。这种方法避免了直接采样瞬时数据的误差,提供了相对准确的 CPU 使用率。在多核系统中,CPU 使用率可以超过 100%,并且 top 会根据各核心的总和来进行计算。

 

参考:https://www.cnblogs.com/gufengchen/p/11335300.html

posted @ 2024-11-08 23:43  龙凌云端  阅读(65)  评论(0编辑  收藏  举报