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