Explicación detallada del problema de carga (carga) de Linux + conjunto de comandos de prueba de presión

Este artículo ayuda principalmente a comprender los indicadores de rendimiento relacionados con la CPU, los problemas comunes de rendimiento de la CPU y sus soluciones.

Dirección original: https://zhuanlan.zhihu.com/p/180402964

Promedio de carga del sistema

Introducción

Promedio de carga del sistema : es el número promedio de procesos en un estado ejecutable o ininterrumpible.

Procesos ejecutables : procesos que usan la CPU o que esperan usar la CPU

Proceso de estado ininterrumpible : esperando algún acceso de IO, generalmente interactuando con el hardware y no se puede interrumpir (la razón por la que no se puede interrumpir es para proteger la consistencia de los datos del sistema y evitar errores de lectura de datos)

Ver promedio de carga del sistema

Primero, el comando superior verifica el estado de ejecución del proceso , de la siguiente manera:

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
10760 user   20   0 3061604  84832   5956 S  82.4  0.6 126:47.61 Process
29424 user   20   0   54060   2668   1360 R  17.6  0.0   0:00.03 **top**

Estado del programa Estado El proceso puede ejecutarse en R, y la operación no interrumpible es D (los detalles se explicarán en la explicación de seguimiento de la parte superior)

arriba Ver el promedio de carga del sistema:

top - 13:09:42 up 888 days, 21:32,  8 users,  load average: 19.95, 14.71, 14.01
Tasks: 642 total,   2 running, 640 sleeping,   0 stopped,   0 zombie
%Cpu0  : 37.5 us, 27.6 sy,  0.0 ni, 30.9 id,  0.0 wa,  0.0 hi,  3.6 si,  0.3 st
%Cpu1  : 34.1 us, 31.5 sy,  0.0 ni, 34.1 id,  0.0 wa,  0.0 hi,  0.4 si,  0.0 st
...
KiB Mem : 14108016 total,  2919496 free,  6220236 used,  4968284 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  6654506 avail Mem

El promedio de carga aquí indica la carga de cuello de botella del sistema en los últimos 1 minuto, 5 minutos y 15 minutos.

carga de cuello de botella del sistema de vista de tiempo de actividad

[root /home/user]# uptime
 13:11:01 up 888 days, 21:33,  8 users,  load average: 17.20, 14.85, 14.10

Ver información del núcleo de la CPU

La carga promedio del sistema está estrechamente relacionada con la cantidad de núcleos de la CPU.Podemos ver la información actual de la CPU de la máquina a través del siguiente comando:

lscpu Ver información de la CPU:

[root@Tencent-SNG /home/user_00]# lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
...
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-7  // NUMA架构信息

cat /proc/cpuinfo para ver la información de cada núcleo de CPU:

processor       : 7   // 核编号7
vendor_id       : GenuineIntel
cpu family      : 6
model           : 6
...

Razones para un alto promedio de carga del sistema

En general, los promedios de carga del sistema más altos significan un mayor uso de la CPU. Pero no están necesariamente relacionados. Si hay más tareas informáticas con uso intensivo de la CPU, la carga promedio del sistema generalmente aumentará, pero si hay más tareas con uso intensivo de IO, la carga promedio del sistema también aumentará. Sin embargo, el uso de la CPU en este momento no es necesariamente alto y puede ser muy bajo. Debido a que muchos procesos se encuentran en un estado ininterrumpido, la espera de la programación de la CPU también aumentará la carga promedio del sistema .

Entonces, si la carga promedio de nuestro sistema es muy alta, pero el uso de la CPU no es muy alto, debemos considerar si el sistema ha encontrado un cuello de botella de E/S y se debe optimizar la velocidad de lectura y escritura de E/S.

Por lo tanto, si el sistema encuentra un cuello de botella en la CPU debe verificarse junto con el uso de la CPU y la carga del cuello de botella del sistema (por supuesto, hay otros indicadores que deben compararse y verificarse, y la explicación continuará a continuación)

Solución de problemas de casos

estrés es una herramienta para aplicar presión en el sistema y realizar pruebas de estrés en el sistema. Podemos usar la herramienta de estrés para realizar pruebas de presión en la CPU para que podamos localizar y solucionar los problemas de la CPU.

