Ubicación del problema en línea ------ Cuello de botella de la CPU

las excepciones de cpu suelen estar mejor ubicadas. Las razones incluyen problemas de lógica empresarial (bucle sin fin), gc frecuente y cambios de contexto excesivos. Y lo más común suele ser causado por la lógica empresarial (o lógica de marco).

Ver el número de núcleos de CPU de la máquina

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

Ver información de la CPU (modelo)

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
     32  Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz

Ver la cantidad de CPU físicas

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
16

Ver la cantidad de núcleos en cada CPU física (es decir, la cantidad de núcleos)

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores       : 2

Ver la cantidad de CPU lógicas

[1014154@cc69dd4c5-4tdb5 ~]$ cat /proc/cpuinfo| grep "processor"| wc -l
32
  • Utilice jstack para analizar los problemas de la CPU 

cima

En el sistema operativo del kernel de Linux, el proceso se programa dinámicamente en función del tiempo de ejecución virtual (calculado dinámicamente por la prioridad del proceso, valor agradable más el tiempo real de CPU ocupado). Al ejecutar un proceso, es necesario cambiar del modo de usuario al modo de kernel, y el espacio de usuario no puede manipular directamente las funciones del espacio del kernel. Las llamadas al sistema se utilizan generalmente para completar la programación del proceso, y la conversión del espacio del usuario al espacio del kernel se realiza generalmente mediante interrupciones suaves. Por ejemplo, para realizar operaciones de disco, el modo de usuario necesita llamar a las instrucciones de operación del disco del kernel a través del sistema, por lo que el tiempo consumido por la CPU se divide en el consumo de CPU del modo de usuario, el consumo de CPU del sistema (kernel) y el consumo de CPU de operación del disco. . Al ejecutar un proceso, debe pasar por una serie de operaciones. El proceso se ejecuta primero en modo de usuario, y la prioridad del proceso se ajustará (agradable) durante el proceso de ejecución. El sistema llama al kernel y luego a través del llamada del kernel, interrupción dura, interrupción suave, deje que el hardware realice la tarea. Una vez completada la ejecución, vuelve del modo kernel a la llamada al sistema y, finalmente, la llamada al sistema devuelve el resultado al proceso en el modo usuario.

La parte superior puede ver el consumo total de CPU, incluido el consumo de subelementos, como Usuario, Sistema, Inactivo, Agradable, etc. Shift + HMostrar subprocesos de Java; Shift + Mordenar por uso de memoria; ordenar por Shift + Ptiempo de uso de CPU (tasa de uso); ordenar por Shift + Ttiempo de uso acumulativo de CPU ; CPU de múltiples núcleos, ingresar a la vista superior 1, puede ver la carga de cada CPU.

top - 15:24:11 up 8 days,  7:52,  1 user,  load average: 5.73, 6.85, 7.33
Tasks:  17 total,   1 running,  16 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.9 us,  9.2 sy,  0.0 ni, 76.1 id,  0.1 wa,  0.0 hi,  0.1 si,  0.7 st
KiB Mem : 11962365+total, 50086832 free, 38312808 used, 31224016 buff/cache
KiB Swap:        0 total,        0 free,        0 used. 75402760 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
   300 ymmapp    20   0 17.242g 1.234g  14732 S   2.3  1.1   9:40.38 java
     1 root      20   0   15376   1988   1392 S   0.0  0.0   0:00.06 sh
    11 root      20   0  120660  11416   1132 S   0.0  0.0   0:04.94 python
    54 root      20   0   85328   2240   1652 S   0.0  0.0   0:00.00 su
    55 ymmapp    20   0   17432   1808   1232 S   0.0  0.0   0:00.00 bash
    56 ymmapp    20   0   17556   2156   1460 S   0.0  0.0   0:00.03 control.sh
    57 ymmapp    20   0   11880    740    576 S   0.0  0.0   0:00.00 tee
   115 ymmapp    20   0   17556   2112   1464 S   0.0  0.0   0:00.02 control_new_war
   133 root      20   0  106032   4240   3160 S   0.0  0.0   0:00.03 sshd
   134 ymmapp    20   0   17080   6872   3180 S   0.0  0.0   0:01.82 ops-updater
   147 ymmapp    20   0   17956   2636   1544 S   0.0  0.0   0:00.07 control.sh
  6538 ymmapp    20   0  115656  10532   3408 S   0.0  0.0   0:00.46 beidou-agent
  6785 ymmapp    20   0 2572996  22512   2788 S   0.0  0.0   0:03.44 gatherinfo4dock
 29241 root      20   0  142148   5712   4340 S   0.0  0.0   0:00.04 sshd
 29243 1014154   20   0  142148   2296    924 S   0.0  0.0   0:00.00 sshd
 29244 1014154   20   0   15208   2020   1640 S   0.0  0.0   0:00.00 bash
 32641 1014154   20   0   57364   2020   1480 R   0.0  0.0   0:00.00 top

