1 Métodos de análise de carga comumente usados
Alta CPU, alta carga
-
Use
top
o comando para encontrar o PID do processo com maior uso de CPU; -
Encontrando
top -Hp PID
o TID do thread que ocupa a CPU mais alta; -
Para
java
programas, usejstack
informações da pilha de threads de impressão; -
Imprimindo
printf %x tid
o hexadecimal do thread que mais consome CPU;
CPU baixa, carga alta
O motivo pode ser resumido em uma frase: há muitos processos aguardando a conclusão da E/S do disco, resultando em um comprimento excessivamente grande da fila de processos, mas há muito poucos processos em execução na CPU, o que reflete carga excessiva e baixo Utilização do CPU.
-
top
Verifique o tempo de espera da UCP através de comandos, ou seja%wa
; -
Verificando
iostat -d -x -m 1 10
o status IO do disco; (comando de instalaçãoyum install -y sysstat
) -
Verificando
sar -n DEV 1 10
a situação de IO da rede; -
Use o seguinte comando para localizar programas que ocupam IO;
ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
2 Análise de situações de alta CPU e alta carga
-
Use
vmstat
para visualizar a carga da CPU na latitude do sistema; -
Use para
top
visualizar a carga da CPU na latitude do processo;
2.1 Use vmstat para visualizar a carga da CPU da latitude do sistema
Você pode usar vmstat para visualizar o uso de recursos de CPU na dimensão do sistema.
Formato: vmstat -n 1 -n 1
indica que os resultados são atualizados uma vez por segundo
[root@VM-1-14-centos ~]# vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 250304 163472 2154300 0 0 1 16 0 4 1 0 98 0 0
0 0 0 250412 163472 2154332 0 0 0 0 937 1439 1 1 99 0 0
0 0 0 250428 163472 2154332 0 0 0 4 980 1329 0 0 100 0 0
0 0 0 250444 163472 2154332 0 0 0 0 854 1227 0 0 99 0 0
0 0 0 250444 163472 2154332 0 0 0 68 832 1284 0 1 99 1 0
0 0 0 250016 163472 2154332 0 0 0 0 929 1389 1 1 99 0 0
Descrição das principais colunas de dados nos resultados retornados:
-
r : Indica os threads aguardando para serem processados pela CPU no sistema. Como a CPU só pode lidar com um thread por vez, um número maior geralmente significa um sistema mais lento.
-
b : Indica um processo bloqueado. Não vou falar muito sobre isso. Todo mundo sabe que o processo está bloqueado.
-
us : Tempo de CPU do usuário. Certa vez, eu estava em um servidor que executava criptografia e descriptografia com frequência. Pude ver que us estava perto de 100 e a fila de execução atingiu 80 (a máquina estava fazendo testes de estresse e seu desempenho era ruim).
-
sy : Tempo de CPU do sistema, se for muito alto, significa que o tempo de chamada do sistema é longo, como operações IO frequentes.
-
wa : Porcentagem de tempo de CPU consumido pela espera de IO. Quando o valor é alto, indica que a espera de IO é grave, o que pode ser causado por um grande número de acessos aleatórios no disco ou pode ser um gargalo no desempenho do disco.
-
id : a porcentagem de tempo de CPU ociosa. Se o valor for continuamente 0 e sy for o dobro de nós, geralmente significa que o sistema está enfrentando falta de recursos de CPU.
Perguntas frequentes e soluções:
-
Se r costuma ser maior que 4 e id costuma ser menor que 40, isso significa que a CPU está muito carregada.
-
Se pi e po não forem iguais a 0 por muito tempo, significa memória insuficiente.
-
Se o disco geralmente não for igual a 0 e a fila em b for maior que 3, isso indica um desempenho de E/S ruim.
2.2 Use top para visualizar a carga da CPU das dimensões do processo
Você pode usar top para visualizar o uso de CPU, memória e outros recursos a partir da latitude do processo.
top - 19:49:59 up 36 days, 23:15, 3 users, load average: 0.11, 0.04, 0.05
Tasks: 133 total, 1 running, 131 sleeping, 0 stopped, 1 zombie
%Cpu(s): 3.1 us, 3.1 sy, 0.0 ni, 93.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3880188 total, 241648 free, 1320424 used, 2318116 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 2209356 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1793 mysql 20 0 1608796 236708 9840 S 6.7 6.1 83:36.23 /usr/sbin/mysqld
1 root 20 0 125636 3920 2444 S 0.0 0.1 4:34.13 /usr/lib/systemd/systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.90 [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:15.46 [ksoftirqd/0]
7 root rt 0 0 0 0 S 0.0 0.0 0:12.02 [migration/0]
A terceira linha na interface padrão exibirá o uso geral atual dos recursos da CPU e o uso de recursos de cada processo será exibido abaixo.
Você pode inserir diretamente as letras P superior e inferior na interface para classificar os resultados do monitoramento na ordem inversa do uso da CPU, localizando assim o processo que ocupa uma CPU maior no sistema. Por fim, solucione e analise ainda mais o processo correspondente com base no log do sistema e nos logs relacionados do próprio programa para determinar o motivo do uso excessivo da CPU.
3. Baixa CPU, alta carga
Descrição do Problema
Não há nenhum programa de negócios rodando no sistema Linux, observado por cima, conforme mostrado na figura abaixo, a CPU está muito ociosa, mas a média de carga é muito alta:
analise de problemas
CPU baixa e carga alta significam que há muitos processos aguardando a conclusão da E/S do disco, o que fará com que o comprimento da fila seja muito grande, o que reflete que a carga é muito grande, mas na verdade, a CPU está alocada para realizar outras tarefas neste momento ou Ocioso, os cenários específicos são os seguintes:
Cenário 1: muitas solicitações de leitura e gravação de disco levarão a muita espera de E/S
Como mencionado acima, a eficiência de funcionamento da CPU é maior que a do disco, e o processo em execução na CPU precisa acessar o arquivo do disco.Neste momento, a CPU iniciará uma solicitação ao kernel para chamar o arquivo, e deixe o kernel ir para o disco para buscar o arquivo. Neste momento, ele mudará para outros processos. Ou ocioso, a tarefa fará a transição para um estado de suspensão ininterrupto. Quando houver muitas solicitações de leitura e gravação, haverá muitos processos em estado de suspensão ininterrupto, resultando em alta carga e baixa CPU.
Cenário 2: Existem instruções sem índices ou deadlocks no MySQL
Todos nós sabemos que os dados do MySQL são armazenados no disco rígido. Se você precisar realizar consultas SQL, primeiro precisará carregar os dados do disco para a memória. Quando os dados são particularmente grandes, se a instrução SQL executada não tiver um índice, isso fará com que o número de linhas na tabela de varredura seja muito grande, causando bloqueio de E/S, ou haverá um impasse na instrução, o que também causará bloqueio de E/S, fazendo com que muitos processos de suspensão não possam ser interrompidos, resultando em carga excessiva. A solução específica pode ser executar o comando show full processlist no MySQL para verificar o status de espera do thread e retirar as instruções para otimização.
Cenário 3: O disco rígido externo está com defeito, geralmente o NFS está desligado, mas o servidor NFS está com defeito
Por exemplo, se nosso sistema montar um disco rígido externo, como armazenamento compartilhado NFS, muitas vezes haverá um grande número de solicitações de leitura e gravação para acessar arquivos armazenados no NFS. Se o servidor NFS falhar neste momento, o processo não será capaz de obter recursos para solicitações de leitura e gravação. Como resultado, o processo ficou em um estado ininterrupto, resultando em uma carga elevada.
Solução
-
A média de carga é uma avaliação da carga da CPU, quanto maior o valor, maior será a fila de tarefas e mais tarefas aguardando para serem executadas.
-
Quando isso acontece, pode ser devido a um processo morto. Você pode usar o comando ps -axjf para verificar se existe um processo de estado D.
-
O estado D refere-se a um estado de sono ininterrupto. Os processos neste estado não podem ser eliminados, nem podem sair por si próprios. Só pode ser resolvido restaurando os recursos dos quais depende ou reiniciando o sistema.
Os processos que aguardam E/S estão no estado de suspensão ininterrupta ou D; ao fornecer essas informações, podemos simplesmente encontrar o processo no estado de espera.
ps -e -L h o state,cmd | awk '{if($1=="R"||$1=="D"){print $0}}' | sort | uniq -c | sort -k 1nr
Autor: Honest1y
Fonte: https://juejin.cn/post/7016127914454286367