yum install stress // 安装stress工具

El comando de estrés utiliza

 // --cpu 8:8个进程不停的执行sqrt()计算操作
 // --io 4:4个进程不同的执行sync()io操作(刷盘)
 // --vm 2:2个进程不停的执行malloc()内存申请操作
 // --vm-bytes 128M:限制1个执行malloc的进程申请内存大小
 stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s

Aquí verificamos principalmente el problema de demasiadas CPU, IO y procesos

Solución de problemas de la CPU

Use stress -c 1 para simular una alta carga de CPU y luego use el siguiente comando para observar el cambio de carga:

uptime : use uptime para ver la carga del sistema en este momento:

# -d 参数表示高亮显示变化的区域
$ watch -d uptime
... load average: 1.00, 0.75, 0.39

mpstat : use mpstat -P ALL 1 para ver la información de cambio de cada núcleo de la CPU por segundo. El conjunto es similar al superior. La ventaja es que puede generar los datos por segundo (personalizado) para facilitar la observación de los cambios de datos y, finalmente, generar los datos promedio:

13:14:53     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
13:14:58     all   12.89    0.00    0.18    0.00    0.00    0.03    0.00    0.00    0.00   86.91
13:14:58       0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
13:14:58       1    0.40    0.00    0.20    0.00    0.00    0.20    0.00    0.00    0.00   99.20

A partir del resultado anterior, se puede concluir que la carga actual del sistema está aumentando y uno de los núcleos se está ejecutando por completo, principalmente realizando tareas de modo de usuario, y la mayoría de ellas son tareas comerciales en este momento. Entonces, en este momento, debe verificar qué proceso hace que la CPU de un solo núcleo se llene:

pidstat : use pidstat -u 1 para generar el proceso actual del sistema y los datos de la CPU cada 1 segundo:

13:18:00      UID       PID    %usr %system  %guest    %CPU   CPU  Command
13:18:01        0         1    1.00    0.00    0.00    1.00     4  systemd
13:18:01        0   3150617  100.00    0.00    0.00  100.00     0  stress
...

top : Por supuesto, la forma más conveniente es usar el comando top para ver la carga:

top - 13:19:06 up 125 days, 20:01,  3 users,  load average: 0.99, 0.63, 0.42
Tasks: 223 total,   2 running, 221 sleeping,   0 stopped,   0 zombie
%Cpu(s): 14.5 us,  0.3 sy,  0.0 ni, 85.1 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem : 16166056 total,  3118532 free,  9550108 used,  3497416 buff/cache
KiB Swap:        0 total,        0 free,        0 used.  6447640 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
3150617 root      20   0   10384    120      0 R 100.0  0.0   4:36.89 stress

En este punto, se puede ver que el estrés ocupa una CPU alta.

Solución de problemas de E/S

Usamos stress -i 1 para simular el problema del cuello de botella de E/S, es decir, ejecutar la operación de sincronización del disco en un ciclo sin fin: uptime : Use uptime para ver la carga del sistema en este momento:

$ watch -d uptime
...,  load average: 1.06, 0.58, 0.37

mpstat : verifique el consumo de IO en este momento, pero de hecho encontramos que la CPU aquí es básicamente consumida por sys, es decir, el consumo del sistema.

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.33    0.00   12.64    0.13    0.00    0.00    0.00    0.00    0.00   86.90
Average:       0    0.00    0.00   99.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00
Average:       1    0.00    0.00    0.33    0.00    0.00    0.00    0.00    0.00    0.00   99.67

El problema de que IO no se puede generar :

El problema de que no se puede generar iowait se debe a que el estrés en el caso utiliza la llamada al sistema sync() y su función es actualizar la memoria intermedia en el disco. Para una máquina virtual recién instalada, el búfer puede ser relativamente pequeño y no puede generar una gran presión de E/S, por lo que la mayor parte lo consumen las llamadas al sistema. Por lo tanto, verá que solo aumenta el uso de la CPU del sistema. La solución es usar la próxima generación de estrés, stress-ng, que admite opciones más completas, como stress-ng -i 1 --hdd 1 --timeout 600 (--hdd significa leer y escribir archivos temporales).

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.25    0.00    0.44   26.22    0.00    0.00    0.00    0.00    0.00   73.09
Average:       0    0.00    0.00    1.02   98.98    0.00    0.00    0.00    0.00    0.00    0.00