La primera línea: 15:24:11 up 8 days, 7:52, 1 user, load average: 5.73, 6.85, 7.33: 15: 24: 11 hora del sistema, hasta 8 días de tiempo de ejecución, 1 usuario actualmente conectado a usuarios, condiciones de equilibrio de carga promedio de carga, que representan respectivamente condiciones de carga de 1 minuto, 5 minutos y 15 minutos.

La segunda línea: El Tasks: 17 total, 1 running, 16 sleeping, 0 stopped, 0 zombienúmero total de procesos es 17, el número en ejecución es 1, el sueño es 16, la parada es 0 y el proceso zombie es 0.

Tercera fila: %Cpu(s): 13.9 us, 9.2 sy, 0.0 ni, 76.1 id, 0.1 wa, 0.0 hi, 0.1 si, 0.7 st: espacio de usuario de la CPU que representan el 13,9%  , lo que representa un 9,2 por ciento del espacio de la CPU de núcleo, cambiado la prioridad del proceso de la CPU que representa el 0%, inactividad de la CPU que representa el 76,1  , IO espera representó el 0,1% de la CPU  , el hardware de interrupción 0% de CPU está ocupado por CPU, 0.1% de CPU está ocupado por interrupción suave y 0.7% del reloj de CPU en la VM actual es robado por virtualización.

Las líneas cuarta y quinta representan el uso de la memoria y el área de intercambio.

La séptima línea indica:

  • PID: Identificacion de proceso

  • USER: Dueño del proceso

  • PR: Proceso prioritario

  • NI: buen valor. El valor negativo indica alta prioridad, el valor positivo indica baja prioridad

  • VIRT: Memoria virtual, la cantidad total de memoria virtual utilizada por el proceso, en kb. VIRT = SWAP + RES

  • RES: Memoria permanente, el tamaño de la memoria física utilizada por el proceso que no se ha intercambiado, en kb. RES = CÓDIGO + DATOS

  • SHR: Memoria compartida, tamaño de memoria compartida, unidad kb

  • S: Estado del proceso. D = estado de suspensión ininterrumpida R = funcionando S = durmiendo T = rastreando / deteniendo Z = proceso zombie

  • %CPU: Porcentaje de tiempo de CPU desde la última actualización hasta el presente

  • %MEM: Porcentaje de memoria física utilizada por el proceso.

  • TIME+: El tiempo total de CPU utilizado por el proceso, en 1/100 de segundo

  • COMMAND: Nombre del proceso (nombre del comando / línea de comando)

Calcule la cantidad de tareas de suspensión ininterrumpidas en la carga de la CPU

top -b -n 1 | awk '{if (NR <= 7) print; else if ($ 8 == "D") 

{print;count++}}END{print "Total status D:"count}'
[root@localhost ~]# top -b -n 1 | awk '{if (NR<=7)print;else if($8=="D"){print;count++}}END{print "Total status D:"count}'
top - 15:35:05 up 1 day, 26 min,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.5 us, 10.0 sy,  0.0 ni, 87.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1421760 total,   104516 free,   777344 used,   539900 buff/cache
KiB Swap:  2097148 total,  2071152 free,    25996 used.   456028 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
Total status D:

sar

A través de sar -u 3puede ver el consumo total de CUP:

[root@localhost ~]# sar -u 3
Linux 3.10.0-1062.el7.x86_64 (localhost.localdomain)    2020年05月01日  _x86_64_        (2 CPU)

15时18分03秒     CPU     %user     %nice   %system   %iowait    %steal     %idle
15时18分06秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15时18分09秒     all      0.00      0.00      0.17      0.00      0.00     99.83
15时18分12秒     all      0.17      0.00      0.17      0.00      0.00     99.66
15时18分15秒     all      0.00      0.00      0.00      0.00      0.00    100.00
15时18分18秒     all      0.00      0.00      0.00      0.00      0.00    100.00
  • %user: Uso de CPU en el espacio de usuario.

  • %nice: La tasa de uso de CPU del proceso cuya prioridad se ha cambiado.

  • %system: Uso de CPU en el espacio del kernel.

  • %iowait: El porcentaje de CPU en espera de E / S.

  • %steal: CPU utilizada por la CPU de la máquina virtual de la máquina virtual.

  • %idle: CPU inactiva.

En la pantalla anterior, vea principalmente %iowaity %idle:

  • Si  %iowaitel valor es demasiado alto, indica que el disco duro tiene un cuello de botella de E / S;

  • Si  %idleel valor es alto pero el sistema responde lentamente, es posible que la CPU esté esperando para asignar memoria, en este momento se debe aumentar la capacidad de memoria;

  • Si  %idleel valor es continuamente inferior a 10, la capacidad de procesamiento de la CPU del sistema es relativamente baja, lo que indica que el recurso más necesario en el sistema es la CPU;

Busque el subproceso que más CPU consuma en la línea

Listo para trabajar

Inicie un programa. arthas-demoEs un programa simple que genera un número aleatorio cada segundo, luego realiza la descomposición de factores primos e imprime el resultado de la descomposición.

