¿Cómo puedo monitorear el recuento de hilos de un proceso en Linux?

135

Me gustaría monitorear la cantidad de hilos utilizados por un proceso específico en Linux. ¿Hay una manera fácil de obtener esta información sin afectar el rendimiento del proceso?

Fluir
fuente
¿Qué tal si el proceso de una aplicación solo se ejecuta por un corto tiempo? (Digamos 2 segundos.)
user2023370

Respuestas:

152

tratar

ps huH p <PID_OF_U_PROCESS> | wc -l

o htop

slav0nic
fuente
3
Creo que debería restarlo 1porque imprime una línea como USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDpara el encabezado de la tabla.
AhmetB - Google
2
La 'h' oculta el encabezado.
thinkmassive
11
-1 ¿Por qué canalizar la salida a wccuando podrías simplemente ps -o thcount <pid>? Mira esta respuesta .
Flujo
73

Para obtener el número de hilos para un pid dado:

$ ps -o nlwp <pid>

Donde nlwpsignifica Número de procesos livianos (hilos) . Así psalias nlwpa thcount, lo que significa que

$ ps -o thcount <pid>

también funciona

Si desea monitorear el conteo de hilos, simplemente use watch:

$ watch ps -o thcount <pid>

Para obtener la suma de todos los hilos que se ejecutan en el sistema:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
Thejaswi R
fuente
2
La respuesta más útil aquí. Especialmente el watchcomando. Sin embargo, tenga en cuenta que el uso thcountpuede fallar para algunos (Red Hat ...), aunque nlwpfuncionó para mí.
Joshua Detwiler
50

Cada hilo en un proceso crea un directorio debajo /proc/<pid>/task. Cuente la cantidad de directorios y tendrá la cantidad de hilos.

bdonlan
fuente
1
Para agregar al comentario anterior. Puede utilizar este comando para encontrar el número de hilos: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Simplemente reemplace el <PID> con su ID de proceso que puede obtener topo usarps
Navigatron
33
cat /proc/<PROCESS_PID>/status | grep Threads
PbxMan
fuente
21

ps -eLfen el shell le dará una lista de todos los hilos y procesos que se ejecutan actualmente en el sistema. O bien, puede ejecutar el topcomando y luego presionar 'H' para alternar las listas de hilos.


fuente
Esta es la salsa para mí. No quiero limitarlo solo a un proceso. Es fácil agregar un -pa esto si es necesario, o cualquier otra cosa. Esto es lo mínimo que necesita para ver la lista de hilos.
Erick Robertson el
6

JStack es bastante económico: una opción sería canalizar la salida a través de grep para encontrar hilos activos y luego canalizar a través de wc -l.

Más gráficamente es JConsole, que muestra el recuento de subprocesos para un proceso determinado.

rhys keepence
fuente
6

Si utiliza:

ps uH p <PID_OF_U_PROCESS> | wc -l

Debe restar 1 al resultado, ya que una de las líneas que "wc" cuenta son los encabezados del comando "ps".

flexo
fuente
Bienvenido a StackOverflow. Podría decirse que esto debería ser un comentario a la respuesta de slav0nic. Sin embargo, según tengo entendido, cuando te unes a SO por primera vez, (todavía) no puedes comentar las respuestas hasta que hayas ganado algo de reputación, por lo que agregar una respuesta es todo lo que puedes hacer. Estás en lo correcto; no debe contar la línea de encabezado pscomo uno de los hilos.
Jonathan Leffler
6

Aquí hay un comando que muestra el número de hilos de un proceso dado:

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

A diferencia de las otras psrespuestas basadas, aquí no hay necesidad de restar 1de su salida ya que no hay una pslínea de encabezado gracias a la -o pid=opción.

jlliagre
fuente
5

$ ps H p pid-id

H - Lista todos los hilos individuales en un proceso

o

$cat /proc/pid-id/status

pid-id es la ID del proceso

por ejemplo ... (truncado el siguiente resultado)

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
fuente
4

Las distribuciones más nuevas de JDK se entregan con JConsole y VisualVM. Ambas son herramientas fantásticas para obtener los detalles sucios de un proceso Java en ejecución. Si tiene que hacer esto mediante programación, investigue JMX.

basszero
fuente
2

jvmtop puede mostrar el recuento actual de subprocesos jvm junto a otras métricas.

MRalwasser
fuente
2

La forma más fácil es usar "htop". Puede instalar "htop" (una versión más elegante de top) que le mostrará todos sus núcleos, procesos y uso de memoria.

Presione "Shift + H" para mostrar todo el proceso o presione nuevamente para ocultarlo. Presione la tecla "F4" para buscar el nombre de su proceso.

Instalación en Ubuntu o Debian:

sudo apt-get install htop

Instalación en Redhat o CentOS:

yum install htop
dnf install htop      [On Fedora 22+ releases]

Si desea compilar "htop" a partir del código fuente, lo encontrará aquí .

Saeed Zahedian Abroodi
fuente
1

Si está tratando de averiguar la cantidad de subprocesos que usan CPU para un pid dado, usaría:

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Manuel Mndza Bañs
fuente
0

Si está interesado en esos hilos que están realmente activos , como hacer algo (no bloqueado, no timed_waiting, no informar "hilo en ejecución" pero realmente esperando que una transmisión proporcione datos) en lugar de estar inactivo pero en vivo, - entonces te puede interesar jstack-active .

Este script bash simple se ejecuta y jstackluego filtra todos los subprocesos que, por heurística, parecen estar inactivos, mostrándole rastros de pila para aquellos subprocesos que realmente consumen ciclos de CPU.

Parcialmente nublado
fuente
0

VisualVM puede mostrar estados claros de subprocesos de un proceso JVM dado

ingrese la descripción de la imagen aquí

Sumergirse en
fuente
1
paliza autoinducida? dang!
Andrew Scott Evans
0

Si desea la cantidad de subprocesos por usuario en un sistema Linux, debe usar:

ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'

donde como utilizar el nombre de usuario deseado.

Andreas Foteas
fuente