pidstat : Igual que arriba (omitido)

Se puede ver que el aumento de CPU IO conduce a un aumento en la carga promedio del sistema. Usamos pidstat para averiguar qué proceso está causando el aumento de IO.

top : el uso de top aquí sigue siendo el parámetro más completo para ver, y se puede concluir que el estrés es el culpable del aumento de IO.

pidstat no tiene la opción iowait : puede ser que el sysstat predeterminado de CentOS sea demasiado antiguo y deba actualizarse a una versión posterior a la 11.5.5 para que esté disponible.

Solución de problemas de demasiados procesos

El problema de demasiados procesos es bastante especial, si el sistema ejecuta muchos procesos que exceden la capacidad operativa de la CPU, habrá procesos esperando por la CPU. Use stress -c 24 para simular la ejecución de 24 procesos (mi CPU tiene 8 núcleos) uptime : Use uptime para ver la carga del sistema en este momento:

$ watch -d uptime
...,  load average: 18.50, 7.13, 2.84

mpstat : Igual que arriba (omitido)

pidstat : Igual que arriba (omitido)

Se puede observar que el procesamiento del sistema en este momento está seriamente sobrecargado y la carga promedio es tan alta como 18.50 .

top : También podemos usar el comando top para ver la cantidad de procesos en el estado En ejecución en este momento.Si este número es grande, significa que el sistema se está ejecutando y hay demasiados procesos esperando para ejecutarse.

Resumir

A través de los problemas y soluciones anteriores, se puede concluir que:

Un promedio de carga alto puede ser causado por un proceso intensivo de CPU

Una carga promedio alta no significa necesariamente un uso elevado de la CPU, también puede significar que la E/S está más ocupada

Cuando encuentre que la carga es alta, puede usar herramientas como mpstat y pidstat para ayudar a analizar la fuente de la carga.

Resumen de herramientas: mpstat, pidstat, top y uptime

Cambio de contexto de la CPU

Contexto de la CPU : La CPU necesita saber dónde está cargada la tarea y comenzó a ejecutarse al ejecutar cada tarea. Es decir, el sistema necesita ayudarlo a configurar el registro de la CPU y el contador del programa (Program Counter, PC) de antemano, incluido el registro de la CPU. Se llama el contexto de la CPU.

Cambio de contexto de la CPU : el cambio de contexto de la CPU consiste en guardar primero el contexto de la CPU (es decir, los registros de la CPU y el contador del programa) de la tarea anterior, luego cargar el contexto de la nueva tarea en estos registros y el contador del programa, y ​​finalmente saltar a la nueva ubicación señalada por el contador del programa para ejecutar la nueva tarea.

Cambio de contexto de CPU : dividido en cambio de contexto de proceso , cambio de contexto de subprocesos y cambio de contexto de interrupción .

cambio de contexto de proceso

El cambio del modo de usuario al modo kernel debe realizarse a través de llamadas al sistema , donde se producirá el cambio de contexto del proceso (cambio de modo privilegiado), y también se producirá el cambio de contexto al volver al modo de usuario.

Por lo general, cada cambio de contexto toma de decenas de nanosegundos a varios microsegundos de tiempo de CPU. Si hay muchos cambios, es fácil desperdiciar tiempo de CPU guardando y restaurando recursos como registros, pilas de kernel y memoria virtual. Esto también conducirá a un aumento en la carga promedio del sistema .

Linux mantiene una cola lista para cada CPU, ordena los procesos de estado R según la prioridad y el tiempo de espera de la CPU, y selecciona el proceso de CPU más necesario para su ejecución. Ejecutar el proceso aquí implica el momento del cambio de contexto del proceso:

Segmento de tiempo de proceso agotado, .

El proceso se está quedando sin recursos del sistema (sin memoria).

El proceso duerme activamente.

Se ejecuta un proceso con mayor prioridad.

Se produce una interrupción fuerte.

cambio de contexto de subproceso

Hilos y procesos:

Cuando un proceso tiene un solo hilo, se puede considerar que el proceso es igual al hilo.

