Gostaria de monitorar o número de threads usados por um processo específico no Linux. Existe uma maneira fácil de obter essas informações sem afetar o desempenho do processo?
Gostaria de monitorar o número de threads usados por um processo específico no Linux. Existe uma maneira fácil de obter essas informações sem afetar o desempenho do processo?
Respostas:
1
, porque imprime uma linha como USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
para o cabeçalho da tabela.
wc
quando você poderia apenas ps -o thcount <pid>
? Veja esta resposta .
Para obter o número de threads para um determinado pid:
$ ps -o nlwp <pid>
Onde nlwp
significa Número de processos leves (threads) . Assim, ps
aliases nlwp
para thcount
, o que significa que
$ ps -o thcount <pid>
também funciona.
Se você deseja monitorar a contagem de threads, basta usar watch
:
$ watch ps -o thcount <pid>
Para obter a soma de todos os threads em execução no sistema:
$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
watch
comando. No entanto, observe que o uso thcount
pode falhar para alguns (Red Hat ...), embora nlwp
funcionou para mim.
Cada encadeamento em um processo cria um diretório em /proc/<pid>/task
. Conte o número de diretórios e você terá o número de threads.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Apenas substitua o <PID> pelo seu ID do processo que você pode obter top
ou usarps
ps -eLf
no shell deve fornecer uma lista de todos os threads e processos atualmente em execução no sistema. Ou, você pode executar o top
comando e pressionar 'H' para alternar entre as listagens de threads.
-p
a isso, se necessário, ou qualquer outra coisa. Este é o mínimo que você precisa para ver a lista de tópicos.
O JStack é bastante barato - uma opção seria canalizar a saída através do grep para encontrar threads ativos e, em seguida, canalizar através do wc -l.
Mais graficamente é o JConsole, que exibe a contagem de threads para um determinado processo.
Se você usar:
ps uH p <PID_OF_U_PROCESS> | wc -l
Você deve subtrair 1 ao resultado, pois uma das linhas "wc" está contando são os cabeçalhos do comando "ps".
ps
como um dos threads.
$ ps H p pid-id
H - lista todos os segmentos individuais em um processo
ou
$cat /proc/pid-id/status
pid-id é o ID do processo
por exemplo .. (Truncou a saída abaixo)
root@abc:~# cat /proc/8443/status
Name: abcdd
State: S (sleeping)
Tgid: 8443
VmSwap: 0 kB
Threads: 4
SigQ: 0/256556
SigPnd: 0000000000000000
O jvmtop pode mostrar a contagem atual de encadeamentos jvm ao lado de outras métricas.
A maneira mais fácil é usar "htop". Você pode instalar o "htop" (uma versão mais sofisticada do topo), que mostrará todos os seus núcleos, processos e uso de memória.
Pressione "Shift + H" para mostrar todo o processo ou pressione novamente para ocultá-lo. Pressione a tecla "F4" para pesquisar o nome do processo.
Instalando no Ubuntu ou Debian:
sudo apt-get install htop
Instalando no Redhat ou CentOS:
yum install htop
dnf install htop [On Fedora 22+ releases]
Se você deseja compilar "htop" a partir do código fonte, você o encontrará aqui .
Se você está tentando descobrir o número de threads usando cpu para um dado pid, eu usaria:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Se você estiver interessado nos segmentos que são realmente ativos - como fazer algo (sem bloqueio, sem timed_waiting, sem relatar "thread em execução", mas realmente esperando que um fluxo forneça dados), em vez de ficar ocioso, mas ao vivo - - então você pode estar interessado em jstack-active .
Esse script simples do bash é executado jstack
e filtra todos os threads que, por heurística, parecem estar ociosos, mostrando a pilha de rastreamentos para os threads que estão realmente consumindo ciclos de CPU.
Se você deseja o número de threads por usuário em um sistema Linux, deve usar:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
onde, como usar o nome de usuário desejado.