tsinfo

   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)
숫자가 큰 것이 높은 우선순위이다.
SLWP의 상태(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)가 된다.
ELAPSEDLWP가 시작한 후에 경과된 시간(second)
형식: day d second
1d12419:   1일 12419초가 경과함
TIMELWP가 지금까지 사용한 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를 지정하지 않으면, 지정한 시간 간격으로 무한히 반복한다.

데이타를 수집할 때, 지정한 시간 간격으로 데이타를 수집한다. 그런데 지정한 시간 간격이 지나도 앞 시간대의 정보를 모두 수집하지 못 했을 때 그 시간대의 데이타는 수집하지 않고 다음 데이타 수집 시간에 데이타를 수집한다.