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

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


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


Ответы (17)


пытаться

ps huH p <PID_OF_U_PROCESS> | wc -l

или htop

person slav0nic    schedule 07.11.2008
comment
Я считаю, что вам следует вычесть из него 1, потому что он печатает строку типа USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND для заголовка таблицы. - person Ahmet Alp Balkan; 28.04.2012
comment
«H» скрывает заголовок. - person thinkmassive; 16.04.2015
comment
-1 Зачем выводить по конвейеру wc, когда можно было просто ps -o thcount <pid>? См. этот ответ. - person Flow; 04.11.2017
comment
или htop - как вы его используете для подсчета количества потоков? - person andrzejdoro; 16.09.2020
comment
andrzejdoro, вы можете включить его в настройках htop, просто нажмите F2 (настройка) - Настройка столбцов - выберите NLWP в Доступных столбцах и переместите его в Активированные столбцы - F10 для сохранения - person slav0nic; 17.09.2020

Чтобы получить количество потоков для данного 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 }'
person Thejaswi R    schedule 08.06.2016
comment
Самый полезный ответ здесь. Особенно команда watch. Однако обратите внимание, что использование thcount может дать сбой для некоторых (Red Hat ...), хотя nlwp у меня сработало. - person Joshua Detwiler; 17.01.2018
comment
Чтобы получить идентификатор процесса с заданным именем, используйте pidof или pgrep. Например, ps -o nlwp $(pidof chrome) или ps -o nlwp $(pgrep chrome). - person hmofrad; 08.12.2020

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

person bdonlan    schedule 27.08.2011
comment
Чтобы добавить к приведенному выше комментарию. Вы можете использовать эту команду, чтобы узнать количество потоков: find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l. Просто замените ‹PID› на свой идентификатор процесса, который вы можете получить от top или используя ps - person Navigatron; 14.10.2016
comment
@Navigatron: Подойдет простой ls /proc/<PID>/task | wc. - person EvertW; 17.11.2020

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

person Community    schedule 23.08.2014
comment
Это соус для меня. Я не хочу ограничивать это только одним процессом. При необходимости к этому легко добавить -p или что-нибудь еще. Это минимум, который вам нужен, чтобы увидеть список потоков. - person Erick Robertson; 06.04.2016

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

ps uH p <PID_OF_U_PROCESS> | wc -l

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

person flexo    schedule 27.08.2011
comment
Добро пожаловать в StackOverflow. Возможно, это должен быть комментарий к ответу slav0nic. Однако, насколько я понимаю, когда вы впервые присоединяетесь к SO, вы (все еще) не можете комментировать ответы, пока не приобретете некоторую репутацию, поэтому добавление ответа - это все, что вы можете сделать. Ты прав; не следует считать строку заголовка из ps одной из потоков. - person Jonathan Leffler; 28.08.2011

$ ps H p pid-id

H - перечисляет все отдельные потоки в процессе

or

$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
person Avinash Reddy    schedule 16.02.2016

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

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

person rhys keepence    schedule 06.11.2008

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

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

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

person jlliagre    schedule 20.01.2014

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

person basszero    schedule 06.11.2008

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

person MRalwasser    schedule 14.03.2013

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

person Saeed Zahedian Abroodi    schedule 23.10.2017

Мой ответ больше gui, но все еще в терминале. Htop можно использовать после небольшой настройки.

  1. Запустите htop.
  2. Войдите в меню настройки, нажав F2.
  3. В крайнем левом столбце выберите Столбцы
  4. В крайнем правом столбце выберите столбец, который будет добавлен к основному результату мониторинга. NLWP - это то, что вы ищете.
  5. Нажмите F10.
person Aleksey Kanaev    schedule 12.09.2020

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

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

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

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

где в качестве <USER> используйте желаемое имя пользователя.

person Andreas Foteas    schedule 27.07.2020

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

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

person Partly Cloudy    schedule 27.10.2015

Если вы ищете количество потоков для нескольких процессов, другие ответы вам не подойдут, поскольку вы не увидите имена процессов или PID, что делает их бесполезными. Используйте вместо этого:

ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>

Чтобы наблюдать за изменениями в реальном времени, просто добавьте watch:

watch ps -o pid,nlwp,args -p <pid_1> <pid_2> ... <pid_N>
person Serge Mosin    schedule 10.02.2021

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

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

person DiveInto    schedule 22.12.2015
comment
самоиндуцированное избиение? черт! - person Andrew Scott Evans; 15.06.2016