Recuperar o uso da CPU e da memória de um único processo no Linux?


165

Quero obter o uso da CPU e da memória de um único processo no Linux - conheço o PID. Felizmente, eu posso obtê-lo a cada segundo e gravá-lo em um CSV usando o comando 'watch'. Que comando posso usar para obter essas informações na linha de comando do Linux?


11
Pertence ao superusuário.
Richard Richard

Podemos usar o gdb para chamar getpid e top -p <that pid>?
Mj23

Respostas:


226
ps -p <pid> -o %cpu,%mem,cmd

(Você pode deixar o "cmd", mas isso pode ser útil na depuração).

Observe que isso fornece o uso médio da CPU do processo ao longo do tempo em que ele foi executado.


6
A suposição seria que, se você se importa com o uso da memória de um único processo o suficiente para monitorá-lo dessa maneira, está usando uma quantidade significativa de memória para que o par de megabytes extras devido a mapeamentos compartilhados não seja um problema.
CAF

5
@Chaitanya: pipe it through| tail -n +2
caf

11
Ou você pode usar --noheader
hexacyanide

45
Lembre-se de que% cpu "é o tempo da CPU usado dividido pelo tempo em que o processo está em execução (proporção cputime / tempo real), expresso como uma porcentagem" (consulte a página de manual ps). Este não é o verdadeiro uso da CPU just in time. Também pode ser muito diferente do que topmostra, por exemplo.
Xbeche

12
como disse desde Xebeche logo acima, ps -e -o pcpu,argsirá mostrar a média de CPU durante a vida útil do processo, o que obviamente não é o que você quer, se é um processo de longa duração
Alex F

65

Uma variante da resposta do caf : top -p <pid>

Isso atualiza automaticamente o uso da CPU, por isso é bom para o monitoramento.


2
Funciona bem com pgrep:top -p $(pgrep process_name)
Matthias Braun

37

Você pode obter os resultados pelo nome do processo usando

ps -C chrome -o %cpu,%mem,cmd

a -Copção permite que você use o nome do processo sem saber que é pid.


como incluir também de pid? ihave tentou% pid $ PID pid, PID sem sorte
Arnold Roa

@ArnoldRoa pidsó deve funcionar. ps -C chrome -o pid,%cpu,%mem,cmd
Muhammad Taha

28

Use pidstat (do sysstat - Consulte o link ).

por exemplo, para monitorar esses dois IDs de processo (12345 e 11223) a cada 5 segundos, use

$ pidstat -h -r -u -v -p 12345,11223 5

2
obrigado por apontar pidstatque é um ótimo comando, e útil também para scripts!
Fduff

pidstattambém dá uma boa média. É uma pena não ter encontrado uma maneira mais elegante depidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
northern-bradley

24

ps comando (não deve usar):

top comando (deve usar):

Use toppara obter o uso da CPU em tempo real (intervalo curto atual):

top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk '{print $9}'

ecoará como: 78.6


Esta é a resposta mais precisa para obter o uso atual da CPU, e não uma média ao longo da vida útil do processo.
Ted Feng

15

Inicie um programa e monitore-o

Este formulário é útil se você deseja comparar facilmente um executável:

topp() (
  $* &>/dev/null &
  pid="$!"
  trap ':' INT
  echo 'CPU  MEM'
  while sleep 1; do ps --no-headers -o '%cpu,%mem' -p "$pid"; done
  kill "$pid"
)
topp ./myprog arg1 arg2

Agora, quando você pressiona Ctrl + C, ele sai do programa e para de monitorar. Saída de amostra:

CPU  MEM
20.0  1.3
35.0  1.3
40.0  1.3

Relacionado: /unix/554/how-to-monitor-cpu-memory-usage-of-a-singsing-process

Testado no Ubuntu 16.04.


5

Você pode usar top -be exibir o pid desejado (com a -bparte superior do sinalizador sendo executada no modo em lote) ou também usar o -psinalizador e especificar o pid sem usar o grep.


5

Como comentado na resposta do caf acima, ps e, em alguns casos, pidstat fornecerão a média da vida útil da pCPU. Para obter resultados mais precisos, use top. Se você precisar executar o top assim que puder:

top -b -n 1 -p <PID>

ou para processar apenas dados e cabeçalho:

