Как я могу контролировать количество потоков процесса в Linux?

Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux. Есть ли простой способ получить эту информацию, не влияя на производительность процесса?

6.11.2008 13:29:29
Как насчет того, если процесс приложения работает только в течение короткого времени? (Скажем 2 секунды.)
user2023370 22.11.2019 17:42:12
16 ОТВЕТОВ

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

Более наглядным является JConsole, который отображает количество потоков для данного процесса.

6
6.11.2008 13:36:37

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

4
6.11.2008 13:39:56

пытаться

ps huH p <PID_OF_U_PROCESS> | wc -l

или хтоп

149
14.03.2014 10:01:55
Я считаю, что вы должны вычесть 1из него, потому что он печатает строку, как USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMANDдля заголовка таблицы.
AhmetB - Google 27.04.2012 23:40:56
«H» скрывает заголовок.
thinkmassive 16.04.2015 19:49:52
-1 Зачем трубу выводить, wcкогда можно было просто ps -o thcount <pid>? Смотрите этот ответ .
Flow 4.11.2017 20:03:13

Если вы используете:

ps uH p <PID_OF_U_PROCESS> | wc -l

Вы должны вычесть 1 из результата, так как одна из строк, которую считает "wc", является заголовком команды "ps".

6
27.08.2011 18:24:15
Добро пожаловать в StackOverflow. Возможно, это должен быть комментарий к ответу slav0nic. Однако, насколько я понимаю, когда вы впервые присоединяетесь к SO, вы (по-прежнему) не можете комментировать ответы, пока не наберете репутацию, поэтому добавление ответа - это все, что вы можете сделать. Ты прав; Вы не должны считать строку заголовка psкак один из потоков.
Jonathan Leffler 28.08.2011 00:11:11

Каждый поток в процессе создает каталог в /proc/<pid>/task. Подсчитайте количество каталогов, и вы получите количество потоков.

48
27.08.2011 19:07:03
Добавить к вышеуказанному комментарию. Вы можете использовать эту команду , чтобы найти число нитей: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Просто замените <PID> вашим идентификатором процесса, который вы можете получить topили использоватьps
Navigatron 14.10.2016 10:15:12

jvmtop может показать текущее количество потоков jvm помимо других показателей.

2
14.03.2013 10:33:50

Вот одна команда, которая отображает количество потоков данного процесса:

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

В отличие от других psоснованных ответов, здесь нет необходимости вычитать 1из его вывода, так как нет опции psзаголовка благодаря -o pid=опции.

6
17.05.2014 20:46:13

ps -eLfна оболочке предоставит вам список всех потоков и процессов, запущенных в данный момент в системе. Или вы можете запустить topкоманду, а затем нажать «H», чтобы переключить списки потоков.

20
23.08.2014 07:39:05
Это соус для меня. Я не хочу ограничивать это только одним процессом. Легко добавить -pк этому при необходимости или что-то еще. Это минимум, который вам нужен, чтобы увидеть список тем.
Erick Robertson 6.04.2016 14:45:41
cat /proc/<PROCESS_PID>/status | grep Threads
34
3.11.2015 17:26:42

Если вам интересны те потоки, которые действительно активны - например, что-то делают (не заблокированы, не timed_waiting, не сообщают о «потоке запущен», а действительно ожидают поток данных), а не сидят без дела, а живут - - тогда вас может заинтересовать jstack-active .

Этот простой bash-скрипт запускается, а jstackзатем отфильтровывает все потоки, которые по эвристике кажутся бездействующими, показывая вам трассировки стека для тех потоков, которые фактически потребляют циклы процессора.

0
27.10.2015 13:03:11

VisualVM может показывать четкие состояния потоков данного процесса JVM

введите описание изображения здесь

0
22.12.2015 09:41:45
самоубийство? Данг!
Andrew Scott Evans 15.06.2016 16:17:28

$ 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
5
16.02.2016 02:04:54

Чтобы получить количество потоков для данного pid:

$ 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 }'
63
15.08.2018 13:15:05
Самый полезный ответ здесь. Особенно watchкоманда. Тем не менее, обратите внимание, что использование thcountможет потерпеть неудачу для некоторых (Red Hat ...), хотя nlwpдля меня это сработало.
Joshua Detwiler 17.01.2018 06:20:17

Если вы пытаетесь узнать количество потоков, использующих процессор для данного pid, я бы использовал:

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

Самый простой способ - использовать «htop». Вы можете установить «htop» (причудливую версию top), которая покажет вам все ваши ядра, процессы и использование памяти.

Нажмите «Shift + H», чтобы показать весь процесс, или нажмите еще раз, чтобы скрыть его. Нажмите клавишу «F4», чтобы найти имя вашего процесса.

Установка в Ubuntu или Debian:

sudo apt-get install htop

Установка на Redhat или CentOS:

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

Если вы хотите скомпилировать «htop» из исходного кода, вы найдете его здесь .

2
23.10.2017 08:50:44

Подводя итог всем хорошим ответам, вот мое мнение:

proc_pid=<PROCESS ID> && echo `ps -o thcount $proc_pid | tail -n 1` `ps huH p $proc_pid | wc -l` $((`ls -l /proc/$proc_pid/task | wc -l`-1)) `cat /proc/$proc_pid/status | grep Thread | awk '{print $2}'`
0
10.03.2020 11:33:50