Cuando un proceso tiene varios subprocesos, estos subprocesos comparten los mismos recursos, como la memoria virtual y las variables globales. No es necesario modificar estos recursos durante los cambios de contexto.

Los subprocesos también tienen sus propios datos privados, como pilas y registros, que también deben guardarse durante el cambio de contexto.

Entonces, el cambio de contexto de hilo incluye 2 situaciones:

Subprocesos de diferentes procesos, esta situación es equivalente a la conmutación de procesos.

El cambio de subprocesos del proceso común solo necesita cambiar los datos no compartidos, como registros y datos privados de subprocesos.

interruptor de contexto de interrupción

El procesamiento de interrupciones interrumpirá la programación y ejecución normales del proceso y, en su lugar, llamará al controlador de interrupciones para responder a los eventos del dispositivo. Al interrumpir otros procesos, es necesario guardar el estado actual del proceso, de modo que después de que finalice la interrupción, el proceso aún pueda reanudarse desde el estado original.

Para la misma CPU, el procesamiento de interrupciones tiene una prioridad más alta que el proceso, por lo que el cambio de contexto de interrupción no ocurre al mismo tiempo que el cambio de contexto de proceso. Dado que las interrupciones interrumpirán la programación y la ejecución de los procesos normales, la mayoría de los controladores de interrupciones son breves y concisos para finalizar la ejecución lo antes posible.

Ver cambios de contexto del sistema

vmstat : la herramienta puede ver la memoria del sistema, el cambio de contexto de la CPU y los tiempos de interrupción:

// 每隔1秒输出
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 157256 3241604 5144444    0    0    20     0 26503 33960 18  7 75  0  0
17  0      0 159984 3241708 5144452    0    0    12     0 29560 37696 15 10 75  0  0
 6  0      0 162044 3241816 5144456    0    0     8   120 30683 38861 17 10 73  0  0

cs : el número de cambios de contexto por segundo.

in : El número de interrupciones por segundo.

r : longitud de la cola de listos, procesos que se están ejecutando o esperando la CPU.

b : la cantidad de procesos en un estado de suspensión ininterrumpida, como la interacción con el hardware.

pidstat : use la opción pidstat -w para ver la cantidad de cambios de contexto para un proceso específico:

$ pidstat -w -p 3217281 1
10:19:13      UID       PID   cswch/s nvcswch/s  Command
10:19:14        0   3217281      0.00     18.00  stress
10:19:15        0   3217281      0.00     18.00  stress
10:19:16        0   3217281      0.00     28.71  stress

Entre ellos, cswch/sy nvcswch/s representan el cambio de contexto voluntario y el cambio de contexto involuntario.

Cambio de contexto voluntario : Se refiere al cambio de contexto causado por la incapacidad del proceso para obtener los recursos requeridos. Por ejemplo, el cambio de contexto voluntario se produce cuando los recursos del sistema, como la E/S y la memoria, son insuficientes.

Cambio de contexto involuntario : Se refiere al cambio de contexto que ocurre porque el sistema obliga a programar el proceso debido a razones tales como que el intervalo de tiempo ha expirado. Por ejemplo, cuando una gran cantidad de procesos compiten por la CPU, es probable que ocurran cambios de contexto involuntarios.

Solución de problemas de casos

Aquí usamos la herramienta sysbench para simular el problema de cambio de contexto.

Primero use vmstat 1 para ver la información de cambio de contexto actual:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 514540 3364828 5323356    0    0    10    16    0    0  4  1 95  0  0
 1  0      0 514316 3364932 5323408    0    0     8     0 27900 34809 17 10 73  0  0
 1  0      0 507036 3365008 5323500    0    0     8     0 23750 30058 19  9 72  0  0

Luego use sysbench --threads=64 --max-time=300 subprocesos ejecutados para simular 64 subprocesos para realizar tareas. En este momento, verificamos la información de cambio de contexto nuevamente con vmstat 1:

$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 318792 3385728 5474272    0    0    10    16    0    0  4  1 95  0  0
 1  0      0 307492 3385756 5474316    0    0     8     0 15710 20569 20  8 72  0  0
 1  0      0 330032 3385824 5474376    0    0     8    16 21573 26844 19  9 72  0  0
 2  0      0 321264 3385876 5474396    0    0    12     0 21218 26100 20  7 73  0  0
 6  0      0 320172 3385932 5474440    0    0    12     0 19363 23969 19  8 73  0  0
