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 + H
Mostrar subprocesos de Java; Shift + M
ordenar por uso de memoria; ordenar por Shift + P
tiempo de uso de CPU (tasa de uso); ordenar por Shift + T
tiempo 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 zombie
nú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 3
puede 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 %iowait
y %idle
:
-
Si
%iowait
el valor es demasiado alto, indica que el disco duro tiene un cuello de botella de E / S; -
Si
%idle
el 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
%idle
el 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-demo
Es 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
....
top
Encuentre 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 TIME
columna, puede ver que el hilo consume más CUP. Según la LWP
columna, 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' 98345
comando 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á en
demo.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.
- 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.
- Cambio de contexto
Para problemas de contexto frecuentes, podemos usar el comando vmstat para ver
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.