Como encontrar o(s) processo(s) que estão monopolizando a máquina

Como encontrar o(s) processo(s) que estão monopolizando a máquina

Cenário: De repente, meu computador parece lento. O mouse se move, mas as janelas demoram muito para abrir, etc. uptimediz que a carga é 7,69 e está aumentando.

Qual é a maneira mais rápida de descobrir quais processos são a causa da carga?

Agora, ferramentas "top" e similares não são a resposta porque mostram o uso de CPU ou memória, mas não ambos ao mesmo tempo. O que eu preciso é de um único comando que eu possa digitar no momento em que isso acontece - algo que irá descobrir qualquer um dos

O sistema está tentando trocar 8 GB de RAM para o disco porque o processo X...

ou

o processo X procura por todo o disco

ou

o processo X usa 400% da CPU"

Então, o que estou procurando é que iostat, htop/atop e ferramentas semelhantes sejam executadas em uma com uma saída como esta:

 1235 cp - Disk trashing
   87 chrome - Uses 2 GB of RAM
  137 nfs_bench - Uses 95% of the network bandwidth

Não quero uma ferramenta que me forneça alguns números que eu possa analisar, mas uma ferramenta que me diga exatamente qual processo causa a carga atual. Suponha que o usuário na frente do teclado mal saiba escrever “processo”, mas o usuário fica rapidamente sobrecarregado quando se trata de “tamanho residente”, “memória virtual” ou “ciclo de vida do processo”.

Meu argumento é o seguinte: um usuário percebe um problema. Pode haver milhares de razões... bem, quase :-) O usuário quer saber a origem do problema.

As soluções atuais me dão muitos números e preciso saber o que esses números significam. O que procuro é uma metaferramenta. 99% dos dados são irrelevantes para o problema. Então o que a ferramenta deve fazer é procurar processos que consomem algum recurso e listar apenas aqueles junto com "esse processo precisa de muita CPU, isso produz muitos IRQs, esse processo aloca muita RAM (e ainda está crescendo)".

Esta será uma lista relativamente curta. Será muito mais simples para alguém novo nisso localizar o culpado nesta lista do que na saída de, digamos, htopo que me dá cerca de 5.000 números, mas exige que eu mesmo dobre processos multithread (tenho 50 linhas que dizem, VIRT 2750Mmas apenas 16 GB de RAM - a máquina deveria trocar até a morte, mas é claro, isso é uma interpretação errada dos dados que pode acontecer rapidamente).

Responder1

Eu tenho que sorrir com as respostas porque cada uma disse para você executar a ferramenta X. O único problema é que se o que você está vendo for intermitente, não haverá como correlacionar nada. Uma ferramenta comosarpode ajudar se você executá-lo em uma frequência alta o suficiente, mas eu diriacoletaré ainda melhor.

Comosar, você o executa como um daemon instalando o RPM e executando /etc/init.d/collectl start.

Agora, quando você notar algo lento, collectl -p /var/log/collectl/filename --topreproduzirá os dados e mostrará os principais processos. Você também poderia simplesmente correr collectl --tope vê-los em tempo real. Aliás, tudo o que você pode fazer em tempo real também pode ser reproduzido.

Quanto à carga da CPU, e se você ESTIVER sobrecarregado com interrupções? collectl -sCnão apenas mostrará as cargas em CPUs individuais (ou o uso -scpara carga média), mas também mostrará como eles estão gastando seu tempo. Inclua -j( -scj) e você verá o número de interrupções/CPU. Use letras maiúsculas -Je você verá os TIPOS de cada interrupção/CPU.

Claro, se você realmente gosta de vmstat, você sempre pode reproduzir dados coletados --vmstate ele mostrará dados históricos no formato vmstat.

Existem muito mais opções do que tenho tempo de listar, mas você pode conferir emFonteForgeou apenas pesquise no Google.

Responder2

"top" funciona razoavelmente bem, desde que você observe os números certos. Vamos ver:

top - 13:11:45 up 13 days,  1:13, 21 users,  load average: 0.06, 0.11, 0.26
Tasks: 271 total,   2 running, 267 sleeping,   0 stopped,   2 zombie
Cpu(s): 19.0%us,  6.3%sy,  0.0%ni, 74.0%id,  0.5%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   8183668k total,  8002712k used,   180956k free,    12476k buffers
Swap: 11847900k total,   723480k used, 11124420k free,   767016k cached

Agora, se o sistema estiver lento porque a CPU está toda ocupada, ele mostra as colunas "us" e "sy" na linha "Cpu(s):" estando próximas de 100% juntas.

Se estiver lento devido à troca, "Mem:" "free" mostra valores muito baixos e "Swap:" "usado" valores altos.

Se for lento devido aE/Sem geral, "Cpu(s):" "wa" informa que o tempo é gasto na espera de E/S.

Agora, se você sabe que as esperas de E/S são o problema, você pode usar os programas "iotop" para saber quais processos criam mais E/S.

Responder3

Com base no uso de 400%, presumo que você tenha um processador quad-core. Sua média de carga é quase o dobro da capacidade e metade dos processos estão aguardando CPU.

Primeiro, renicecoloque seu shell em 0 ou -10 para obter um sistema mais responsivo e, em seguida, use-o htoppara encontrar o(s) processo(s) ofensivo(s) e siga-o straceem um determinado processo. Outras ferramentas que podem ser úteis são:

  • vmsat
  • sar
  • iostat
  • pmap

Responder4

vmstat pode ajudá-lo em termos gerais. Um exemplo de uso é:

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 1  0      0 977908 426184 1543884    0    0    38    45  106  385  4  1 95  1

Você também pode executá-lo a cada X segundos - basta adicionar o número X após o comando.

Editar: Em vista do comentário... Escreva o seguinte em um arquivo e torne esse arquivo executável. Ele informará os 3 principais processos da máquina.

top -n 1 | tail -16 | head -4 | awk '{print $13}'

Se você quiser saber qual memória está consumindo em oposição à CPU, leia a página de manual superior e altere a ordem de exibição.

informação relacionada