14  0      0 323488 3385980 5474828    0    0    64   788 111647 3745536 24 61 15  0  0
14  0      0 323576 3386028 5474856    0    0     8     0 118383 4317546 25 64 11  0  0
16  0      0 315560 3386100 5475056    0    0     8    16 115253 4553099 22 68  9  0  0

Claramente podemos observar:

El cs actual y en han aumentado dramáticamente en este momento.

El uso de CPU de sy+us supera el 90%.

r La longitud de la cola de listos llega a 16 y supera la cantidad de núcleos de CPU en 8.

Analizar problemas de cambio de contexto cs

Usamos pidstat para ver la información actual de la CPU y la información de cambio de contexto de proceso específico:

// -w表示查看进程切换信息,-u查看CPU信息,-t查看线程切换信息
$ pidstat -w -u -t 1

10:35:01      UID       PID    %usr %system  %guest    %CPU   CPU  Command
10:35:02        0   3383478   67.33  100.00    0.00  100.00     1  sysbench

10:35:01      UID       PID   cswch/s nvcswch/s  Command
10:45:39        0   3509357         -      1.00      0.00  kworker/2:2
10:45:39        0         -   3509357      1.00      0.00  |__kworker/2:2
10:45:39        0         -   3509702  38478.00  45587.00  |__sysbench
10:45:39        0         -   3509703  39913.00  41565.00  |__sysbench

Entonces podemos ver que hay muchos cambios de contexto en muchos subprocesos de sysbench.

Analizar en problemas de interrupción

Podemos ver el reloj del sistema -d cat /proc/softirqs y el reloj -d cat /proc/interrupts para ver las interrupciones suaves y duras del sistema (interrupciones del kernel). Principalmente observamos /proc/interrupts aquí.

$ watch -d cat /proc/interrupts
RES:  900997016  912023527  904378994  902594579  899800739  897500263  895024925  895452133   Rescheduling interrupts

Aquí es obvio que el número de interrupciones de reprogramación (RES) ha aumentado Esta interrupción indica que la CPU en estado inactivo se despierta para programar la ejecución de una nueva tarea.

Resumir

Hay más cambios de contexto voluntarios, lo que indica que los procesos están esperando recursos y pueden haber ocurrido otros problemas, como E/S.

Hay más cambios de contexto involuntarios, lo que indica que los procesos se programan a la fuerza, es decir, todos compiten por la CPU, lo que indica que la CPU se ha convertido en un cuello de botella.

Si el número de interrupciones aumenta, significa que la CPU está ocupada por el controlador de interrupciones y es necesario analizar el tipo de interrupción específico al ver el archivo /proc/interrupts.

uso de CPU

Además de la carga del sistema y la información de cambio de contexto, el indicador más intuitivo de los problemas de la CPU es la información de uso de la CPU. Linux proporciona la información del estado interno del sistema al control del usuario a través del sistema de archivos virtual /proc, donde /proc/stat son las estadísticas de información de tareas y CPU.

$ cat /proc/stat | grep cpu
cpu  6392076667 1160 3371352191 52468445328 3266914 37086 36028236 20721765 0 0
cpu0 889532957 175 493755012 6424323330 2180394 37079 17095455 3852990 0 0
...

El significado de cada columna aquí es el siguiente:

usuario (generalmente abreviado como nosotros), representa el tiempo de CPU del modo de usuario. Tenga en cuenta que no incluye el tiempo agradable a continuación, pero incluye el tiempo de invitados.

nice (generalmente abreviado como ni), significa tiempo de CPU en modo de usuario de baja prioridad, es decir, el tiempo de CPU cuando el valor agradable del proceso se ajusta entre 1 y 19. Tenga en cuenta aquí que el rango de valores posibles para agradable es de -20 a 19. Cuanto mayor sea el valor, menor será la prioridad.

system (a menudo abreviado como sys), significa tiempo de CPU en modo kernel.

inactivo (a menudo abreviado como id), significa tiempo de inactividad. Tenga en cuenta que no incluye el tiempo de espera de E/S (iowait).

