cpu占用率怎么计算

cpu占用率怎么计算

CPU 占用率的计算方式因操作系统而异,以下是常见操作系统中的计算方法:
Windows 系统

  • 任务管理器查看:在任务管理器中,CPU 占用率是在任务管理器的刷新周期内 CPU 忙的时间与整个刷新周期的比值,默认刷新周期是 1 秒。
  • 公式计算:CPU% = 1 - 空闲时间(idle time)/ 系统总时间(system time)* 100。其中,系统总时间等于 CPU 处于用户态和内核态的时间总和,即系统总时间 = 用户态时间(user time) + 内核态时间(kernel time),这里的系统总时间并不包括空闲时间,因为当 CPU 处于空闲状态时,实际上是在内核模式下运行系统空闲进程(system idle process),所以内核态时间实际上已经包含了空闲时间。

Linux 系统
  • 通过 /proc 文件系统计算
    • 从 /proc/stat 文件中获取总的 CPU 使用情况。该文件中第一行的数值表示 CPU 总的使用情况,各数值含义如下:
      • user:从系统启动开始累计到当前时刻,处于用户态的运行时间,不包含 nice 值为负进程。
      • nice:从系统启动开始累计到当前时刻,nice 值为负的进程所占用的 CPU 时间。
      • system:从系统启动开始累计到当前时刻,处于核心态的运行时间。
      • idle:从系统启动开始累计到当前时刻,除 I/O 等待时间以外的其它等待时间。
      • iowait:从系统启动开始累计到当前时刻,I/O 等待时间(since 2.5.41)。
      • irq:从系统启动开始累计到当前时刻,硬中断时间(since 2.6.0-test4)。
      • softirq:从系统启动开始累计到当前时刻,软中断时间(since 2.6.0-test4)。
      • stealstolen:在虚拟环境中运行时,被其他操作系统占用的时间(since 2.6.11)。
      • guest:在 Linux 内核控制下,运行虚拟 CPU 为 guest 操作系统所用的时间(since 2.6.24)。

    • 总的 CPU 时间 total_cpu_time = user + nice + system + idle + iowait + irq + softirq + stealstolen + guest。
    • 对于某个特定进程,从 /proc/<pid>/stat 文件中可以得出该进程自启动以来占用的 CPU 时间,比如第 14 项 utime 和第 15 项 stime 分别表示该进程执行用户代码态占用的时间和执行内核态代码占用的时间,单位是 clock tick(时钟节拍)。通过 sysconf (_sc_clk_tck) 可以获取 1 秒内有多少个 clock tick(通常是 100,即 1 clock tick 为 1/100 秒)。
    • 某进程 CPU 使用率的计算公式为:某进程 CPU 使用率 = ((utime + stime) - (last_utime + last_stime)) / (period * sysconf (_sc_clk_tck)) 。其中,(utime + stime) 为本次采样时进程占用 CPU 的时间总和,(last_utime + last_stime) 为上一次采样时进程占用 CPU 的时间总和,period 为采样时间间隔(单位:秒)。


macOS 系统
  • 可以通过活动监视器(Activity Monitor)来查看各个进程的 CPU 占用率。
  • 底层的计算方式类似于 Linux,也是通过统计 CPU 在不同状态(如用户态、系统态等)下的时间来计算总体的 CPU 占用率,但具体的实现细节和数据获取方式可能有所不同。

在实际计算 CPU 占用率时,还需要考虑以下因素:
  • 操作系统的调度策略:不同的操作系统调度算法会影响 CPU 分配给各个进程的时间,从而影响 CPU 占用率的计算。
  • 进程的状态:进程可能处于运行、就绪、等待等不同状态,只有在运行状态时才会占用 CPU 时间。
  • 多核处理器:在多核系统中,需要考虑各个核心上的 CPU 占用情况,以及进程是否能够充分利用多核并行处理能力。

看过该文章的人还看了