curl -O https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
[root@localhost ~]# curl -O https://alibaba.github.io/arthas/arthas-demo.jar
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  3743  100  3743    0     0   3022      0  0:00:01  0:00:01 --:--:--  3023
[root@localhost ~]# java -jar arthas-demo.jar
1813=7*7*37
illegalArgumentCount:  1, number is: -180005, need >= 2
illegalArgumentCount:  2, number is: -111175, need >= 2
18505=5*3701
166691=7*23813
105787=11*59*163
60148=2*2*11*1367
196983=3*3*43*509
illegalArgumentCount:  3, number is: -173479, need >= 2
illegalArgumentCount:  4, number is: -112840, need >= 2
39502=2*19751
....

topEncuentre el proceso más lento por comando

[root@localhost ~]# top
top - 11:11:05 up 20:02,  3 users,  load average: 0.09, 0.07, 0.05
Tasks: 225 total,   1 running, 224 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.7 sy,  0.0 ni, 99.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1421760 total,   135868 free,   758508 used,   527384 buff/cache
KiB Swap:  2097148 total,  2070640 free,    26508 used.   475852 avail Mem
Change delay from 3.0 to
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 98344 root      20   0 2422552  23508  12108 S   0.7  1.7   0:00.32 java
     1 root      20   0  194100   6244   3184 S   0.0  0.4   0:20.41 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.12 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     6 root      20   0       0      0      0 S   0.0  0.0   0:20.25 ksoftirqd/0

El número de proceso encontrado es 98344.

Encuentre el subproceso que consume más CPU en el proceso

Puede usar ps -Lfp pid cu o ps -mp pid -o THREAD, tid, time o top -Hp pid. Usaré el primero aquí para ver el orden de consumo de CPU de los subprocesos en un determinado proceso:

[root@localhost ~]# ps -Lp 98344 cu
USER        PID    LWP %CPU NLWP %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      98344  98344  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 java
root      98344  98345  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:04 java
root      98344  98346  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:01 VM Thread
root      98344  98347  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Reference Handl
root      98344  98348  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Finalizer
root      98344  98349  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Signal Dispatch
root      98344  98350  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:05 C2 CompilerThre
root      98344  98351  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 C1 CompilerThre
root      98344  98352  0.0   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:00 Service Thread
root      98344  98353  0.1   10  4.1 2422552 59060 pts/0   Sl+  11:09   0:19 VM Periodic Tas

Al mirar la TIMEcolumna, puede ver que el hilo consume más CUP. Según la LWPcolumna, puede ver el número de identificación del hilo, pero debe convertirse a hexadecimal para consultar la información de la pila de hilos.

Obtener el código hexadecimal de la identificación del hilo

Use el printf '%x\n' 98345comando para hacer la conversión:

[root@localhost ~]# printf '%x\n' 98345
18029

Ver información de la pila de subprocesos

Utilice jstack para obtener información de la pila jstack 98344 | grep -A 10 18029:

[root@localhost ~]# jstack 98344 | grep -A 10 18029
"main" #1 prio=5 os_prio=0 tid=0x00007fb88404b800 nid=0x18029 waiting on condition [0x00007fb88caab000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
        at java.lang.Thread.sleep(Native Method)
        at java.lang.Thread.sleep(Thread.java:340)
        at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
        at demo.MathGame.main(MathGame.java:17)

"VM Thread" os_prio=0 tid=0x00007fb8840f2800 nid=0x1802a runnable

"VM Periodic Task Thread" os_prio=0 tid=0x00007fb884154000 nid=0x18031 waiting on condition

A través del comando, podemos ver que el código correspondiente que consume mucho tiempo de este hilo está endemo.MathGame.main(MathGame.java:17)

Por supuesto, es más común que analicemos todo el archivo jstack. Por lo general, prestaremos más atención a las partes WAITING y TIMED_WAITING, y no hace falta decir BLOCKED. Podemos usar el comando cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c para tener una idea general del estado de jstack. Si hay demasiados EN ESPERA y similares, entonces la mayoría de ellos son El problema es.

imagen

  • GC frecuente

Por supuesto, todavía usaremos jstack para analizar el problema, pero a veces podemos determinar primero si el gc es demasiado frecuente y usar el comando jstat -gc pid 1000 para observar los cambios en la generación gc. 1000 representa el intervalo de muestreo ( ms), S0C / S1C, S0U / S1U, EC / EU, OC / OU, MC / MU representan la capacidad y el uso de las dos áreas Survivor, el área Eden, la vejez y el área de metadatos, respectivamente. YGC / YGT, FGC / FGCT y GCT representan el tiempo y la frecuencia de YoungGc y FullGc y el tiempo total. Si ve que gc es más frecuente, haga un análisis más detallado de gc. Para obtener más detalles, consulte la descripción del capítulo de gc.

imagen

 

  • Cambio de contexto

Para problemas de contexto frecuentes, podemos usar el comando vmstat para ver

imagen

La columna cs (cambio de contexto) representa el número de cambios de contexto.

Si queremos monitorear un pid específico, entonces podemos usar el comando pidstat -w pid, cswch y nvcswch indican conmutación voluntaria e involuntaria.

imagen

 

Supongo que te gusta

Origin blog.csdn.net/weixin_42073629/article/details/115269994
Recomendado
Clasificación