iowait (a menudo abreviado como wa), significa tiempo de CPU en espera de E/S.

irq (a menudo abreviado como hola), significa tiempo de CPU que procesa interrupciones duras.

softirq (a menudo abreviado como si), significa softirqs de manejo del tiempo de CPU.

robar (generalmente abreviado como st) representa el tiempo de CPU ocupado por otras máquinas virtuales cuando el sistema se ejecuta en una máquina virtual.

Invitado (generalmente abreviado como invitado) representa el tiempo de ejecución de otros sistemas operativos a través de la virtualización, es decir, el tiempo de CPU de ejecución de una máquina virtual.

guest_nice (a menudo abreviado como gnice), que representa la cantidad de tiempo que la máquina virtual se ejecuta con baja prioridad.

Aquí podemos usar top, ps, pidstat y otras herramientas para consultar fácilmente estos datos, y podemos ver fácilmente los procesos con un alto uso de la CPU. Aquí podemos usar estas herramientas para identificarlos preliminarmente, pero la causa específica del problema necesita otros métodos para continuar con la búsqueda.

Aquí podemos usar perf top para ver los datos del punto de acceso convenientemente, o usar perf record para guardar los datos actuales para verlos posteriormente con el informe de rendimiento.

Solución de problemas de uso de la CPU

Aquí hay un resumen de los problemas de uso de la CPU e ideas para solucionar problemas:

Si la CPU del usuario y la CPU de Nice son altas, significa que el proceso en modo usuario ocupa más CPU, por lo que debe concentrarse en solucionar los problemas de rendimiento del proceso.

La CPU del sistema es alta, lo que indica que el modo kernel ocupa más CPU, por lo que debe concentrarse en solucionar los problemas de rendimiento de los subprocesos del kernel o las llamadas al sistema.

La CPU en espera de E/S es alta, lo que indica que el tiempo de espera para E/S es relativamente largo, por lo que debe concentrarse en verificar si hay un problema de E/S en el almacenamiento del sistema.

La gran cantidad de interrupciones suaves e interrupciones duras indica que el programa de procesamiento de interrupciones suaves o duras consume más CPU, por lo que debe concentrarse en verificar el programa de servicio de interrupciones en el kernel.

Rutina de solución de problemas de la CPU

uso de CPU

El uso de la CPU incluye principalmente los siguientes aspectos:

Uso de la CPU del usuario, incluido el uso de la CPU en modo de usuario (usuario) y el uso de la CPU en modo de usuario de baja prioridad (agradable), que indica el porcentaje de tiempo que la CPU se ejecuta en modo de usuario. El uso elevado de la CPU por parte del usuario generalmente indica una aplicación ocupada.

Uso de la CPU del sistema, que indica el porcentaje de tiempo que la CPU se ejecuta en modo kernel (sin incluir las interrupciones). El alto uso de CPU del sistema indica que el núcleo está ocupado.

El uso de la CPU en espera de E/S, también conocido como iowait, indica el porcentaje de tiempo de espera de E/S. Si iowait es alto, generalmente indica que el tiempo de interacción de E/S entre el sistema y el dispositivo de hardware es relativamente largo.

El uso de la CPU de las interrupciones suaves y las interrupciones duras indica el porcentaje de tiempo que el kernel llama a los controladores de interrupciones suaves y los controladores de interrupciones duras, respectivamente. Su alto uso generalmente indica una gran cantidad de interrupciones en el sistema.

Además del uso de CPU robada (robar) y el uso de CPU invitada (invitado) que se usarán en el entorno de virtualización, representan respectivamente el porcentaje de tiempo de CPU ocupado por otras máquinas virtuales y el porcentaje de tiempo de CPU que ejecuta máquinas virtuales invitadas.

carga media

Refleja la carga general del sistema y puede ver la carga promedio del último minuto, los últimos 5 minutos y los últimos 15 minutos.

cambio de contexto

El cambio de contexto se centra en 2 métricas:

Un cambio de contexto voluntario debido a la imposibilidad de adquirir un recurso.

Cambios de contexto involuntarios provocados por la programación forzada por el sistema.

Proporción de aciertos de caché de CPU

