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

135

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

поток
источник
Как насчет того, чтобы процесс приложения выполнялся только на короткое время? (Скажем, 2 секунды.)
user2023370

Ответы:

153

пытаться

ps huH p <PID_OF_U_PROCESS> | wc -l

или htop

slav0nic
источник
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>? Смотрите этот ответ .
Flow
74

Чтобы получить количество потоков для данного 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 }'
Thejaswi R
источник
2
Самый полезный ответ здесь. Особенно watchкоманда. Однако обратите внимание, что использование thcountможет не работать для некоторых (Red Hat ...), хотя nlwpу меня работало.
Джошуа Детвайлер
50

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

bdonlan
источник
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=опции.

jlliagre
источник
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.

basszero
источник
2

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

MRalwasser
источник
2

Самый простой способ - использовать "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" из исходного кода, вы найдете его здесь .

Саид Захедян Абруди
источник
1

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

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

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

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

Погрузиться
источник
1
самоиндуцированное избиение? Данг!
Эндрю Скотт Эванс
0

Если вам нужно количество потоков на пользователя в системе Linux, вы должны использовать:

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

где как использовать желаемое имя пользователя.

Андреас Фотеас
источник