detectar processo consumindo CPU sem: top, htop, ps?

detectar processo consumindo CPU sem: top, htop, ps?

Passei por um problema em que só conseguia adivinhar qual processo estava consumindo a CPU.

Meu uso de CPU foi de cerca de 80% para todos os núcleos do psensor.

Eu tentei htop, tope ps -A -o pcpu,pid,cmd --sort +pcpu(o último até tentei com sudo sem sucesso).
Tudo isso mostrou o pid culpado (que eu conhecia) usando apenas cerca de 7%...

Quando eu SIGKILL naquele pid, tudo volta ao normal.

Para testar, fiz um loop infinito no terminal while true;do echo -n;donemas que pude ver claramente no htop; então meu palpite é que o que estava causando problemas não era parecido com isso...

Então eu me pergunto se há outras maneiras pelas quais eu poderia ter encontrado o culpado sem ter que adivinhar.

Pensando novamente, acho que gostaria de saber quais cálculos psensore "miniaplicativo indicador de carga do sistema" usam que foram capazes de mostrar esse valor, mas os outros não conseguiram.

PS.:linkando sobre o tempo de espera, vinculando sobre média de carga

Responder1

Não estou familiarizado o suficiente com os detalhes para dar dicas precisas, mas acho que há duas fontes de diferenças entre a carga real causada e o uso mostrado da CPU:

  1. O processo pode consistir em vários threads e toppode não resumi-los. Você pode ver o número de threads assim:

    ps -eo pid,nlwp,%cpu,user,args
    

    Você toppode alternar o manuseio do thread com H. O uso da CPU de cada thread geralmente é bastante baixo.

  2. O processo pode causar muita E/S. O tempo de espera de E/S faz parte da carga geral da CPU, mas pode não fazer parte do valor de uso da CPU de um processo. Então verifique o waitvalor em top. Não lhe diz quais os processos que o causam e em que medida, mas se o valor for baixo, não pode explicar o efeito.

Responder2

O código executado em um sistema Unix é classificado como código do kernel ou código do usuário. O código de terreno do usuário está sempre anexado a um processo, portanto, se a CPU estiver ocupada executando o código de terreno do usuário, ele será exibido em alguma linha do arquivo top. O código do kernel normalmente é anexado a um processo: se o kernel estiver executando uma chamada de sistema, o processamento no kernel será considerado pertencente a esse processo. A hora do kernel é a “hora do sistema” relatada pelo timeutilitário.

Algumas das coisas que o kernel faz não podem ser diretamente contabilizadas em um processo. Em particular, as interrupções de hardware não pertencem intrinsecamente a um processo específico. Por exemplo, suponha que uma interrupção seja acionada pela placa de rede. O kernel executa código para ler e analisar o pacote de rede; até agora nenhum processo está envolvido. O pacote pode ser rejeitado por meio de uma regra de firewall e, nesse caso, nenhum processo pode reivindicar esse tempo de processamento. Se um processo acabar recebendo aquele pacote, parte do tempo de recepção será colocado na aba desse processo, mas não os estágios iniciais.

Portanto é possível ter tempo de CPU que não pertence a nenhum processo. No entanto, às vezes esse tempo de CPU é causado indiretamente por algum processo. Por exemplo, se houver um processo que envia pacotes para outra máquina e faz com que essa outra máquina responda, mas o firewall bloqueia os pacotes de resposta, então o tempo gasto na análise e no descarte dos pacotes de resposta não será atribuído a esse processo de envio; mas se o processo de envio parar, o que faz com que a máquina remota pare de responder, o kernel não perderá mais tempo rejeitando os pacotes. É claro que a rede é apenas um exemplo, existem muitas outras maneiras de o kernel fazer coisas que não podem ser atribuídas diretamente a um processo.

Você não forneceu informações suficientes para ter certeza de que é isso que está acontecendo (e pode ser difícil descobrir sem um depurador de kernel), mas esta é uma explicação plausível.

Responder3

Se não quiser usar htop,ps,top, você pode usar systemtap, para mais detalhes de baixo nível

informação relacionada