La velocidad de acceso a la CPU es mucho más rápida que el acceso a la memoria, por lo que es inevitable esperar la respuesta de la memoria cuando la CPU accede a la memoria. Para coordinar la brecha de velocidad entre los dos, apareció un caché de CPU (caché de varios niveles). Si la tasa de aciertos de la memoria caché de la CPU es más alta, el rendimiento será mejor. Podemos usar las siguientes herramientas para ver la tasa de aciertos de la memoria caché de la CPU, la dirección de la herramienta , las herramientas de rendimiento de la dirección del proyecto

# ./cachestat -t
Counting cache functions... Output every 1 seconds.
TIME         HITS   MISSES  DIRTIES    RATIO   BUFFERS_MB   CACHE_MB
08:28:57      415        0        0   100.0%            1        191
08:28:58      411        0        0   100.0%            1        191
08:28:59      362       97        0    78.9%            0          8
08:29:00      411        0        0   100.0%            0          9
08:29:01      775    20489        0     3.6%            0         89
08:29:02      411        0        0   100.0%            0         89
08:29:03     6069        0        0   100.0%            0         89
08:29:04    15249        0        0   100.0%            0         89
08:29:05      411        0        0   100.0%            0         89
08:29:06      411        0        0   100.0%            0         89
08:29:07      411        0        3   100.0%            0         89
[...]

Resumir

A través de la herramienta de comprobación del índice de rendimiento (relacionada con la CPU)

Indicadores de rendimiento descripción de la herramienta tiempo de actividad promedio de carga

topuptime simplemente muestra la carga promedio en el período más reciente

arriba mostrar más indicadores Uso de CPU vmstat

mpstat

arriba

sar

/proc/stat

top, vmstat y mpstat solo pueden ver dinámicamente el estado actual, mientras que sar puede ver el historial

/proc/stat es la fuente de datos para otras herramientas de rendimiento que procesan el uso de la CPU arriba

pidstat

PD

arriba

encima

top y ps pueden mostrar la CPU del proceso en modo ordenado, y pidstat no se puede ordenar ni mostrar

htop y atop muestran todo tipo de datos en diferentes colores, lo cual es más intuitivo.Cambio de contexto del sistema vmstat muestra el cambio de contexto en este momento, el estado de ejecución y la cantidad de procesos que no se pueden interrumpir.Cambio de contexto de proceso pidstat muestra muchos elementos, incluida la información de cambio de contexto de proceso soft interrupt top

/proc/softirqs

mpstattop puede ver el uso de CPU de interrupción suave

/proc/softirqs y mpstat pueden ver la información acumulada en cada vmstat de interrupción dura de la CPU

/proc/interruptsvmstat Ver el número total de información de interrupciones

/proc/interrupts Ver la red de información acumulativa dstat de varias interrupciones en cada núcleo de CPU

sar

tcpdumpdstat y sar muestran la situación general de envío y recepción de la red con más detalle

tcpdump 提供动态抓取数据包的能力IOdstat、sar2 者都提供了详细的 IO 整体情况CPU 信息/proc/cpuinfo

lscpu都可以查看 CPU 信息系统分析perf

execsnoopperf 分析各种内核函数调用、热点函数信息

execsnoop 监控短时进程

根据工具查性能指标(CPU 相关)

性能工具CPU 性能指标uptime5、10、15 分钟内的平均负载展示top平均负载、运行队列、CPU 各项使用率、进程状态和 CPU 使用率htoptop 增强版,以不同颜色区分不同类型进程,展示更直观atopCPU、内存、磁盘、网络资源全访问监控,十分齐全vmstat系统整体 CPU 使用率、上下文切换次数、中断次数,还包括处于运行(r)和不可中断状态(b)的进程数量pidstat进程、线程(-t)的每个 CPU 占用信息,中断上下文切换次数/proc/softirqs展示每个 CPU 上的软中断类型及次数/proc/inerrupts展示每个 CPU 上的硬中断类型及次数ps每个进程的状态和 CPU 使用率pstree进程的父子关系展示dstat系统整体 CPU 使用率(以及相关 IO、网络信息)sar系统整体 CPU 使用率,以及使用率历史信息strace跟踪进程的系统调用perfCPU 性能事件分析,例如:函数调用链、CPU 缓存命中率、CPU 调度等execsnoop短时进程分析

