Linux cpu为什么会超过100% ?

00. 什么是cpu ?

中央处理器(CPU,Central Processing Unit)是一块超大规模的集成电路,是一台计算机的运算核心(Core)和控制核心(Control Unit)。它的功能主要是解释计算机指令以及处理计算机软件中的数据。

其实简单的说,他就是大脑,一颗电子大脑。通俗来讲,计算机的cpu就相当于人类的大脑,虽然不是主动指挥,但是通过遵循放置在计算机内存中的指令来实现指挥。它也做算术运算,如加法,减法,乘法等,可以作出决定和选择。

01. 相关概念

CPU物理个数:主板上实际插入的cpu数量,可以数不重复的 physical id 有几个(physical id)

[root@ufo ~]# grep 'physical id' /proc/cpuinfo|sort|uniq|wc -l
1

每个CPU的核数:单块CPU上面能处理数据的芯片组的数量,如双核、四核等 (cpu cores)

[root@ufo ~]# grep 'cpu cores' /proc/cpuinfo|uniq|awk -F ':' '{print $2}'
4

逻辑CPU个数:一般情况下,逻辑cpu数=物理CPU个数×每颗核数,如果不相等的话,则表示服务器的CPU支持超线程技术( HT 简单来说,它可使处理器中的1颗内核像2 颗内核那样在操作系统中发挥作用。这样一来,操作系统可使用的执行资源扩大了一倍,大幅提高了系统的整体性能,此时逻辑cpu数=物理CPU个数×每颗核数x2

[root@ufo ~]# cat /proc/cpuinfo| grep "processor"|wc -l
8

总核数 = CPU物理个数 x 每个CPU的核数

总逻辑CPU数 = 物理CPU个数 x 每颗物理CPU的核数 x 超线程数

相关脚本:

#!/bin/bash
physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0
logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=$(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print $2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))
echo "****** CPU Information ******"
echo "Logical CPU Number  : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number     : ${coreNumber}"
echo "HT Number           : ${HTNumber}"
echo "*****************************"

****** CPU Information ******
Logical CPU Number  : 8
Physical CPU Number : 1
CPU Core Number     : 4
HT Number           : 2
*****************************

02. cpu为什么会超过100% ?

通过top命令进行查看进程的cpu使用率。有时候就会发现某个进程的cpu使用率超过了100%。例如:

top - 10:12:55 up 3 days, 13:09,  1 user,  load average: 1.19, 0.87, 1.43
Tasks: 235 total,   1 running, 181 sleeping,   0 stopped,   1 zombie
%Cpu(s): 56.4 us,  2.6 sy,  0.0 ni, 40.5 id,  0.1 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem :  7868576 total,  1022508 free,  2635576 used,  4210492 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4484128 avail Mem 

  PID 	USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                    
15736 	root      20   0   31840   1564   1412 S 199.0  0.0   0:46.34 samples_test

这里的%CPU为什么会超过100%? 就算cpu不停的运行,最多也就是100% ,这个时候我们需要了解这个字段的具体含义:

$ man top
......
        1. %CPU  --  CPU Usage
           The task's share of the elapsed CPU time since the last screen update, expressed as a percentage of total CPU time.

           In a true SMP environment, if a process is multi-threaded and top is not operating in Threads mode, amounts greater than 100% may be reported.  You toggle Threads mode with the `H' inter‐
           active command.

           Also for multi-processor environments, if Irix mode is Off, top will operate in Solaris mode where a task's cpu usage will be divided by the total number of CPUs.  You toggle Irix/Solaris
           modes with the `I' interactive command.
......

这里先介绍几个概念

SMP(Symmetric Multi-Processing),即对称多处理器结构,特征是只有一个操作系统实例,运行在多个CPU上,每个CPU的结构都是一样的,内存、资源共享。

进程是执行中一段程序,即一旦程序被载入到内存中并准备执行,它就是一个进程。进程是表示资源分配的的基本概念,又是调度运行的基本单位,是系统中的并发执行的单位。

线程单个进程中执行中每个任务就是一个线程。线程是进程中执行运算的最小单位。

进程与线程的关系一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务。

给出解释:

top命令默认显示进程的数据(进程模式),如果使用top -H,该选项会列出所有Linux线程。如果top已经运行了,也可以通过按“H”键切换线程模式,每一个线程的%cpu最高也就100%。

%CPU表示的是上次更新到现在的CPU时间占用百分比,在实际的SMP环境中,如果进程有多个线程,用top命令默认模式查询,那么可能导致结果大于100%。

理论上cpu总共有N个核,top默认进程模式就可以显示到上限 N*100%总核数N = CPU物理个数 x 每个CPU的核数 (top 按"1"切换看到的是逻辑cpu个数,不是总核数,注意区别。总逻辑CPU数 = 物理CPU个数 x 每颗物理CPU的核数 x 超线程数)

top -H,或者top运行后按下H开启线程模式。可以看到sample_test至少包含了两个cpu使用率都很高的线程,使用率接近100%,但是不会超过100%。

