踩坑之Linux top监控进程%CPU超过100%

目录

一、问题场景

二、问题产生原因以及解决办法

1. 出现原因

2. 解决办法 

        2.1 设置solaris mode

        2.2 保存默认设置为 solaris mode


一、问题场景

使用top查看linux的性能指标,结果出现进程的CPU占用率超出100%却没有卡顿现象,感觉很不科学

二、问题产生原因以及解决办法

1. 出现原因

 % cpu 是表示单核 cpu 的占用率, 而不是占用所有 cpu 的占用率。可以通过按1查看系统是否有多个CPU

果然,我的机器的CPU是双核的:%Cpu0,%Cpu1! 

 也可以输入以下命令,查看CPU信息:

cat /proc/cpuinfo

2. 解决办法 

        2.1 设置solaris mode

        若想这里显示的%CPU的数据是全部cpu核的使用率,而不是单核,可以通过切换solaris mode模式。

  • irix mode 和 Solaris mode两种模式可以通过I(大写i)切换,默认为irix mode
  • 对于%cpu这一项在irix mode下,%cpu 就是只计算一个cpu核心,100%代表一个cpu核心达到100%负载,此时如果你有4个核心,就需要除以4
  • 对于solaris mode 在irix的基础上除以cpu个数

        2.2 保存默认设置为 solaris mode

  • 可以用shift + I键切换到Solaris mode,然后用Shift + W键保存到~/.toprc中,这样下次就不需要再手动切换,top命令启动时将读取~/.toprc文件中的配置,自动使用solaris模式。
  • 将toprc文件复制到/etc/toprc文件下,则系统全局使用该文件。
### 关于 `top` 命令中 `%CPU` 字段的含义和计算方式 #### 1. `%CPU` 字段的定义 在 Linux 系统中,`top` 命令中的 `%CPU` 字段表示一个固定时间间隔内,某个进程所消耗的 CPU 时间占总 CPU 时间的比例[^2]。这个比例反映了该进程在这段时间内的活跃程度。 对于单核处理器而言,如果某进程完全占据了这颗核心,则其 `%CPU` 可能达到 100%;而对于多核系统来说,当进程利用了多个核心时,`%CPU` 的数值可能会超过 100%,具体取决于它实际占用的核心数量以及这些核心上的负载情况[^4]。 #### 2. `%CPU` 的计算方法 为了理解如何得出这一数据,我们需要深入到操作系统的实现层面: - **基础概念** - 内核维护了一组称为 per-CPU 统计的数据结构 (如 kernel_cpustat),它们位于 `_per_cpu_start` 到 `__per_cpu_end` 这一地址范围内[^3]。 - **统计过程** - 当调用 `top` 或其他监控工具读取当前状态时,程序会查询上述统计数据并对比前后两次采样之间的差异。 - **公式表达** 假设 T 是采样的时间段长度(单位秒),U 表示这段时间里特定进程中运行态的时间片总数(也叫 jiffies,在不同的硬件架构下有不同的分辨率)。那么可以按照如下方式进行估算: \[ \%CPU = \left(\frac{U}{T} \times S\right) / N \] 其中, - \( U \): 用户空间加系统空间累计耗时; - \( T \): 实际经过的真实世界钟表时间; - \( S \): 单位转换因子(通常等于 100); - \( N \): 如果目标机器有多颗逻辑处理单元的话就是物理或者虚拟 cpu 数量。 因此,最终呈现出来的百分比不仅考虑到了单一任务本身的执行效率,同时也综合考量了整个平台环境下的并发特性][^[^24]。 ```python def calculate_cpu_usage(user_time, system_time, elapsed_realtime, num_cpus=1): total_process_time = user_time + system_time percentage = (total_process_time / elapsed_realtime * 100) / num_cpus return round(percentage, 2) # Example usage of the function with hypothetical values. example_user_time = 50 # Hypothetical value representing user mode time spent by a process during sampling period. example_system_time = 30 # Same as above but for syscalls/kernel operations performed on behalf of that same process. example_elapsed_realtime = 80 # Time passed between two consecutive measurements. calculated_percentage = calculate_cpu_usage(example_user_time, example_system_time, example_elapsed_realtime) print(f"The calculated %CPU is {calculated_percentage}%.") ``` 以上代码片段展示了一个简化版的方法用于模拟基于已知参数的手动计算流程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值