答案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
函数)。
htop
读取PROCSTATFILE
指向存储在 中的整个系统统计信息/proc/stat
,您可以自己检查:
$ cat /proc/stat
对于每个过程的值,请参阅:
/proc/<PID>/stat
- 第一行显示 CPU 总使用率,而在列中我们有以下值
usertime, nicetime, systemtime, idletime, ioWait, irq, softIrq, steal, guest, guestnice
- 以下几行显示每个 CPU 核心(线程)的相同值。
- 总时间计算如下:
totaltime = usertime + nicetime + systemalltime + idlealltime + steal + virtalltime
totaltime
除以 cpu 数量($ nproc
Linux 上的值)。
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
(以时钟周期为单位)
- 最后,此计算中使用的时间单位依赖于 jiffies,请参阅 参考资料
man 7 time
获取更多信息。
t * 100 / jiffy
其中jiffy
是每秒的时钟滴答数,而不是正常时间。
jiffy = sysconf(_SC_CLK_TCK);
您可以使用以下方法获取时钟刻度值:
$ getconf CLK_TCK
100
(这意味着如果您没有使用特殊硬件或实时 Linux 等,则可以忽略此计算。)
答案3
这是统计数据:50% 意味着“一段时间内 cpu 的一半”,如果你深入观察,你会发现那个时间是什么。