Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux. Есть ли простой способ получить эту информацию, не влияя на производительность процесса?
JStack довольно недорогой - одним из вариантов будет передача данных через grep для поиска активных потоков, а затем передача через wc -l.
Более наглядным является JConsole, который отображает количество потоков для данного процесса.
Более новые дистрибутивы JDK поставляются с JConsole и VisualVM. Оба являются фантастическими инструментами для получения грязных деталей от работающего процесса Java. Если вам нужно сделать это программно, исследуйте JMX.
1
из него, потому что он печатает строку, как USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
для заголовка таблицы. Если вы используете:
ps uH p <PID_OF_U_PROCESS> | wc -l
Вы должны вычесть 1 из результата, так как одна из строк, которую считает "wc", является заголовком команды "ps".
ps
как один из потоков. Каждый поток в процессе создает каталог в /proc/<pid>/task
. Подсчитайте количество каталогов, и вы получите количество потоков.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Просто замените <PID> вашим идентификатором процесса, который вы можете получить top
или использоватьps
jvmtop может показать текущее количество потоков jvm помимо других показателей.
Вот одна команда, которая отображает количество потоков данного процесса:
ps -L -o pid= -p <pid> | wc -l
В отличие от других ps
основанных ответов, здесь нет необходимости вычитать 1
из его вывода, так как нет опции ps
заголовка благодаря -o pid=
опции.
ps -eLf
на оболочке предоставит вам список всех потоков и процессов, запущенных в данный момент в системе. Или вы можете запустить top
команду, а затем нажать «H», чтобы переключить списки потоков.
-p
к этому при необходимости или что-то еще. Это минимум, который вам нужен, чтобы увидеть список тем. cat /proc/<PROCESS_PID>/status | grep Threads
Если вам интересны те потоки, которые действительно активны - например, что-то делают (не заблокированы, не timed_waiting, не сообщают о «потоке запущен», а действительно ожидают поток данных), а не сидят без дела, а живут - - тогда вас может заинтересовать jstack-active .
Этот простой bash-скрипт запускается, а jstack
затем отфильтровывает все потоки, которые по эвристике кажутся бездействующими, показывая вам трассировки стека для тех потоков, которые фактически потребляют циклы процессора.
$ 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:
$ 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
для меня это сработало. Если вы пытаетесь узнать количество потоков, использующих процессор для данного 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» из исходного кода, вы найдете его здесь .
Подводя итог всем хорошим ответам, вот мое мнение:
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}'`