Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux. Есть ли простой способ получить эту информацию, не влияя на производительность процесса?
Как я могу отслеживать количество потоков процесса в Linux?
Ответы (17)
пытаться
ps huH p <PID_OF_U_PROCESS> | wc -l
или htop
1
, потому что он печатает строку типа USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
для заголовка таблицы.
- person Ahmet Alp Balkan; 28.04.2012
wc
, когда можно было просто ps -o thcount <pid>
? См. этот ответ.
- person Flow; 04.11.2017
Чтобы получить количество потоков для данного 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 }'
watch
. Однако обратите внимание, что использование thcount
может дать сбой для некоторых (Red Hat ...), хотя nlwp
у меня сработало.
- person Joshua Detwiler; 17.01.2018
pidof
или pgrep
. Например, ps -o nlwp $(pidof chrome)
или ps -o nlwp $(pgrep chrome)
.
- person hmofrad; 08.12.2020
Каждый поток в процессе создает каталог в /proc/<pid>/task
. Подсчитайте количество каталогов, и вы получите количество потоков.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Просто замените ‹PID› на свой идентификатор процесса, который вы можете получить от top
или используя ps
- person Navigatron; 14.10.2016
ls /proc/<PID>/task | wc
.
- person EvertW; 17.11.2020
ps -eLf
в оболочке предоставит вам список всех потоков и процессов, запущенных в настоящее время в системе. Или вы можете запустить команду top
, а затем нажать «H», чтобы переключить списки потоков.
-p
или что-нибудь еще. Это минимум, который вам нужен, чтобы увидеть список потоков.
- person Erick Robertson; 06.04.2016
Если вы используете:
ps uH p <PID_OF_U_PROCESS> | wc -l
Вы должны вычесть 1 из результата, так как одна из строк «wc» считается заголовками команды «ps».
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
JStack довольно недорогой вариант - один из вариантов - направить вывод через grep для поиска активных потоков, а затем передать через wc -l.
Более наглядно - это JConsole, которая отображает количество потоков для данного процесса.
Вот одна команда, которая отображает количество потоков данного процесса:
ps -L -o pid= -p <pid> | wc -l
В отличие от других ответов на основе ps
, здесь нет необходимости вычитать 1
из его вывода, поскольку нет строки заголовка ps
благодаря опции -o pid=
.
Новые дистрибутивы JDK поставляются с JConsole и VisualVM. Оба являются фантастическими инструментами для извлечения грязных деталей из запущенного Java-процесса. Если вам нужно сделать это программно, изучите JMX.
jvmtop может отображать текущее количество потоков jvm рядом с другими показателями.
Самый простой способ - использовать "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" из исходного кода, вы найдете его здесь.
Мой ответ больше gui, но все еще в терминале. Htop можно использовать после небольшой настройки.
- Запустите htop.
- Войдите в меню настройки, нажав F2.
- В крайнем левом столбце выберите Столбцы
- В крайнем правом столбце выберите столбец, который будет добавлен к основному результату мониторинга. NLWP - это то, что вы ищете.
- Нажмите F10.
Если вы пытаетесь узнать количество потоков, использующих процессор для данного pid, я бы использовал:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Если вам нужно количество потоков на пользователя в системе Linux, вы должны использовать:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
где в качестве <USER>
используйте желаемое имя пользователя.
Если вас интересуют те потоки, которые действительно активны - например, когда что-то делают (не блокируются, не timed_waiting, не сообщают о «запущенном потоке», но действительно ждут, пока поток предоставит данные), а не сидеть без дела, но жить - тогда вас может заинтересовать jstack-active.
Этот простой сценарий bash запускает jstack
, а затем отфильтровывает все потоки, которые по эвристике кажутся простаивающими, показывая вам трассировку стека для тех потоков, которые фактически потребляют циклы ЦП.
Если вы ищете количество потоков для нескольких процессов, другие ответы вам не подойдут, поскольку вы не увидите имена процессов или 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>