CPU 问题排查方向

有了以上性能工具,在实际遇到问题时我们并不可能全部性能工具跑一遍,这样效率也太低了,所以这里可以先运行几个常用的工具 top、vmstat、pidstat 分析系统大概的运行情况然后在具体定位原因。

top 系统CPU => vmstat 上下文切换次数 => pidstat 非自愿上下文切换次数 => 各类进程分析工具(perf strace ps execsnoop pstack)

top 用户CPU => pidstat 用户CPU => 一般是CPU计算型任务

top 僵尸进程 =>  各类进程分析工具(perf strace ps execsnoop pstack)

top 平均负载 => vmstat 运行状态进程数 =>  pidstat 用户CPU => 各类进程分析工具(perf strace ps execsnoop pstack)

top 等待IO CPU => vmstat 不可中断状态进程数  => IO分析工具(dstat、sar -d)

top 硬中断 => vmstat 中断次数 => 查看具体中断类型(/proc/interrupts)

top 软中断 => 查看具体中断类型(/proc/softirqs) => 网络分析工具(sar -n、tcpdump) 或者 SCHED(pidstat 非自愿上下文切换)

CPU 问题优化方向

性能优化往往是多方面的,CPU、内存、网络等都是有关联的,这里暂且给出 CPU 优化的思路,以供参考。

程序优化

基本优化:程序逻辑的优化比如减少循环次数、减少内存分配,减少递归等等。

编译器优化:开启编译器优化选项例如gcc -O2对程序代码优化。

算法优化:降低苏研发复杂度,例如使用nlogn的排序算法,使用logn的查找算法等。

异步处理:例如把轮询改为通知方式

多线程代替多进程:某些场景下多线程可以代替多进程,因为上下文切换成本较低

缓存:包括多级缓存的使用(略)加快数据访问

系统优化

CPU 绑定:绑定到一个或多个 CPU 上,可以提高 CPU 缓存命中率,减少跨 CPU 调度带来的上下文切换问题

CPU 独占:跟 CPU 绑定类似,进一步将 CPU 分组,并通过 CPU 亲和性机制为其分配进程。

优先级调整:使用 nice 调整进程的优先级,适当降低非核心应用的优先级,增高核心应用的优先级,可以确保核心应用得到优先处理。

为进程设置资源限制:使用 Linux cgroups 来设置进程的 CPU 使用上限,可以防止由于某个应用自身的问题,而耗尽系统资源。

NUMA 优化:支持 NUMA 的处理器会被划分为多个 Node,每个 Node 有本地的内存空间,这样 CPU 可以直接访问本地空间内存。

中断负载均衡:无论是软中断还是硬中断,它们的中断处理程序都可能会耗费大量的 CPU。开启 irqbalance 服务或者配置 smp_affinity,就可以把中断处理过程自动负载均衡到多个 CPU 上。

参考

极客时间:Linux 性能优化实战

更多干货尽在腾讯技术,官方微信/QQ交流群已建立,交流讨论可加:Journeylife1900、711094866(备注腾讯技术) 。

推荐阅读

Linux CPU性能优化方法

在Linux系统中,由于成本的限制,往往会存在资源上的不足,例如 CPU、内存、网络、IO 性能。本文,就对 Linux 进程和 CPU 的原理进行分析,总结出 CPU 性能优化的方法。 1. 分析手段 在理解…

point...发表于linux...

Linux性能优化-CPU性能优化思路

linux发表于linux...

Linux性能优化-CPU性能优化思路

关于这个,我觉得这篇文章写得很详细,转载记录一下: CPU性能指标CPU使用率 1.CPU使用率描述了非空闲时间占总CPU时间的百分比,根据CPU上运行任务的不同,又被分为用户CPU,系统CPU,等待I…

FreeR...发表于Linux...

Linux性能优化之CPU优化

Linux 的性能进行监测,以下是 VPSee 常用的工具: 工具 简单介绍 top 查看进程活动状态以及一些系统状况 vmstat 查看系统状态、硬件和系统信息等 iostat 查看CPU 负载,硬盘状况 sar 综合…

linux...发表于linux...

Supongo que te gusta

Origin blog.csdn.net/star1210644725/article/details/129483962
Recomendado
Clasificación