Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux.
Есть ли простой способ получить эту информацию, не влияя на производительность процесса?
Каждый поток процесса создает каталог под /proc/<pid>/task
. Подсчитайте количество каталогов, и у вас есть количество потоков.
cat /proc/<PROCESS_PID>/status | grep Threads
Чтобы получить количество потоков для заданного pid:
$ ps -o nlwp <pid>
Где nlwp
обозначает количество процессов легкого веса (потоков). Таким образом, ps
aliases nlwp
to 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 }'
ps -eLf
в оболочке должен быть представлен список всех потоков и процессов, выполняемых в настоящее время в системе.
Или вы можете запустить команду top
, а затем нажать “H” для переключения списков потоков.
JStack довольно недорог – один из вариантов – вывести выходные данные через grep, чтобы найти активные потоки, а затем пропустить через wc -l.
Более графически является JConsole, который отображает количество потоков для данного процесса.
Если вы используете:
ps uH p <PID_OF_U_PROCESS> | wc -l
Вы должны вычесть 1 в результат, так как одна из строк “wc” подсчитывает заголовки команды “ps”.
Вот одна команда, которая отображает количество потоков данного процесса:
ps -L -o pid= -p <pid> | wc -l
В отличие от других ответов ps
, здесь нет необходимости вычитать 1
из его вывода, поскольку нет строки заголовка ps
благодаря опции -o pid=
.
Новые дистрибутивы JDK поставляются с JConsole и VisualVM. Оба являются фантастическими инструментами для получения грязных деталей из работающего Java-процесса. Если вам нужно сделать это программно, исследуйте JMX.
jvmtop может показывать текущее количество потоков jvm рядом с другими метриками.
$ 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
Если вы пытаетесь выяснить количество потоков, использующих процессор для данного pid, я бы использовал:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Самый простой способ – использовать “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” из исходного кода, вы найдете здесь здесь.
Если вы заинтересованы в тех потоках, которые действительно активны – как в том, чтобы что-то делать (не заблокировано, а не timed_waiting, а не сообщать об “потоке”, но действительно ждут потока для передачи данных), а не сидеть без дела но жить – тогда вас может заинтересовать jstack-active.
Этот простой bash script работает jstack
, затем отфильтровывает все потоки, которые по эвристике кажутся бездействующими, показывая трассировку стека для тех потоков, которые фактически потребляют циклы процессора.