리눅스에서 프로세스의 스레드 수를 어떻게 모니터링 할 수 있습니까?


135

Linux에서 특정 프로세스가 사용하는 스레드 수를 모니터링하고 싶습니다. 프로세스 성능에 영향을주지 않고이 정보를 쉽게 얻을 수있는 방법이 있습니까?


응용 프로그램 프로세스가 짧은 시간 동안 만 실행되는 경우는 어떻습니까? (2 초 말하기)
user2023370

답변:


153

시험

ps huH p <PID_OF_U_PROCESS> | wc -l

또는 멈춤


3
테이블 헤더 1와 같은 줄을 인쇄하기 때문에 빼야한다고 생각합니다 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND.
AhmetB-Google

2
'h'는 헤더를 숨 깁니다.
thinkmassive

11
-1 왜 출력 wc할 수 ps -o thcount <pid>있을까요? 이 답변을 참조하십시오 .
흐름

74

주어진 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 }'

2
가장 유용한 답변은 여기입니다. 특히 watch명령. 그러나 thcount일부 (Red Hat ...)에는 사용 이 실패 할 수 있지만 참고 nlwp하십시오.
Joshua Detwiler

50

프로세스의 각 스레드는 아래에 디렉토리를 만듭니다 /proc/<pid>/task. 디렉토리 수를 세면 스레드 수가 있습니다.


1
위의 의견에 추가하십시오. 이 명령을 사용하여 스레드 수를 찾을 수 있습니다 find /proc/<PID>/task -maxdepth 1 -type d -print | wc -l.. <PID> 를 얻을 수 top있거나 사용할 수있는 프로세스 ID로 바꾸십시오ps
Navigatron


21

ps -eLf쉘에서 현재 시스템에서 실행중인 모든 스레드와 프로세스의 목록을 제공해야합니다. 또는 topcommand를 실행 한 다음 'H'를 눌러 스레드 목록을 토글 할 수 있습니다 .


이것은 나를위한 소스입니다. 하나의 프로세스로만 제한하고 싶지 않습니다. -p필요한 경우 다른 항목을 쉽게 추가 할 수 있습니다. 스레드 목록을 보는 데 필요한 최소값입니다.
Erick Robertson

6

JStack은 매우 저렴합니다. 하나의 옵션은 grep을 통해 출력을 파이프하여 활성 스레드를 찾은 다음 wc -l을 통해 파이프하는 것입니다.

보다 그래픽 적으로 주어진 프로세스의 스레드 수를 표시하는 JConsole이 있습니다.


6

사용하는 경우 :

ps uH p <PID_OF_U_PROCESS> | wc -l

"wc"행 중 하나가 counting "ps"명령의 헤더이므로 결과에서 1을 빼야합니다.


StackOverflow에 오신 것을 환영합니다. 아마도 이것은 slav0nic의 답변에 대한 의견이어야합니다. 그러나 내가 이해했듯이 SO에 처음 가입하면 명성을 얻을 때까지 답변에 댓글을 달 수 없으므로 답변을 추가하는 것은 할 수있는 모든 것입니다. 당신이 올바른지; 헤더 행을 ps스레드 중 하나로 계산해서는 안됩니다 .
Jonathan Leffler

6

주어진 프로세스의 스레드 수를 표시하는 명령은 다음과 같습니다.

ps -L -o pid= -p <pid> | wc -l

다른 ps기반 답변 과 달리 옵션 덕분에 헤더 행 1이 없으므로 출력에서 빼지 않아도됩니다 .ps-o pid=


5

$ ps H p pid-id

H-프로세스의 모든 개별 스레드를 나열합니다

또는

$cat /proc/pid-id/status

pid-id는 프로세스 ID입니다

예 : (아래 출력 잘라 내기)

root@abc:~# cat /proc/8443/status
Name:   abcdd
State:  S (sleeping)
Tgid:   8443
VmSwap:        0 kB
Threads:    4
SigQ:   0/256556
SigPnd: 0000000000000000

4

최신 JDK 배포판에는 JConsole 및 VisualVM이 제공됩니다. 둘 다 실행중인 Java 프로세스에서 더러운 세부 정보를 얻는 환상적인 도구입니다. 프로그래밍 방식으로이 작업을 수행해야하는 경우 JMX를 조사하십시오.


2

jvmtop 은 다른 메트릭 외에도 현재 jvm 스레드 수를 표시 할 수 있습니다.


2

가장 쉬운 방법은 "htop"을 사용하는 것입니다. 모든 코어, 프로세스 및 메모리 사용량을 보여주는 "htop"(보다 멋진 버전의 top)을 설치할 수 있습니다.

"Shift + H"를 눌러 모든 프로세스를 표시하거나 다시 눌러 숨 깁니다. 프로세스 이름을 검색하려면 "F4"키를 누르십시오.

우분투 또는 데비안에 설치하기 :

sudo apt-get install htop

Redhat 또는 CentOS에 설치 :

yum install htop
dnf install htop      [On Fedora 22+ releases]

소스 코드에서 "중지"를 컴파일하려면 여기에서 찾을 수 있습니다 .


1

주어진 pid에 대해 CPU를 사용하여 스레드 수를 찾으려면 다음을 사용하십시오.

top -bc -H -n2 -p <pid> | awk '{if ($9 != "0.0" && $1 ~ /^[0-9]+$/) print $1 }' | sort -u | wc -l

0

유휴 상태이지만 라이브 상태로 앉아있는 것과는 반대로 (블로킹되지 않고, timed_waiting하지 않고 "스레드 실행"을보고하지 않고 실제로 데이터를 제공하기를 기다리는) 스레드와 같이 실제로 활성 인 스레드에 관심이 있다면 - -jstack-active에 관심이있을 수 있습니다. .

이 간단한 bash 스크립트가 실행 jstack되면 휴리스틱에 의해 유휴 상태 인 것처럼 보이는 모든 스레드를 필터링하여 실제로 CPU 사이클을 소비하는 스레드에 대한 스택 추적을 표시합니다.



0

리눅스 시스템에서 사용자 당 스레드 수를 원한다면 다음을 사용해야합니다.

ps -eLf | grep <USER> | awk '{ num += $6 } END { print num }'

원하는 사용자 이름을 사용하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.