如果一次只能执行 1 个进程,那么 htop 中的利用率百分比意味着什么?

如果一次只能执行 1 个进程,那么 htop 中的利用率百分比意味着什么?

我看到该htop命令分别报告了每个 CPU 核心以及进程的利用率百分比。

我们知道CPU中一次只能执行1个进程。进程怎么可能占用CPU的一定“百分比”?

这和有什么关系吗指令流水线

答案1

顶部显示一段时间内的使用情况 - 默认情况下,大约 3 秒。它主要告诉您特定进程 ID 在该时间间隔内使用的 CPU 时间百分比。请注意,这一百分比可能超过 100% - 如果您有一个进程运行两个线程并保持双核系统的两个核心都处于繁忙状态,那么您会在该进程的 %CPU 列中看到大约 195% 的数字。

要添加更多详细信息,如手册页所述:

       k: %CPU -- CPU 使用率
          该任务自上次屏幕显示以来所用 CPU 时间的份额
          更新,表示为总 CPU 时间的百分比。在真正的 SMP 中
          环境,如果“Irix 模式”关闭,top 将在“Solaris”中运行
          mode',其中任务的 CPU 使用率将除以总数
          CPU 数量。您可以使用“I”交互切换“Irix/Solaris”模式
          命令。
...
       -d : 延迟时间间隔为: -d ss.tt (秒.十分位)
            指定屏幕更新之间的延迟,并覆盖cor-
            个人配置文件中的响应值或
            启动默认。稍后可以使用“d”或“s”进行更改
            交互式命令。
...
           全局默认值
              'A' - Alt 显示关闭(全屏)
            * 'd' - 延迟时间 3.0 秒
              'I' - Irix 模式打开(不,'solaris' smp)
            * 'p' - PID 监控关闭
            * 's' - 安全模式关闭(不安全)
              'B' - 粗体禁用关闭

因此,%CPU 列是自上次屏幕更新以来计算机总 CPU 时间的百分比。您可以通过命令行或交互方式更改屏幕更新之间的时间,但默认为 3 秒。默认情况下,Irix 模式处于启用状态,并且在多处理器系统上 %CPU 可以 >100%,但可以禁用 Irix 模式以使百分比根据核心数量按比例缩小。

答案2

简短回答

  • Linux 内核统计使用情况吉菲斯(CPU 时间单位),/proc/<PID>/stat告诉您单个进程自启动以来使用了多少 jiffies
  • htop比较 jiffies 总和的两个快照(除以 CPU 线程数)。这两个时间点之间的间隔可以以-d --delay=DELAY十分之一秒为单位进行配置。例如1s更新间隔(默认为1.5s,即-d 15):
htop -d 10
  • 100%1.5意味着单个进程在观察的时间窗口(例如秒)内始终使用 1 个 CPU 线程。这个值在较长时期内可能不具有代表性。
  • 可以使用+/-键修改更新间隔

更长的解释

最好的来源是源代码:)(对于 Linux 查找LinuxProcessList_scanCPUTime函数)。

  1. htop读取PROCSTATFILE指向存储在 中的整个系统统计信息/proc/stat,您可以自己检查:
$ cat /proc/stat

对于每个过程的值,请参阅:

/proc/<PID>/stat
  1. 第一行显示 CPU 总使用率,而在列中我们有以下值
usertime, nicetime, systemtime, idletime, ioWait, irq, softIrq, steal, guest, guestnice
  1. 以下几行显示每个 CPU 核心(线程)的相同值。
  2. 总时间计算如下:
totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime

  1. totaltime除以 cpu 数量($ nprocLinux 上的值)。
double period = (double)this->cpus[0].totalPeriod / cpus;

最后,LinuxProcessList_recurseProcTree百分比计算为两个时间戳之间的使用情况

percent_cpu = (period < 1e-6) ? 0.0f : ((lp->utime + lp->stime - lasttimes) / period * 100.0);
  • utime用户代码所花费的 CPU 时间,以时钟周期为单位测量
  • stime内核代码所花费的 CPU 时间,以时钟周期为单位测量
  • lasttimes是之前的“时间” lp->utime + lp->stime(以时钟周期为单位)
  1. 最后,此计算中使用的时间单位依赖于 jiffies,请参阅 参考资料man 7 time获取更多信息。
 t * 100 / jiffy

其中jiffy是每秒的时钟滴答数,而不是正常时间。

 jiffy = sysconf(_SC_CLK_TCK);

您可以使用以下方法获取时钟刻度值:

$ getconf CLK_TCK
100

(这意味着如果您没有使用特殊硬件或实时 Linux 等,则可以忽略此计算。)

答案3

这是统计数据:50% 意味着“一段时间内 cpu 的一半”,如果你深入观察,你会发现那个时间是什么。

相关内容