Comment obtenir (à partir du terminal) le nombre total de threads (par processus et total pour tous les processus)

32

J'ai essayé de le googler, mais je ne le trouve pas. Je cherche:

  1. nombre de threads en cours X

  2. nombre total de threads en cours d'exécution

NoSenseEtAl
la source
stackoverflow.com/questions/268680/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

53

Pour obtenir le nombre de threads pour un pid donné:

ps -o nlwp <pid>

Pour obtenir la somme de tous les threads exécutés dans le système:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
la source
1
ps -o nlwp <pid>renvoie NLWP :), qu'est-ce que cela signifie?
Siddharth
2
@Siddharth NLWP signifie Number of LightWeight Processes qui est le nombre de threads.
jcollado
Vous pouvez supprimer le "NLWP" avec "h" (masquer les en-têtes); Soit:ps h -o nlwp $pid
bufh
8

Pour trouver le nombre de threads exécutant un seul processus, vous pouvez consulter /proc/<pid>/status. Il doit répertorier le nombre de threads comme l'un des champs.

anaken78
la source
3

Je fonde cette réponse ps axms. psest un excellent outil pour répertorier ce qui est en cours d'exécution.

Si vous souhaitez filtrer cela par un processus, vous pouvez essayer quelque chose comme ceci:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

Nous soustrayons 1 car grep apparaîtra dans cette liste.

Pour tous les threads en général, cela devrait fonctionner:

echo $(( `ps axms | wc -l`  - 1))

Nous soustrayons un cette fois car il y a une ligne d'en-tête.

Oli
la source
Ceci est inexact, car il signale un thread supplémentaire par processus
Score_Under
1

Pour obtenir le nombre total de threads (petits morceaux d'un processus s'exécutant simultanément) d'un, vous pouvez utiliser la commande ps -o nlwp <pid>Cela fonctionne tout le temps. Mais si vous préférez essayer de le voir à travers un fichier. vous devriez probablement regarder les fichiers qui ont été créés pour chaque processus du système. Là, vous pouvez obtenir les détails ultimes du processus. Pour chaque processus, un dossier est créé dans lequel /proc/<pid>vous pouvez également voir tous les autres détails.

Laksith
la source
1

Sur Linux en particulier, voici une façon de le faire par processus:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

Vous pouvez ensuite invoquer ce script avec un PID comme argument, et il indiquera le nombre de threads appartenant à ce processus.

Pour obtenir le nombre de threads pour l'ensemble du système, cela suffit:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

Ces approches peuvent sembler un peu peu orthodoxe car ils comptent beaucoup sur les fonctionnalités shell, mais en retour , deux d'entre eux sont plus rapides que les correspondants pset les awkapproches à base sur ma machine (tout en ne créant pas des fils supplémentaires de leur propre pour les tuyaux). Gardez à l'esprit que le shell lancé pour exécuter ces scripts aura un thread qui lui est propre (ou plus, si vous utilisez une implémentation étrange).

Score_Under
la source