Como posso monitorar a contagem de threads de um processo no linux?

135

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?

Fluxo
fonte
Que tal se o processo de um aplicativo for executado apenas por um curto período de tempo? (Digamos, 2 segundos.)
user2023370

Respostas:

152

experimentar

ps huH p <PID_OF_U_PROCESS> | wc -l

ou htop

slav0nic
fonte
3
Eu acredito que você deve subtrair 1, porque imprime uma linha como USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDpara o cabeçalho da tabela.
AhmetB - Google
2
O 'h' oculta o cabeçalho.
thinkmassive
11
-1 Por que canalizar a saída para wcquando você poderia apenas ps -o thcount <pid>? Veja esta resposta .
Flow
73

Para obter o número de threads para um determinado pid:

$ ps -o nlwp <pid>

Onde nlwpsignifica Número de processos leves (threads) . Assim, psaliases nlwppara 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 }'
Thejaswi R
fonte
2
Resposta mais útil aqui. Especialmente o watchcomando. No entanto, observe que o uso thcountpode falhar para alguns (Red Hat ...), embora nlwpfuncionou para mim.
Joshua Detwiler
50

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.

bdonlan
fonte
1
Para adicionar ao comentário acima. Você pode usar este comando para encontrar 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 topou usarps
Navigatron
33
cat /proc/<PROCESS_PID>/status | grep Threads
PbxMan
fonte
21

ps -eLfno shell deve fornecer uma lista de todos os threads e processos atualmente em execução no sistema. Ou, você pode executar o topcomando e pressionar 'H' para alternar entre as listagens de threads.


fonte
Este é o molho para mim. Não quero limitá-lo apenas a um processo. É fácil adicionar um -pa isso, se necessário, ou qualquer outra coisa. Este é o mínimo que você precisa para ver a lista de tópicos.
Erick Robertson
6

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.

rhys keepence
fonte
6

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".

flexo
fonte
Bem-vindo ao StackOverflow. Indiscutivelmente, isso deve ser um comentário para a resposta de slav0nic. No entanto, pelo que entendi, quando você ingressa no SO pela primeira vez, você (ainda) não pode comentar as respostas até ganhar alguma reputação; portanto, adicionar uma resposta é tudo o que você pode fazer. Você está certo; você não deve contar a linha do cabeçalho pscomo um dos threads.
Jonathan Leffler
6

Aqui está um comando que exibe o número de threads de um determinado processo:

ps -L -o pid= -p <pid> | wc -l

Diferentemente das outras psrespostas baseadas, aqui não há necessidade de subtrair 1sua saída, pois não há pslinha de cabeçalho graças à -o pid=opção.

jlliagre
fonte
5

$ 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
Avinash Reddy
fonte
4

As distribuições mais recentes do JDK são fornecidas com o JConsole e o VisualVM. Ambas são ferramentas fantásticas para obter os detalhes sujos de um processo Java em execução. Se você precisar fazer isso programaticamente, investigue o JMX.

basszero
fonte
2

O jvmtop pode mostrar a contagem atual de encadeamentos jvm ao lado de outras métricas.

MRalwasser
fonte
2

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 .

Saeed Zahedian Abroodi
fonte
1

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
Manuel Mndza Bañs
fonte
0

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 jstacke 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.

Parcialmente nublado
fonte
0

O VisualVM pode mostrar estados claros de encadeamentos de um determinado processo da JVM

insira a descrição da imagem aqui

Mergulhar
fonte
1
debulha auto-induzida? dang!
Andrew Scott Evans
0

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.

Andreas Foteas
fonte