Como posso medir o uso separado do núcleo da CPU para um processo?

114

Existe alguma maneira de medir o uso de CPU de um processo específico por núcleos?

Eu sei que o top é bom para medir o uso da CPU de todo o sistema por núcleos e o conjunto de tarefas pode fornecer informações sobre qual núcleo da CPU tem permissão para a execução do processo.

Mas como posso medir o uso de CPU de um processo específico por núcleos de CPU?

Elang
fonte

Respostas:

139

Você ainda pode fazer isso no topo . Enquanto o top está em execução, pressione '1' no teclado, ele mostrará o uso da CPU por núcleo.

Limite os processos mostrados fazendo com que esse processo específico seja executado sob uma conta de usuário específica e use o Tipo 'u' para limitar a esse usuário

abdolar
fonte
3
Você também pode pressionar Ipara alternar o modo Irix (em oposição ao modo Solaris ). Quando on, a porcentagem exibida na lista de processos é relativa a um thread da CPU . Quando off, a referida porcentagem é exibida em relação à capacidade geral da CPU (ou seja, TODOS os threads - também conhecidos como todos os núcleos).
7heo.tk
8
Isso não é específico para um único processo, mas mostra o uso da CPU de todos os processos em vários núcleos
m_vitaly
Como podemos passar "1" como um argumento para top, a manpágina diz, top -1mas ela reclama! Seria bom top -1 -n 1obter uma única iteração do, topmas com o uso de CPU separado exibido.
quanta
76

Você pode usar:

 mpstat -P ALL 1

Mostra o quanto cada núcleo está ocupado e atualiza automaticamente a cada segundo. A saída seria algo assim (em um processador quad-core):

10:54:41 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
10:54:42 PM  all    8.20    0.12    0.75    0.00    0.00    0.00    0.00    0.00   90.93
10:54:42 PM    0   24.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   74.00
10:54:42 PM    1   22.00    0.00    2.00    0.00    0.00    0.00    0.00    0.00   76.00
10:54:42 PM    2    2.02    1.01    0.00    0.00    0.00    0.00    0.00    0.00   96.97
10:54:42 PM    3    2.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   98.00
10:54:42 PM    4   14.15    0.00    1.89    0.00    0.00    0.00    0.00    0.00   83.96
10:54:42 PM    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
10:54:42 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
10:54:42 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

Este comando não responde à pergunta original, ou seja, não mostra o uso do núcleo da CPU para um processo específico.

Kamran Bigdely
fonte
3
Acho que isso realmente não responde à pergunta. Isso só é a mesma coisa se não houver outros processos em execução. Além disso, este não parece ser um CPU quad core, mais como oito núcleos (talvez quad com HT habilitado).
o suíno de
1
É um quad core com HT habilitado.
Kamran Bigdely
Não responde à pergunta original. No entanto, por não mencionar (-1) de mim.
KGhatak de
1
Concordo com @KGhatak, isso não responde à pergunta original -1
jodag
41

você pode usar ps.
por exemplo, tendo o processo Python com dois threads ocupados na CPU dual core:

$ ps -p 29492 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
29492 29492   1  0.0
29492 29493   1 48.7
29492 29494   1 51.9

(PSR é a ID da CPU à qual o thread está atualmente atribuído)

você vê que os threads estão rodando no mesmo núcleo da CPU (por causa do GIL)

executando o mesmo script python em jython, vemos que o script está utilizando os dois núcleos (e há muitos outros serviços ou threads, que estão quase inativos):

$ ps -p 28671 -L -o pid,tid,psr,pcpu
  PID   TID PSR %CPU
28671 28671   1  0.0
28671 28672   0  4.4
28671 28673   0  0.6
28671 28674   0  0.5
28671 28675   0  2.3
28671 28676   0  0.0
28671 28677   1  0.0
28671 28678   1  0.0
28671 28679   0  4.6
28671 28680   0  4.4
28671 28681   1  0.0
28671 28682   1  0.0
28671 28721   1  0.0
28671 28729   0 88.6
28671 28730   1 88.5

você pode processar a saída e calcular a CPU total para cada núcleo da CPU.

Infelizmente, essa abordagem não parece ser 100% confiável, às vezes vejo que, no primeiro caso, os dois threads de trabalho estão separados para cada núcleo da CPU ou, no último caso, os dois threads estão ligados o mesmo núcleo ..

mykhal
fonte
13

htop oferece uma boa visão geral do uso individual do núcleo

WBM
fonte
4

A pssolução foi quase o que eu precisava e com alguma bash lançada faz exatamente o que a pergunta original pediu: para ver o uso por núcleo de processos específicos

Isso mostra o uso por núcleo de processos multithread também.

Use como: cpustat `pgrep processname`` pgrep otherprocessname` ...

#!/bin/bash

