Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux. Есть ли простой способ получить эту информацию, не влияя на производительность процесса?
Я хотел бы отслеживать количество потоков, используемых конкретным процессом в Linux. Есть ли простой способ получить эту информацию, не влияя на производительность процесса?
Ответы:
1
из него, потому что он печатает строку, как USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
заголовок таблицы.
Чтобы получить количество потоков для данного 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
у меня работало.
Каждый поток в процессе создает каталог в /proc/<pid>/task
. Подсчитайте количество каталогов, и у вас будет количество потоков.
find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l
. Просто замените <PID> идентификатором вашего процесса, который вы можете получить top
или использоватьps
ps -eLf
в оболочке должен предоставить вам список всех потоков и процессов, запущенных в настоящее время в системе. Или вы можете запустить top
команду и нажать «H», чтобы переключить списки цепочек.
-p
к этому легко добавить или что-нибудь еще. Это минимум, который вам нужен, чтобы увидеть список потоков.
JStack довольно недорогой - один из вариантов - направить вывод через grep для поиска активных потоков, а затем через wc -l.
Более наглядно - это JConsole, которая отображает количество потоков для данного процесса.
Если вы используете:
ps uH p <PID_OF_U_PROCESS> | wc -l
Вы должны вычесть 1 из результата, так как одна из строк «wc» считается заголовками команды «ps».
ps
одной из потоков.
$ 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
jvmtop может показывать текущее количество потоков jvm рядом с другими показателями.
Самый простой способ - использовать "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" из исходного кода, вы найдете его здесь .
Если вы пытаетесь узнать количество потоков, использующих процессор для данного pid, я бы использовал:
top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l
Если вам интересны те потоки, которые действительно активны - например, что-то делают (не заблокированы, не timed_waiting, не сообщают о «потоке запущен», а действительно ожидают поток данных), а не сидят без дела, а живут - - тогда вас может заинтересовать jstack-active .
Этот простой сценарий bash запускается, а jstack
затем фильтрует все потоки, которые по эвристике кажутся простаивающими, показывая вам трассировки стека для тех потоков, которые фактически потребляют циклы ЦП.
Если вам нужно количество потоков на пользователя в системе Linux, вы должны использовать:
ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'
где как использовать желаемое имя пользователя.