top -b -n 1 -p <PID> | tail -3 | head -2

sem cabeçalhos:

top -b -n 1 -p <PID> | tail -2 | head -1

3
ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr

ou por processo

ps aux | awk '{print $4"\t"$11}' | sort | uniq -c | awk '{print $2" "$1" "$3}' | sort -nr |grep mysql

1

Para obter o uso de memória apenas de seu aplicativo (em oposição às bibliotecas compartilhadas que ele usa, você precisa usar a interface de smaps do Linux). Esta resposta explica bem .


1
ps aux|awk  '{print $2,$3,$4}'|grep PID

onde a primeira coluna é o PID, o uso da CPU na segunda coluna e o uso da memória na terceira coluna.


1
ps axo pid,etime,%cpu,%mem,cmd | grep 'processname' | grep -v grep

PID - ID do processo

etime - Processo em execução / duração ao vivo

% de CPU - uso da CPU

% mem - uso de memória

cmd - Comando

Substitua processname pelo processo que você deseja rastrear, mysql nginx php-fpm etc ...


1

Todas as respostas aqui mostram apenas a porcentagem de memória para o PID.

Aqui está um exemplo de como obter o uso da memória rss em KB para todos os processos apache, substitua "grep apache" por "grep PID" se você quiser apenas assistir um PID específico:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$6}'"

Isso imprime:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$6}'                                                                                                                                                                                                          
Thu Jan 25 15:44:13 2018

12588 9328
12589 8700
12590 9392
12591 9340
12592 8700
12811 15200
15453 9340
15693 3800
15694 2352
15695 1352
15697 948
22896 9360

Com% da CPU:

watch -n5 "ps aux -y | grep apache | awk '{print \$2,\$3,\$6}'"

Resultado:

Every 5.0s: ps aux -y | grep apache | awk '{print $2,$3,$6}'                                                                                                                                                                                                       
Thu Jan 25 15:46:00 2018

12588 0.0 9328
12589 0.0 8700
12590 0.0 9392
12591 0.0 9340
12592 0.0 8700
12811 0.0 15200
15453 0.0 9340
15778 0.0 3800
15779 0.0 2352
15780 0.0 1348
15782 0.0 948
22896 0.0 9360

1

Para aqueles que lutaram por um tempo se perguntando por que a resposta selecionada não funciona:

ps -p <pid> -o %cpu,%mem

Nenhum ESPAÇO entre %cpu,e %mem.


1

Esse é um bom truque para seguir um ou mais programas em tempo real, enquanto também assiste à saída de outras ferramentas: watch "top -bn1 -p$(pidof foo),$(pidof bar); tool"


1

O comando a seguir obtém a média do uso da CPU e da memória a cada 40 segundos para um processo específico (pid)

pidstat 40 -ru -p <pid>

Saída para o meu caso (duas primeiras linhas para uso da CPU, duas primeiras linhas para memória):

02:15:07 PM       PID    %usr %system  %guest    %CPU   CPU  Command
02:15:47 PM     24563    0.65    0.07    0.00    0.73     3  java

02:15:07 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
02:15:47 PM     24563      6.95      0.00 13047972 2123268   6.52  java

0

(Se você estiver no MacOS 10.10, tente a opção -c acumulativa da parte superior:

top -c a -pid PID

(Esta opção não está disponível em outro linux, tentei com o Scientific Linux el6 e RHEL6)


0

Acima, lista os principais processos que consomem CPU e memória

        ps axo %cpu,%mem,command | sort -nr | head

0

Com base na resposta do @ caf, isso funciona muito bem para mim.

Calcular a média para o PID fornecido:

measure.sh

times=100
total=0
for i in $(seq 1 $times)
do
   OUTPUT=$(top -b -n 1 -d 0.1 -p $1 | tail -1 | awk '{print $9}')
   echo -n "$i time: ${OUTPUT}"\\r
   total=`echo "$total + $OUTPUT" | bc -l`
done
#echo "Average: $total / $times" | bc

average=`echo "scale=2; $total / $times" | bc`
echo "Average: $average"

Uso:

# send PID as argument
sh measure.sh 3282

-2

Uso de CPU e memória de um único processo no Linux ou você pode obter os 10 principais processos utilizados pela CPU usando o comando abaixo

ps -aux --sort -pcpu | cabeça -n 11

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.