¿Por qué la CPU de Linux supera el 100%?

00. ¿Qué es la CPU?

La unidad central de procesamiento (CPU, unidad central de procesamiento) es un circuito integrado a gran escala, que es el núcleo y la unidad de control de una computadora. Su función es principalmente interpretar instrucciones de computadora y procesar datos en software de computadora.

De hecho, en pocas palabras, es el cerebro, un cerebro electrónico. En términos sencillos, la CPU de la computadora es equivalente al cerebro humano. Aunque no está al mando activamente, el comando se logra siguiendo las instrucciones colocadas en la memoria de la computadora. También realiza operaciones aritméticas, como sumas, restas, multiplicaciones, etc., y puede tomar decisiones y elecciones.

01. Conceptos relacionados

Número físico de CPU : el número de CPU realmente insertadas en la placa base, hay varios identificadores físicos que se pueden contar (identificación física)

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

Número de núcleos por CPU : el número de conjuntos de chips que pueden procesar datos en una sola CPU, como de doble núcleo, de cuatro núcleos, etc. (núcleos de CPU)

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

Número de CPU lógicas : en circunstancias normales, el número de CPU lógicas = el número de CPU físicas × el número de cada núcleo . Si no son iguales, significa que la CPU del servidor admite la tecnología Hyper-Threading (HT en términos simples, puede hacer que el procesador Un núcleo juega un papel en el sistema operativo como dos núcleos. De esta manera, los recursos de ejecución disponibles para el sistema operativo se duplican, lo que mejora en gran medida el rendimiento general del sistema. En este momento, el número de CPU lógicas = el número de CPU físicas × Número de cada núcleo x2 )

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

Número total de núcleos = número físico de CPU x número de núcleos por CPU

Número total de CPU lógicas = número de CPU físicas x número de núcleos por CPU física x número de hyperthreads

Guiones relacionados:

#!/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. ¿Por qué la CPU supera el 100%?

Utilice el comando superior para ver el uso de la CPU del proceso. A veces se encuentra que el uso de CPU de un determinado proceso excede el 100%. P.ej:

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

¿Por qué el% de CPU aquí excede el 100%? Incluso si la CPU sigue funcionando, es 100% como máximo. En este momento, debemos comprender el significado específico de este campo:

$ 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.
......

A continuación se muestran algunos conceptos :

SMP (Symmetric Multi-Processing), la estructura de multiprocesador simétrico, se caracteriza por una sola instancia de sistema operativo, que se ejecuta en varias CPU, cada una de las cuales tiene la misma estructura, compartiendo memoria y recursos.

Un proceso es un programa en ejecución, es decir, una vez que el programa se carga en la memoria y está listo para ejecutarse, es un proceso. El proceso es el concepto básico de asignación de recursos, la unidad básica de la operación de programación y la unidad de ejecución concurrente en el sistema.

Los subprocesos se ejecutan en un solo proceso para cada tarea es un subproceso. Un hilo es la unidad más pequeña para realizar operaciones en un proceso.

La relación entre el proceso y el hilo Un hilo solo puede pertenecer a un proceso, pero un proceso puede tener varios hilos. El multihilo es permitir que se ejecuten varias tareas al mismo tiempo en un proceso.

Dar una explicación:

El comando top muestra los datos del proceso ( modo de proceso ) de forma predeterminada . Si usa top -H, esta opción enumerará todos los subprocesos de Linux. Si top ya se está ejecutando, también puede cambiar el modo de subproceso presionando la tecla "H" , y el% de cpu de cada subproceso es hasta el 100%.

% CPU representa el porcentaje de tiempo de CPU desde la última actualización hasta el presente. En el entorno SMP real, si el proceso tiene varios subprocesos y se usa el modo predeterminado del comando superior para realizar consultas, el resultado puede ser superior al 100%.

En teoría, la CPU tiene un total de N núcleos , y el modo de proceso predeterminado de la parte superior puede mostrar hasta el límite superior N * 100% . Número total de núcleos N = número físico de CPU x número de núcleos por CPU (en la parte superior presione "1" para cambiar y ver el número de CPU lógicas, no el número total de núcleos, preste atención a la diferencia. Número total de CPU lógicas = número de CPU físicas x Número de núcleos por CPU física x número de hyperthreads)

top -H, o presione H después de que top esté funcionando para iniciar el modo hilo. Se puede ver que sample_test contiene al menos dos subprocesos con un alto uso de CPU, y el uso está cerca del 100%, pero no superará el 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 (pid que se encuentra en el modo de proceso superior), puede ver que el samples_test real tiene un total de tres subprocesos, de los cuales dos tasas de uso de cpu son particularmente altas y una es particularmente baja.

$ 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

Puede usar el comando pstree para ver rápidamente la relación entre los subprocesos en el proceso:

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

Se puede ver que el hilo con el número de hilo 15736 es el hilo principal (visto por primera vez en el modo de proceso) y la tasa de uso de la CPU es baja; mientras que los hilos 15737 y 15738 son subprocesos (como se ve en el modo de hilo) , la tasa de uso de la CPU es alta.

03. Referencias a varios casos con alto uso de CPU

[Proceso de solución que mysql ocupa más del 100% de la CPU]
https://blog.csdn.net/jimshen/article/details/78706538

[Solución que mysql ocupa una CPU particularmente alta]
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

Supongo que te gusta

Origin blog.csdn.net/qq_42226855/article/details/112785382
Recomendado
Clasificación