pids=()
while [ $# != 0 ]; do
        pids=("${pids[@]}" "$1")
        shift
done

if [ -z "${pids[0]}" ]; then
        echo "Usage: $0 <pid1> [pid2] ..."
        exit 1
fi

for pid in "${pids[@]}"; do
        if [ ! -e /proc/$pid ]; then
                echo "Error: pid $pid doesn't exist"
                exit 1
        fi
done

while [ true ]; do
        echo -e "\033[H\033[J"
        for pid in "${pids[@]}"; do
                ps -p $pid -L -o pid,tid,psr,pcpu,comm=
        done
        sleep 1
done

Observação: essas estatísticas são baseadas na vida útil do processo , não nos últimos X segundos, portanto, você precisará reiniciar o processo para zerar o contador.

Nathan Kidd
fonte
Você pode usar as funções read () e open () do C lib para abrir os pseudo arquivos em / proc / pid / * e analisar todos os dados de que você precisa.
GL2014
2
dstat -C 0,1,2,3 

Também fornecerá o uso da CPU dos primeiros 4 núcleos. Claro, se você tiver 32 núcleos, este comando ficará um pouco mais longo, mas será útil se você estiver interessado apenas em alguns núcleos.

Por exemplo, se você está interessado apenas no núcleo 3 e 7, então você pode fazer

dstat -C 3,7
Pergunte e aprenda
fonte
Como isso será relevante para um único processo?
einpoklum
1

Eu tive apenas esse problema e encontrei uma resposta semelhante aqui .

O método é definir topda maneira que você deseja e, em seguida, pressione W(W maiúsculo). Isso salvatop o layout atual em um arquivo de configuração em $ HOME / .toprc

Embora isso possa não funcionar se você deseja executar vários top com configurações diferentes.

Então, por meio do que considero uma solução alternativa, você pode gravar em diferentes arquivos de configuração / usar diferentes arquivos de configuração seguindo um destes procedimentos ...

1) Renomear o binário

  ln -s /usr/bin/top top2
  ./top2

Agora .top2rc será escrito em $ HOME

2) Defina $ HOME como algum caminho alternativo, pois ele gravará seu arquivo de configuração no arquivo $ HOME / .binary-name.rc

HOME=./
top

Agora .toprc será gravado na pasta atual.

Por meio do uso de comentários de outras pessoas para adicionar as várias contas de uso no topo, você pode criar uma saída em lote para essas informações e, posteriormente, unir as informações por meio de um script. Talvez não seja tão simples quanto seu script, mas descobri que o top fornece TODOS os processos para que mais tarde eu possa recapitular e capturar um estado durante uma longa execução que eu poderia ter perdido de outra forma (uso repentino inexplicável da CPU devido a processos perdidos)

Lucien Murray-Pitts
fonte
1

Eu pensei perf statque é o que você precisa.

Mostra um uso específico de um processo quando você especifica uma --cpu=listopção. Aqui está um exemplo de monitoramento do uso da CPU ao construir um projeto usando o perf stat --cpu=0-7 --no-aggr -- make all -jcomando. O resultado é:

CPU0         119254.719293 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU1         119254.724776 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU2         119254.724179 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU3         119254.720833 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU4         119254.714109 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU5         119254.727721 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU6         119254.723447 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU7         119254.722418 task-clock (msec)         #    1.000 CPUs utilized            (100.00%)
CPU0                 8,108 context-switches          #    0.068 K/sec                    (100.00%)
CPU1                26,494 context-switches                                              (100.00%)
CPU2                10,193 context-switches                                              (100.00%)
CPU3                12,298 context-switches                                              (100.00%)
CPU4                16,179 context-switches                                              (100.00%)
CPU5                57,389 context-switches                                              (100.00%)
CPU6                 8,485 context-switches                                              (100.00%)
CPU7                10,845 context-switches                                              (100.00%)
CPU0                   167 cpu-migrations            #    0.001 K/sec                    (100.00%)
CPU1                    80 cpu-migrations                                                (100.00%)
CPU2                   165 cpu-migrations                                                (100.00%)
CPU3                   139 cpu-migrations                                                (100.00%)
CPU4                   136 cpu-migrations                                                (100.00%)
CPU5                   175 cpu-migrations                                                (100.00%)
CPU6                   256 cpu-migrations                                                (100.00%)
CPU7                   195 cpu-migrations                                                (100.00%)

A coluna à esquerda é o índice específico da CPU e a coluna mais à direita é o uso da CPU. Se você não especificar a --no-aggropção, o resultado será agregado. A --pid=pidopção o ajudará se você deseja monitorar um processo em execução.

Experimente -a --per-coreou -a perf-sockettambém, que apresentará mais informações classificadas.

Mais sobre o uso de perf statpode ser visto neste tutorial: estatística perf cpu , também perf help statajudará no significado das opções.

Elinx
fonte