在Linux中,top命令通过读取内核提供的统计数据来计算CPU使用率。其底层原理可以概括为以下几步:
1. 读取 /proc/stat
top命令主要从/proc/stat文件中获取CPU的统计信息。这个文件包含了每个CPU核心(或所有核心合计)的各种状态下的时间计数,单位是jiffies(一个jiffy是内核时间单位,通常是1/100秒或1/1000秒,取决于Hertz配置)。
/proc/stat中包含的关键信息有:
-
user (us) - 普通进程在用户态消耗的时间。
-
nice (ni) - 优先级调整过的进程在用户态消耗的时间。
-
system (sy) - 内核进程在内核态消耗的时间。
-
idle (id) - CPU空闲时间。
-
iowait (wa) - CPU等待I/O完成的时间。
-
irq (hi) - 硬件中断处理时间。
-
softirq (si) - 软件中断处理时间。
-
steal (st) - 在虚拟化环境中,虚拟CPU被其他操作系统偷走的时间(若适用)。
-
guest (guest) - 运行虚拟CPU的时间(若适用)。
2. 计算时间差
top会周期性地(通常是每秒一次)读取/proc/stat的数据,然后计算两次读取之间的时间差。这样可以获得每个状态下CPU使用的时间增长。
3. CPU使用率计算
使用这些时间差,top计算CPU使用率如下:
-
总时间(total time)计算:将所有状态的时间差加起来(user + nice + system + idle + iowait + irq + softirq + steal + guest)。
-
CPU使用率(某一状态的使用率)= (该状态的时间差 / 总时间差)* 100。
例如,CPU的用户态使用率计算公式为:
用户态使用率=(user新的−user旧的total新的−total旧的)×100
其中,user代表用户态时间,total代表总时间。
4. 多核处理
对于多核CPU,top会为每个核心独立计算使用率,然后可以显示单核或所有核心的总体使用率。/proc/stat中会为每个CPU核心提供单独的行数据,以cpu0, cpu1, ..., cpuN命名。
5. 显示
top会将这些百分比转换成易读的格式,并在屏幕上实时更新显示。
这种计算方式允许top命令给出精确的、瞬时和历史的CPU使用率数据,帮助用户监控系统性能。