top - 10:13:40 up 3 days, 13:10,  1 user,  load average: 1.88, 1.10, 1.49
Threads: 1018 total,   4 running, 961 sleeping,   0 stopped,   1 zombie
%Cpu(s): 56.8 us,  1.6 sy,  0.0 ni, 41.3 id,  0.3 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7868576 total,  1009804 free,  2643240 used,  4215532 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  4472252 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
15737 root      20   0   31840   1564   1412 R 99.3  0.0   1:07.91 samples_test                                                                
15738 root      20   0   31840   1564   1412 R 98.0  0.0   1:07.83 samples_test

top -H -p pid(top进程模式查到的pid),可以看到实际samples_test一共是有三个线程的,其中两个cpu使用率特别高,一个特别低。

$ top -H -p 15736
top - 10:40:41 up 3 days, 13:37,  1 user,  load average: 2.65, 2.75, 2.44
Threads:   3 total,   2 running,   1 sleeping,   0 stopped,   0 zombie
%Cpu(s): 56.2 us,  2.2 sy,  0.0 ni, 41.6 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7868576 total,   332464 free,  3167324 used,  4368788 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  3846852 avail Mem 

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
 15737 root      20   0   31840   1680   1528 R 99.3  0.0  17:27.23 samples_test                                                                
 15738 root      20   0   31840   1680   1528 R 99.0  0.0  17:26.73 samples_test                                                                
 15736 root      20   0   31840   1680   1528 S  0.0  0.0   0:00.00 samples_test

可以使用pstree命令快速查看进程中线程的关系:

$ pstree -p 15736
samples_test(15736)─┬─{samples_test}(15737)
                    └─{samples_test}(15738)

可以看到,线程号15736的线程为主线程(进程模式首先看到的),cpu使用率低;而15737和15738两个线程为子线程(线程模式可以看到),cpu使用率很高。

03. 几个cpu使用率高的案例参考

【mysql 占用CPU超过100%解决过程】
https://blog.csdn.net/jimshen/article/details/78706538

【mysql 占用cpu特别高的解决】
https://yunwei365.blog.csdn.net/article/details/78835708?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

  • 19
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: LinuxCPU使用率超过100%是指系统中的CPU资源已经全部被占用,而且还有一些进程在等待CPU资源,导致CPU使用率超过100%。这种情况通常导致系统变得非常缓慢,甚至出现死机的情况。解决这个问题的方法通常是通过优化进程的调度策略,或者增加CPU资源来缓解压力。 ### 回答2: 在Linux系统中,CPU使用率通常是以百分比来衡量的,每个CPU核心的使用率上限为100%。但是,当系统执行高负载而且多线程应用程序时,CPU使用率可能超过100%。这是由于Linux在计算多个CPU核心的总使用率时,将所有核心的使用率相加,导致总使用率高于100%。 例如,当一个应用程序使用了2个CPU核心,并且每个核心的使用率均达到了100%,那么系统的总CPU使用率将是200%。这意味着,当一个应用程序使用多个CPU核心时,它可以使用超过100%的CPU使用率,这在Linux系统中是一个常见的现象。 在这种情况下,如果CPU使用率超过了系统实际的物理CPU核心数,就导致资源的竞争和瓶颈,因此为了避免系统出现负载过重的问题,需要进行一些优化和改进。以下是一些优化策略: 1.调整进程优先级:可以通过将应用程序的进程优先级调整为低优先级,或通过多线程和添加CPU限制等方式来优化系统。 2.增加CPU核心数:如果系统的CPU资源不足,可以考虑增加更多的CPU核心,以提高系统的并发性。 3.优化应用程序:可以尝试通过编写高效的代码和使用基于线程的并发模型来优化应用程序,从而减少对CPU的负载。 4.监控系统负载: 监控系统的负载状况,及时发现和处理负载过重的问题,避免系统崩溃和资源浪费。 总之,在Linux系统中,CPU使用率超过100%并不意味着系统出现问题。但是,如果CPU使用率长期超过了系统的物理CPU核心数,就需要优化和改进,以避免资源的竞争和瓶颈,从而提高系统的稳定性和性能。 ### 回答3: 当LinuxCPU使用率超过100%时,这意味着正在运行的进程需要比系统分配给它的更多的CPU资源。这通常是由于几个原因造成的。首先,进程可能是CPU密集型的,即需要处理大量的计算。此时,进程占用系统中所有CPU的时间片,导致CPU使用率超过100%。 其次,可能有多个进程同时运行,并且每个进程都需要一定数量的CPU资源来运行。在这种情况下,LinuxCPU进行分时调度,并将CPU时间片分配给每个进程。如果同时有多个进程在竞争CPU时间片,这可能导致CPU使用率超过100%。 最后,如果有IO密集型进程正在运行,它们可能频繁地进行磁盘读写操作。如果系统中的磁盘IO速度较慢,这可能阻塞进程并导致CPU使用率超过100%。 当CPU使用率超过100%时,操作系统尝试平衡CPU时间片,从而确保所有进程能够适当地使用CPU资源。此外,如果超过100%的使用率持续很长时间,可能导致进程崩溃或系统崩溃。为了解决问题,我们可以通过使用其他高效的算法或调整进程的优先级来降低CPU使用率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值