Як я можу контролювати кількість потоків процесу в Linux?


135

Я хотів би стежити за кількістю потоків, використовуваних певним процесом в Linux. Чи є простий спосіб отримати цю інформацію, не впливаючи на ефективність процесу?


Як щодо того, якщо процес роботи програми працює лише короткий час? (Скажіть 2 секунди.)
користувач2023370

Відповіді:


152

спробуйте

ps huH p <PID_OF_U_PROCESS> | wc -l

або htop


3
Я вважаю, що ви повинні відняти 1від нього, оскільки він друкує рядок, як USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDдля заголовка таблиці.
AhmetB - Google

2
Заголовок 'h' ховає заголовок.
thinkmassive

11
-1 Навіщо передавати вихід, wcколи можна було просто ps -o thcount <pid>? Дивіться цю відповідь .
Потік

73

Щоб отримати кількість потоків для заданого підпису:

$ ps -o nlwp <pid>

Де nlwpозначає кількість легких вагових процесів (ниток) . Таким чином psпсевдоніми nlwpдо thcount, що означає, що

$ ps -o thcount <pid>

також працює.

Якщо ви хочете контролювати кількість потоків, просто скористайтеся watch:

$ watch ps -o thcount <pid>

Щоб отримати суму всіх потоків, що працюють у системі:

$ ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'

2
Тут найкорисніша відповідь. Особливо watchкоманда. Однак зауважте, що використання thcountдля деяких може бути невдалим (Red Hat ...), хоч і nlwpпрацювало для мене.
Джошуа Детвейлер

50

Кожен потік у процесі створює каталог під /proc/<pid>/task. Порахуйте кількість каталогів, і у вас є кількість потоків.


1
Щоб додати до вищевказаного коментаря. Ви можете використовувати цю команду , щоб знайти число ниток: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Просто замініть <PID> на свій ідентифікатор процесу, який ви можете отримати topабо скористатисяps
Navigatron


21

ps -eLfна оболонці подається список усіх потоків і процесів, які зараз працюють у системі. Або ви можете запустити topкоманду, після чого натисніть "H", щоб переключити список потоків.


Це для мене соус. Я не хочу обмежувати це лише одним процесом. Додайте -pдо цього, якщо потрібно, або що-небудь інше. Це мінімум, який потрібно переглянути для переліку потоків.
Ерік Робертсон

6

JStack досить недорогий - одним із варіантів було б прокласти вихід через grep, щоб знайти активні потоки, а потім прокласти через wc -l.

Більш графічно - JConsole, який відображає кількість потоків для заданого процесу.


6

Якщо ви використовуєте:

ps uH p <PID_OF_U_PROCESS> | wc -l

Ви повинні відняти 1 до результату, оскільки один з рядків "wc" рахує - це заголовки команди "ps".


Ласкаво просимо до StackOverflow. Можливо, це має бути коментарем до відповіді від slav0nic. Однак, як я розумію, коли ви вперше приєднаєтесь до SO, ви (досі) не можете коментувати відповіді, поки ви не здобули якусь репутацію, тому додавання відповіді - це все, що ви можете зробити. Ви праві; не слід вважати рядок заголовка psодним із потоків.
Джонатан Леффлер

6

Ось одна команда, яка відображає кількість потоків заданого процесу:

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

На відміну від інших psна основі відповідей, тут немає необхідності 1виводити підсумки з її результату, оскільки немає psрядка заголовка завдяки -o pid=опції.


5

$ ps H p pid-id

H - перераховує всі окремі потоки в процесі

або

$cat /proc/pid-id/status

pid-id - ідентифікатор процесу

наприклад .. (Скорочений нижній вихід)

root@abc:~# cat /proc/8443/status
Name:   abcdd
State:  S (sleeping)
Tgid:   8443
VmSwap:        0 kB
Threads:    4
SigQ:   0/256556
SigPnd: 0000000000000000

4

Нові дистрибутиви JDK поставляються з JConsole та VisualVM. Обидва є фантастичним інструментом для отримання брудних деталей із запущеного процесу Java. Якщо це потрібно робити програмно, досліджуйте JMX.


2

jvmtop може показувати поточну кількість потоків jvm поруч з іншими показниками.


2

Найпростіший спосіб - це використання "htop". Ви можете встановити "htop" (більш приваблива версія верху), яка покаже вам всі ваші ядра, процес та використання пам'яті.

Натисніть "Shift + H", щоб показати весь процес, або натисніть ще раз, щоб приховати його. Натисніть клавішу "F4" для пошуку назви процесу.

Встановлення на Ubuntu або Debian:

sudo apt-get install htop

Встановлення на Redhat або CentOS:

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

Якщо ви хочете скласти "htop" з вихідного коду, ви знайдете його тут .


1

Якщо ви намагаєтеся дізнатись кількість потоків, що використовують процесор для даного підпису, я б використав:

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

0

Якщо вас цікавлять ті потоки, які є дійсно активними - як робити щось (не заблоковано, не timed_waiting, не повідомляти про "потоку потоку", але дійсно чекати, щоб потік дав дані) на відміну від того, щоб сидіти навколо простою, але жити - - тоді вас можуть зацікавити jstack-active .

Цей простий скрипт bash запускає jstackтоді фільтри всіх потоків, які за евристикою здаються простоюючими, показуючи, що ви стежите стеки для тих потоків, які фактично вимагають циклів процесора.



0

Якщо ви хочете кількість потоків на користувача в системі Linux, то вам слід використовувати:

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

де як використовувати потрібне ім’я користувача.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.