tsinfo
사용법
tsinfo -V
tsinfo [-c | -e] [-t n][-f][-p plist][-z zone][filter_options][-Z][-0][-o] [interval [count]]
tsinfo -a [-f][-p plist][-z zone][filter_options][-Z][-0][-o] [interval [count]]
tsinfo -S [-t n | -a] [-p plist][-z zone][filter_options][-Z][-0] [interval [count]]
tsinfo -M [-T second][-W wcpu] [-t n][-f][-z zone][filter_options][-Z][-0][-o] [interval [count]]
Options are as follows:
-0 insert DATE.TIME info at the first column
-a display all the threads
-c sort by CPU%; default option
-e sort by ELAPSED
-f print command name only insted of argument list
-M monitor threads
-o filter by runnable or onproc process
-p plist process list(separated by comma) to monitor
-t n the number of threads: 1 <= n <= 100; def: 20
-S summarize the number of system calls
-T second specify tracing time: 1 <= second <= 60; default: 1
-V show version
-W wcpu specify WCPU%: 0 <= wcpu <= 95; default: 90
-z zone filter by zone name
-Z print zone name in the output lines
filter_options [-g [!]strings | -G [!]cmd_names] [-u [!]users]
interval interval time(second)
count times to get the info
설명
tsinfo 명령어는 프로세스에 있는 각각의 쓰레드에 대한 정보를 보여준다.
옵션을 지정하지 않으면 CPU를 많이 사용하는 순서로 20개의 쓰레드 정보를 보여준다.
# tsinfo
PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL CMDLINE 0424.22:30:44
308 guest 1 1 IA 59 S 3.34% 3.34% 0d43688 04:10.6690 poll senddata
411 guest 1 7 IA 59 S 1.76% 1.76% 0d43659 39.8512 poll dtwm
3941 guest 1 1 IA 59 O 0.53% 0.53% 0d0 00.1101 read tsinfo
415 guest 1 1 IA 59 S 0.25% 0.25% 0d43653 54.2000 poll check_sys
519 guest 1 1 IA 59 S 0.21% 0.21% 0d38966 01:58.1173 poll netscape
3 root 1 1 SYS 59 S 0.06% 0.06% 0d43712 24.2534 [SYS] fsflush
432 guest 1 1 IA 59 S 0.05% 0.05% 0d43649 01.1522 waitsys /usr/bin/ksh
366 guest 1 1 IA 59 S 0.04% 0.04% 0d43667 02.2148 poll htt_server
310 root 5 12 TS 58 S 0.01% 0.01% 0d43685 10.4212 lwp_sema_wait mibiisa -r -p 32796
310 root 9 12 TS 58 S 0.01% 0.01% 0d43685 02.9419 lwp_sema_wait mibiisa -r -p 32796
0 root 1 1 SYS 59 T 0.00% 0.00% 0d43715 00.3342 [SYS] sched
1 root 1 1 TS 59 S 0.00% 0.00% 0d43712 00.0827 pause /etc/init -
... skip ...
|
특정 프로세스에 대한 쓰레드 정보만을 보고 싶으면, -p 옵션을 사용할 수 있다.
# tsinfo -p 188
PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL CMDLINE 0424.22:35:44
188 root 1 9 TS 59 S 0.20% 0.20% 0d12153 00.1512 poll /usr/sbin/syslogd
188 root 2 9 TS 59 S 0.00% 0.00% 0d12153 00.0012 signotifywait /usr/sbin/syslogd
188 root 3 9 TS 59 S 0.00% 0.00% 0d12153 00.0713 poll /usr/sbin/syslogd
188 root 4 9 TS 59 S 0.00% 0.00% 0d12153 00.0013 door /usr/sbin/syslogd
188 root 5 9 TS 59 S 0.00% 0.00% 0d12153 00.0017 lwp_sema_wait /usr/sbin/syslogd
188 root 6 9 TS 59 S 0.00% 0.00% 0d12152 00.0017 door /usr/sbin/syslogd
188 root 7 9 TS 59 S 0.00% 0.00% 0d12150 00.0020 lwp_sema_wait /usr/sbin/syslogd
188 root 8 9 TS 59 S 0.00% 0.00% 0d12142 00.0020 lwp_sema_wait /usr/sbin/syslogd
188 root 9 9 TS 59 S 0.00% 0.00% 0d8339 00.0020 lwp_cond_wait /usr/sbin/syslogd
|
특정 사용자의 쓰레드 정보만을 보고 싶으면, -u 옵션을 사용할 수 있다.
# tsinfo -u nobody
PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL CMDLINE 0424.22:38:58
835 nobody 1 1 TS 59 S 0.00% 0.00% 0d21827 00.0012 fcntl /usr/apache/bin/httpd
832 nobody 1 1 TS 59 S 0.00% 0.00% 0d21827 00.0018 accept /usr/apache/bin/httpd
833 nobody 1 1 TS 59 S 0.00% 0.00% 0d21827 00.0014 fcntl /usr/apache/bin/httpd
836 nobody 1 1 TS 59 S 0.00% 0.00% 0d21827 00.0014 fcntl /usr/apache/bin/httpd
834 nobody 1 1 TS 59 S 0.00% 0.00% 0d21827 00.0014 fcntl /usr/apache/bin/httpd
|
-Z 옵션을 사용하면, zone 정보도 함께 보여준다.
# tsinfo -Z
ZONE PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL CMDLINE 0424.22:40:23
global 7585 guest 1 1 TS 39 O 0.12% 0.12% 0d0 00.0268 read tsinfo -Z
global 3 root 1 1 SYS 60 S 0.07% 0.07% 0d18875 14.2349 [SYS] fsflush
global 715 root 1 1 IA 59 S 0.02% 0.02% 0d18818 04.5103 pollsys dtgreet -display :0
global 3829 guest 1 1 TS 49 S 0.02% 0.02% 0d15607 00.3115 waitsys -ksh
global 7562 guest 1 1 TS 59 S 0.02% 0.02% 0d504 00.3431 read vi tsinfo.html
global 510 root 1 1 TS 59 S 0.02% 0.02% 0d18832 02.5099 nanosleep /opt/JSparm/bin/mmonx -O
global 166 daemon 1 1 TS 59 S 0.00% 0.00% 0d18858 09.8555 nanosleep /usr/lib/rcap/rcapd
global 524 root 3 7 TS 59 S 0.00% 0.00% 0d18832 00.6956 lwp_park devfsadmd
global 661 root 1 1 TS 59 S 0.00% 0.00% 0d18824 01.1103 pollsys /usr/apache/bin/httpd
... skip ...
|
-S 옵션을 지정하면 각 쓰레드가 호출한 시스템 콜 별로 쓰레드 개수를 보여준다.
(개수가 많은 순서로 출력한다)
# tsinfo -S
COUNT SYSCALL
46 poll
41 [SYS]
25 lwp_sema_wait
16 signotifywait
13 door
12 lwp_cond_wait
10 read
8 waitsys
5 pause
3 accept
2 sigsuspend
1 ioctl
1 wait
1 open
1 [USER_MODE]
... skip ...
|
시스템 콜 이름에서 [SYS]는 시스템 콜 이름이 아니고 해당 쓰레드가 시스템 쓰레드라는 것을 나타내고,
[USER_MODE] 또한 시스템 콜 이름이 아니고, 해당 쓰레드가 사용자 코드에서 실행 중이라는 것을 나타낸다.
-S 옵션에서 [SYS] 에 대한 정보는 V10.2 부터 보여준다.
-M 옵션을 지정하면, 시스템에서 실행되고 있는 쓰레드들을 조사하여 WCPU%가 90%(-W 옵션으로 변경 가능) 이상인
쓰레드를 찾아서, 그 중에서 최대 20개(-t 옵션으로 변경 가능)를
1 초(-T 옵션으로 변경 가능) 동안 해당 쓰레드들이 CPU를 사용한 시간(D-TIME 컬럼에 표시됨)과
시스템 콜을 호출한 횟수(NSTSCALL 컬럼에 표시됨)를 조사하여,
CPU를 사용한 시간이 큰 순서로 출력한다.
이때, CPU를 사용한 시간이 없는 쓰레드 정보는 출력하지 않는다.
# tsinfo -M
2012/02/10 19:18:42 traced 1 thread for 1 second
PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL D-TIME NSYSCALL CMDLINE
5401 guest 3 10 TS 11 R 98.96% 98.96% 0d142 02:20.8498 [USER_MODE] 0.9884 0 send_data -p 1000
|
D-TIME 컬럼은 해당 쓰레드가 CPU를 사용한 시간을 표시한다.
NSYSCALL 컬럼은 해당 쓰레드가 시스템 콜을 호출한 횟수를 표시한다.
"Tracing 1 thread" 에서 1 이 의미하는 것은 WCPU%가 90 이상인 쓰레드가 1개 있다는 것을 의미한다.
send_data 프로세스의 쓰레드 ID가 3인 쓰레드는 1 초 동안 CPU를 00.9867 초를 사용하였데, 시스템 콜을 호출한 횟수는 0 이다.
이 쓰레드는 사용자 코드에서 CPU를 무한히 사용하는 무한 루프에 빠져 있는 것 처럼 보인다.
1 초 라는 시간은 좀 짧은 시간 같아서, 5 초 동안 쓰레드를 다시 모니터한 결과는 다음과 같다.
# tsinfo -M -T 5
2012/02/10 19:19:00 traced 1 thread for 5 seconds
PID USERNAME LWPID NLWP CLS PRI S WCPU% CPU% ELAPSED TIME SYSCALL D-TIME NSYSCALL CMDLINE
5401 guest 3 10 TS 40 R 98.84% 98.84% 0d160 02:38.3011 [USER_MODE] 4.8781 0 send_data -p 1000
|
send_data 프로로세스의 3번 쓰레드를 5 초 동안 모니터 하여도 시스템 콜을 전혀 호출하지 않고 CPU만 계속해서 사용했다.
(5 초 동안 4.8781초를 혼자서 사용했음)
5 초 동안 시스템 콜을 호출하지 않았다고, 그 쓰레드가 무한 루프에 빠져 있다고 100% 장담할 수는 없지만
거의 대부분이 무한 루프에 빠져 있다고 볼 수 있다. (잘 못 된 코딩에 의한 버그라고 판단되어 진다)
좀 더 자세히 분석하려면, 다음과 같이 procinfo 명령어를 사용하여
해당 쓰레드를 좀 더 관찰할 수 있다.
다음은 프로세스 ID 5401 번의 쓰레드 ID 3 번에 대한 동작을 추적하였다.
# procinfo -p 5401 -l -L 3 5
CMDLINE: send_data -p 1000
PID USERNAME S LWPID NLWP WCPU% CPU% ELAPSED D-WCPU% D-CPU% D-UTIME D-STIME CTX iCTX RW SYSCALL SYSCALL-NAME 0424.22:55:40
5401 guest R 3 10 94.03% 94.03% 0d254 99.10% 99.10% 4.9549 0.0000 83.4 83.4 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 95.10% 95.10% 0d259 99.14% 99.14% 4.9573 0.0000 84.2 84.2 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 95.83% 95.83% 0d264 98.62% 98.62% 4.9310 0.0000 80.2 80.2 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 96.53% 96.53% 0d269 99.15% 99.15% 4.9576 0.0000 78.2 78.2 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 97.03% 97.03% 0d274 98.87% 98.87% 4.9354 0.0000 77.3 77.3 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 97.46% 97.46% 0d279 99.05% 99.05% 4.9524 0.0000 83.8 83.8 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 97.81% 97.81% 0d284 99.11% 99.11% 4.9556 0.0000 84.4 84.4 0.000K 0.0 [USER_MODE]
5401 guest R 3 10 98.11% 98.11% 0d289 99.24% 99.24% 4.9620 0.0000 84.2 84.2 0.000K 0.0 [USER_MODE]
|
위의 procinfo 명령어의 결과에서 보듯이 이 쓰레드는 CPU 만 계속 사용하고,
시스템 콜은 전혀 호출되지 않는다.
(procinfo 명령어에서 SYSCALL 컬럼에 있는 값은 초당 시스템 콜을 호출한 횟수이다.)
-M 옵션을 이용하면 비정상적으로 동작하는 쓰레드를 쉽게 찾을 수 있다.
비정상적 쓰레드에는 2 가지 종류가 있다.
첫번째, 모니터하는 시간 동안 CPU를 거의 다 사용하면서 시스템 콜을 전혀 호출하지 않는 쓰레드
두번째, 모니터하는 시간 동안 CPU를 거의 다 사용하면서 오류가 난 시스템 콜을 무한 반복 호출하는 쓰레드
다음은 tsinfo 명령어의 헤더 정보이다.
필드 | 설명 |
DATE.TIME |
tsinfo 명령어를 실행한 시간을 다음과 같은 형식으로 표시한다.
mmdd.HH:MM.SS
이 컬럼은 -0 옵션을 사용할 경우에 출력된다.
|
ZONE | 프로세스가 실행되고 있는 zone을 표시 (-Z 옵션 사용시에 표시됨) |
PID | 프로세스 ID |
USERNAME | 사용자명 |
LWPID | 프로세스에 있는 LWP((light-weight process) ID |
NLWP | 프로세스에 있는 LWP((light-weight process) 개수
쓰레드에는 커널 쓰레드와 유저 쓰레드가 있다. CPU의 스케줄링 단위는
커널 쓰레드 단위이다. 일반적으로 쓰레드라고 말하면 커널 쓰레드를 의미하는 경우가
많다.
LWP는 커널 쓰레드와 일대일로 멥핑되어 있다. LWP를 커널 쓰레드로 보아도 좋다.
|
CLS | 스케줄 클래스
Solaris에는 다음과 같은 스케줄 클래스가 존재한다.
RT (Real-Time class)
SYS (System class)
TS (Time-Sharing class)
IA (Inter-Active class)
FSS (Fair-Share System class)
FX (Fixed priority class)
|
PRI | 쓰레드의 우선순위(priority)
숫자가 큰 것이 높은 우선순위이다.
|
S | LWP의 상태(state)를 표시한다.
S Sleeping process
O process On processor
R Runnable process
Z Zombie state
T process stopped ether by a job control signal or because of
being Traced.
|
CPU% WCPU% | CPU%는 CPU 사용량의 백분률
WCPU%(weighted CPU%) = CPU% * processor 개수
WCPU%란 각 LWP가 사용한 CPU 사용률을 CPU가 1 개인 시스템에 비례한
사용률을 말한다. 예를 들면, CPU가 4개인 시스템에서 CPU%가 20%이면
WCPU%는 80%(20*4)가 된다.
|
ELAPSED | LWP가 시작한 후에 경과된 시간(second)
형식: day d second
1d12419: 1일 12419초가 경과함 |
TIME | LWP가 지금까지 사용한 CPU 사용량(사용시간)
형식: [[[day-]HH:]MM:]SS.nnnn (nn은 1/10000초)
|
SYSCALL |
시스템 콜 정보를 보여준다. 시스템 콜 정보와 관계없는 두 가지 상태가 있다.
[USER_MODE] : LWP가 시스템 콜 상태에 있는 것이 아니고, 사용자 모드에 있음
[SYS] : 시스템 프로세스(0:sched, 2:pageout, 3:pageout, 4:fsflush)는
시스템 콜을 하지 않는다. 원래 부터 시스템 내부에 있다.
tsinfo에서 시스템 콜 정보를 나타낼 때, 시스템 콜에 대한 서브코드에 대한 정보는
보여주지 않는다.
시스템 콜에 대한 자세한 내용은 /usr/include/sys/syscall.h 파일을 참조하십시오.
|
D-TIME |
-M 옵션을 사용할 때, 쓰레드 상태를 모니터링하는 동안에 그 쓰레드가 사용한 CPU 시간을 표시한다.
|
NSYSCALL |
-M 옵션을 사용할 때, 쓰레드 상태를 모니터링하는 동안에 그 쓰레드가 호출한 시스템 콜을 횟수를 표시한다.
|
CMDLINE | 명령어 및 인수 |
CMD | 명령어 패스의 마지막 파일명
예를 들어 명령어가 /usr/openwin/bin/htt -nosm 경우에 htt을 나타낸다.
/usr/openwin/bin/htt -nosm ---> htt
이 컬럼은 -f 옵션을 사용할 경우에 출력된다.
CMD 또는 CMDLINE에 "???"가 나타날 수 있다.
tsinfo 명령어는 모든 쓰레드의 정보를 수집하고 나서, CPU 사용률이 높은 순으로 다시
프로세스 정보를 수집하는데, 그 중간에 프로세스가 종료되면 "???"로 표시한다.
것은 의미한다. 이때 USERNAME에도 "?"가 나타난다.
|
mmdd.HHMMSS | 명령어를 실행한 시간을 표시한다.
월일.시:분:초
|
다음은 tsinfo 명령어의 옵션이다.
옵션 | 설명 |
-0 |
-0 옵션을 지정하면, 첫 컬럼에 날짜와 시간 정보를 출력하게 한다.
|
-a |
-a 옵션을 사용하면 LWP 전체를 보여주며, -c 또는 -e 옵션을 지정해도
출력되는 LWP의 정열 순서는 없다.
|
-c |
-c 옵션을 지정하면 CPU 사용률이 높은 순서로 쓰레드 정보를 보여준다.
이 옵션은 디폴트 옵션이다.
|
-e |
-e 옵션을 지정하면 최근에 생성된 순서로 쓰레드 정보를 보여준다.
|
-f |
-f 옵션을 지정하면 명령어와 인수(CMDLINE) 대신에 명령어 이름(CMD)만 출력한다.
|
-M |
-M 옵션을 지정하면, 시스템에서 실행되고 있는 쓰레드들을 조사하여 WCPU%가 90%(-W 옵션으로 변경 가능) 이상인
쓰레드를 찾아서,
1 초(-T 옵션으로 변경 가능) 동안 해당 쓰레드들이 CPU를 사용한 시간(D-TIME 컬럼에 표시됨)과
시스템 콜의 횟수(NSTSCALL 컬럼에 표시됨)를 조사하여,
CPU를 사용한 시간이 큰 순서로 출력한다.
이때 CPU를 사용한 시간이 없는 쓰레드 정보는 출력하지 않는다.
|
-o |
-o 옵션을 지정하면, 해당 쓰레드가 'runnable' 이거나 'onproc' 상태에 있는 쓰레드에 대하여 조사한다.
runnable: 쓰레드가 CPU를 사용하기 위해 기다리는 상태
onproc: 쓰레드가 현재 CPU를 사용하고 있는 상태
|
-p plist |
-p plist 옵션을 지정하면 지정한 프로세스에 대한 LWP 정보를 보여준다.
여러 개의 프로세스를 지정하려면, 콤마로 분리하여 지정하면 된다.
|
-t n |
-t 옵션을 지정하지 않으면 CPU를 많이 사용하는 순서로 20개의 LWP 정보를 보여준다.
이 옵션을 지정하면 지정한 만큼의 LWP 정보를 보여준다.
최대 50까지 지정할 수 있다. 50 이상이면 50으로 지정된다.
|
-S |
-S 옵션을 지정하면 각 쓰레드가 호출한 시스템 콜 별로 쓰레드 개수를 보여준다.
-a 옵션이 지정되지 않으면 상위 20개의 데이타만 보여준다. (-t 옵션으로 개수 조정가능).
-a 옵션이 지정되면 모든 데이타가 출력된다. 정렬 순서도 시스템 콜 횟수가 많은 순으로 정렬된다.
|
-T second |
-M 옵션을 사용하여 쓰레드를 모니터할 때, 쓰레드의 WCPU%가 90 이상인 쓰레드에 대하여,
1 초 동안 해당 쓰레드들의 시스템 콜 횟수를 조사한다.
-T 옵션을 지정하면 이 시간을 바꿀 수 있다.
이 값의 범위는 1 에서 60 사이이다.
디폴트 값은 1 이고,
60 보다 크면 60로 지정한다.
|
-V |
-V 옵션을 지정하면, 명령어의 버전 정보를 보여준다.
|
-W wcpu |
-M 옵션을 사용하여 쓰레드를 모니터할 때, 쓰레드의 WCPU%가 90 이상인 쓰레드에 대하여, 해당 쓰레드들의 시스템 콜 횟수를
조사한다.
-W 옵션을 지정하면 이 값을 바꿀 수 있다.
이 값의 범위는 0 에서 95 사이이다.
디폴트 값은 90 이고,
95 보다 크면 95로 지정한다.
|
-Z |
-Z 옵션을 지정하면, 해당 프로세스가 실행되고 있는 Zone 이름도 보여준다.
|
-z zone |
-z 옵션에 zone 이름이나 zone ID를 지정하면, 해당 Zone에서 실행되고 있는 프로세스 정보만 보여준다.
|
filter_options |
filter_options 옵션에는 다음과 같다.
-g [!]strings | -G [!]cmd_names
-u [!]users
-g [!]strings | -G [!]cmd_names
|
-g 또는 -G 옵션에 일치하는 문자열을 가지고 있는 프로세스 정보에 대해서만 처리한다.
여러 개를 지정할 때에는 콤마로 구분한다.
string의 맨 첫글자에 ! 를 지정하면, 지정한 string과 일치하지 않은 프로세스 정보에 대해서만 처리한다.
-G httpd,java
-G !httpd,java
-g ora_
-g !ora
-g "java -server"
|
-u [!]users
|
-u 옵션에는 사용자 이름을 지정한다. 지정한 사용자 이름과 일치하는 프로세스 정보에 대해서만 처리한다.
여러 개를 지정할 때에는 콤마로 구분한다.
user 이름의 맨 첫글자에 ! 를 지정하면, 지정한 user 이름과 일치하지 않은 프로세스 정보에 대해서만 처리한다.
-u root
-u guest1,guest2
-u !root,nobody
|
|
interval [count] |
interval의 시간 간격으로 count 횟수 만큼 반복하여 프로세스 정보를 수집한다.
count를 지정하지 않으면, 지정한 시간 간격으로 무한히 반복한다.
데이타를 수집할 때, 지정한 시간 간격으로 데이타를 수집한다.
그런데 지정한 시간 간격이 지나도 앞 시간대의 정보를 모두 수집하지 못 했을 때
그 시간대의 데이타는 수집하지 않고 다음 데이타 수집 시간에 데이타를 수집한다.
|
|