1. Parm 이란 2. 설치방법 3. 라이센스 설치방법 4. 기본 사용법 5. Parm의 명령어 6. 구성파일 및 포트번호

 4. 기본 사용법

4.1  getdata,   mkrep.sh
4.2  psinfo,   psparse
4.3  jtop
4.4  ParmView,   mmonx   get_mdbxx
4.5  ParmClient(sysmon.exe, hostview.exe),   parmagentx
4.6  cpuviewd   cpuview.exe
4.7  Log file Monitoring tool
4.8  mkgraph
4.9  mkchart
4.10  dolog
4.11  tsinfo
4.12  procinfo
4.13  proctime
4.14  jsyscall
4.15  jsyserr
4.16  jmeminfo
4.17  netinfo
4.18  tcpinfo
4.19  imglist
4.20  jhexdump
4.21  jtab
4.22  jsum
4.23  jcal
4.24  timecheck
4.25  jwget
4.26  jfind,   jfparse
4.27  jsysexec
4.28  jsystcp
4.29  jsysudp
4.30  rmtimef

  4.1 getdata,   mkrep.sh

getdata 명령어를 사용하여 시스템 통계정보를 한번에 필요한 데이타를 수집하고, 수집한 데이타에 대하여 mkrep.sh 명령어를 사용하여 HTML 페이지를 만든다.
mkrep.shgetdata 명령어를 사용하여 수집한 vmstat, iostat, netstat, mpstat, psinfo 명령어의 결과물에 대하여, gvmstat, giostat, gnetstat, gmpstat, gpsinfo 명령어를 사용하여 HTML 페이지를 만들어 준다.
getdata 명령어로 데이타를 수집할 경우, 수집할 데이타의 횟수가 480 - 600 번 되는 것이, 그래프를 만드는데 알맞은 크기이다. 수집한 데이타의 횟수가 너무 크면, 한 화면에서 HTML 페이지를 보기 힘들고, 프린트로 출력할 경우에도 보기가 좋지 않다.

다음은 60 초 간격으로 8시간 동안 데이타를 수집하는 예제이다.

# getdata -i 60 -t 8
Start to gather system info: interval 60 seconds, time: 8
Collecting data: vmstat iostat netstat mpstat
Data directory: ./data.20010608.093000.60

60초 간격으로 8 시간 동안 480번 데이타를 수집한다. 이때 수집하는 데이타는 vmstat, iostat, netstat, mpstat 명령어의 결과이다.

전체 프로세스 정보를 함께 수집하고 싶으면, -A 옵션을 지정하여getdata 명령어를 실행하면 된다.
# getdata -A -i 60 -t 8	;  60초 간격으로 8시간 데이타를 수집한다.
# getdata -A -i 120 -t 12	;  120초 간격으로 8시간 데이타를 수집한다.
# getdata -A -i 180 -t 24	;  180초 간격으로 8시간 데이타를 수집한다.

이때 수집하는 데이타는 vmstat, iostat, netstat, psinfo 명령어의 결과이다.

또한 프로세스의 상태와 CPU 사용량을 간단히 조사하려면, 다음과 같은 명령어를 사용할 수 있다. # getdata -G vp -i 60 -t 8

이때 수집하는 데이타는 vmstat, psinfo 명령어의 결과이다. 이렇게 수집한 데이타는 gvmstat 명령어로 vmstat.log 파일을 가공하여 그래프를 그리고, CPU가 많이 사용된 시점이 있으면 어떤 프로세스가 CPU를 많이 사용하는지 psinfo.log 파일을 조사하여 알 수 있다.

getdata 명령어로 수집한 데이타에 대하여 리포트를 만들 경우, 데이타를 수집한 디렉토리 안에서 mkrep.sh 명령어를 실행하면 된다.

# cd data.20010608.093000.30
# mkrep.sh simple Junsoft
Top web page is index_simple.html
mkrep.sh 명령어는 getdata 명령어로 수집한 데이타에 대하여, GIF 파일과 HTML 파일을 현재 디렉토리에 만들어 준다. 그 중에 index_simple.html 파일은 전체를 보여주는 HTML 파일이다.
시스템에 netscape가 있을 경우, 다음과 같은 명령어로 index_simple.html 파일을 볼 수 있다. # netscape file:///`pwd`/index_simple.html 리모트 시스템에서 이 파일을 액세스하려면, 다음과 같이 미니 웹 서버 gwserv를 실행하여 액세스할 수 있다.
# gwserv
gwserv is started on port 8008
옵션 없이 gwserv를 실행하면, 현재 디렉토리를 도큐멘트의 루트 디렉토리로 사용하고, 8008 포트에서 HTTP 서비스를 수행한다.
이 경우에 리모트 시스템에서는 다음과 같은 URL로 index_simple.html 파일을 액세스할 수 있다.
(이 시스템 명은 dragon이다.) http://dragon:8008/index_simple.html

getdata 명령어는 시스템의 성능상에 문제가 있을 때 일시적으로 데이타를 수집하는 것이고, 평상시에는 mmonx가 수집하는 데이타를 ParmView로 보는 것으로 충분하다.

  4.2 psinfo,   psparse

psinfo 명령어는 프로세스의 상태정보를 보여주는 명령어이다.
psparse 명령어는 psinfo 명령어가 수집한 데이타를 분석하는 명령어이다.

psinfo 명령어를 옵션 없이 실행하면, CPU 사용률이 제일 많은 순서로 20개의 프로세스를 화면에 출력한다. 이 결과를 가지고 시스템에서 CPU를 많이 사용하고 있는 프로세스가 무엇인지 확인할 수 있다.

# psinfo
Date.time 0729.12:45:34 proc 173 zomb 0 run 1 lwp 234 cpu 10.11% load1m 0.11 ptime 1208.0834 hp+stk 280.8M
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
  315   829 root     20.67M 19.37M 7.492M S    1   3.76%  3.76% 15.9%  0d33544    10:12.0102 netscape
  471   389 guest    7.719M 4.977M 1.289M S    6   1.67%  1.67%  4.1%  0d33407    02:00.0102 dtwm
  526   425 guest    13.60M 10.68M 7.781M S    1   1.30%  1.30%  8.7%  0d33395       34.1232 dtterm -sdtserver
 3216  1222 root     1.078M 0.906M 0.070M O    1   1.10%  1.10%  0.7%     0d10       19.0832 gwserv
 3870  2484 root     4.445M 3.930M 0.469M S    1   0.17%  0.17%  3.2%   0d2043       05.6749 perfmon
... skip ...

또한 -h 옵션을 사용하면, 프로세스가 실행되면서 다이나믹하게 할당 받은 메모리 크기 순서로 정렬하여 볼 수 있다.

# /opt/JSparm/bin/psinfo -h
Date.time 0123.12:27:07 proc 119 zomb 5 run 2 lwp 324 cpu 15.26% load1m 0.24 ptime 3298.2787 hp+stk 250.3M
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
19440 19438 guest    131.0M 84.38M 107.4M R    1   4.90%  4.90% 17.0%  8d73139 03:00:59.8623 netscape
13217 13216 nobody   44.42M 10.82M 26.12M S   59   0.00%  0.00%  2.2%   1d7702       16.1458 ns-httpd -d config
  200     1 root     6.070M 1.555M 2.875M S   10   0.00%  0.00%  0.3% 58d11424       16.6110 /usr/sbin/syslogd
  283     1 oracle   63.89M 41.88M 2.547M S    1   0.00%  0.00%  8.5% 58d11409       09.8534 ora_pmon_SOL
19345 19325 guest    9.258M 6.805M 2.141M S    7   0.68%  0.68%  1.4%  8d73245    05:59.8349 dtwm
19904 19903 guest    7.172M 4.438M 1.594M S    1   0.00%  0.00%  0.9%  8d66806       09.3740 dtpad -server
19339     1 guest    4.383M 3.250M 1.266M S    4   0.00%  0.00%  0.7%  8d73246       26.7633 /usr/dt/bin/ttsession
  285     1 oracle   63.02M 44.93M 1.258M S   22   0.00%  0.00%  9.1% 58d11409       02.3392 ora_dbw0_SOL
  ... skip ...

프로세스가 메모리를 할당 받으면, 그 메모리는 heap 영역을 차지한다. 만일 프로세스의 heap의 크기가 큰 프로세스가 있다면, 프로세스가 그 만큼의 메모리를 차지하는 프로세스인지 판단하여야 한다. 만일 프로그램의 특성상 메모리를 많이 사용할 필요가 없는 프로세스가 메모리를 많이 사용한다면, 그 프로세스가 메모리를 잘못 관리하기 때문이다.

-e 옵션을 사용하면, 최근에 실행된 순서로 프로세스 정보를 보여준다.

# /opt/JSparm/bin/psinfo -e
Date.time 0312.21:37:59 proc 69 zomb 1 run 0 lwp 150 cpu 1.49% load1m 0.05 ptime 12380.2334 hp+stk 67.21M
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
 1812  1811 root     1.242M 1.008M 0.117M O    1   0.29%  0.29%  0.8%      0d0       00.0623 psinfo -e
 1811   432 root     0.289M 0.289M 0.023M S    1   0.27%  0.27%  0.2%      0d5       00.0732 sh
 1813   407 guest    1.711M 1.180M 0.039M S    1   0.03%  0.03%  1.0%     0d29       00.0346 more /etc/termcap
 1791     1 root     0.672M 0.305M 0.062M S    1   0.00%  0.00%  0.3%    0d416       00.0500 /sbin/dhcpagent
 1788   419 root     0.289M 0.289M 0.023M S    1   0.00%  0.00%  0.2%    0d421       00.0602 sh
 1791     1 root     0.672M 0.305M 0.062M S    1   0.00%  0.00%  0.3%    0d535       00.0523 /sbin/dhcpagent
 1788   419 root     0.289M 0.289M 0.023M S    1   0.00%  0.00%  0.2%    0d540       00.0602 sh
  723   722 guest    20.00M 4.672M 0.148M S    1   0.00%  0.00%  3.9%   0d5196       00.1629 (dns helper)
  722   427 guest    42.64M 34.20M 20.82M S    1   0.04%  0.04% 28.8%   0d5196    01:04.3402 /opt/netscape/netscape
  432   391 guest    1.828M 1.219M 0.055M S    1   0.00%  0.00%  1.0%    1d340       00.8355 /usr/bin/ksh
  ... skip ...

만일 60초 간격으로 100회 동안 CPU를 많이 사용하는 프로세스 순서로 보고 싶다면, 다음과 같이 할 수 있다.

# psinfo 60 100
... skip ...

이 옵션을 사용하여 최근에 실행된 프로세스가 무엇인지 확인할 수 있다. 여기서 ELAPSED에 표시된 숫자의 의미는 다음과 같다.

days d seconds

1d340은 그 프로세스가 실행된지 1일 340초가 지났다는 의미이다. 즉, 그 프로세스가 1일 340초 전에 실행되었다는 것을 의미한다.

psinfo 명령어의 옵션을 사용하면, 다음과 같은 컬럼에 대하여 정렬하는 순서를 지정할 수 있다.

컬럼 설명 옵션
SIZE 메모리가 큰 프로세스 순서 psinfo -s
RSS 프로세스 메모리 중에 물리적 메모리에 많이 적재된 프로세스 순서 psinfo -r
HP+STK Heap 과 Stack을 더한 크기가 큰 프로세스 순서 psinfo -h
NLWP LWP(light-weight process)가 많은 프로세스 순서 psinfo -l
WCPU%, CPU% CPU 사용률이 많은 프로세스 순서
WCPU% = CPU% * number of processors(CPU)
psinfo [-c]
MEM% 메모리 사용률이 많은 프로세스 순서(RSS 순서와 같음) psinfo -m
ELAPSED 최근에 실행된 프로세스 순서 psinfo -e
TIME CPU의 누적 사용시간이 많은 프로세스 순서 psinfo -T
CHILDTIME 자식 프로세스의 CPU의 누적 사용시간이 많은 프로세스 순서 psinfo -C
NPROC 프로세스 개수가 많은 순서.( -S 또는 -U 옵션에서만 사용 가능) psinfo -S -n
-f 옵션을 사용하면, 80 컬럼 터미널에 맞게 출력되도록 몇 개의 컬럼을 표시하지 않고, 명령어 라인 대신 명령어 이름(CMD)만 표시한다.

# /opt/JSparm/bin/psinfo -f
Date.time 0312.21:54:37 proc 69 zomb 0 run 0 lwp 151 cpu 5.44% load1m 0.07 ptime 12380.7330 hp+stk 67.35M
  PID USERNAME HP+STK S NLWP   WCPU%   CPU%  ELAPSED          TIME CMD
  272 guest    14.71M S    1   2.09%  2.09%   0d9430    02:10.2363 Xsun
  722 guest    20.82M S    1   1.29%  1.29%   0d6194    01:35.2238 netscape
 1808 guest    0.047M S    1   0.72%  0.72%   0d1103       01.3934 vi
  391 guest    7.484M S    1   0.46%  0.46%   0d9360       21.3402 dtterm
  330 guest    10.78M S   15   0.35%  0.35%   0d9378       22.1340 java
 1821 root     0.117M O    1   0.29%  0.29%      0d0       00.0623 psinfo
  390 guest    1.070M S    1   0.10%  0.10%   0d9360       00.6134 dtterm
  371 guest    1.633M S    8   0.09%  0.09%   0d9369       20.2816 dtwm
  271 root     0.164M S   12   0.02%  0.02%   0d9432       04.3581 mibiisa
    3 root     0.016M S    1   0.02%  0.02%   0d9492       03.8195 fsflush
    0 root     0.016M T    1   0.00%  0.00%   0d9495       00.2208 sched
    1 root     0.078M S    1   0.00%  0.00%   0d9492       00.1430 init
  ... skip ...

모든 프로세스의 내용을 보려면,   # psinfo -a 를 사용할 수 있다. 이 경우에는 프로세스의 정렬 순서는 없다.

만일 특정 프로세스를 계속 모니터하고 싶을 경우에는 다음과 같이 -p 옵션을 사용할 수 있다.

# psinfo -p 1964 5
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED           TIME CMDLINE
 1964  1911 guest    1.227M 1.000M 0.039M R    1   1.73%  1.73%  0.8%      0d6       00.3212 find / -print
 1964  1911 guest    1.227M 1.000M 0.039M S    1   2.68%  2.68%  0.8%     0d11       00.6710 find / -print
 1964  1911 guest    1.227M 1.000M 0.039M R    1   3.49%  3.49%  0.8%     0d16       01.2929 find / -print
 1964  1911 guest    1.227M 1.000M 0.039M S    1   4.44%  4.44%  0.8%     0d21       01.7935 find / -print
 1964  1911 guest    1.227M 1.000M 0.039M S    1   4.77%  4.77%  0.8%     0d26       01.9333 find / -print
 1964  1911 guest    1.227M 1.000M 0.039M S    1   5.03%  5.03%  0.8%     0d31       02.2391 find / -print
 ... skip ...

위의 명령어는 PID 1964인 프로세스를 5초 간격으로 조사하여 화면에 출력한다.

만일, 일정 조건에 해당하는 프로세스를 주기적으로 관찰하려면, 다음과 같이 -M 옵션을 사용할 수 있다.

# psinfo -M wcpu=70,hs=40 60
    Date.time   PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
0421.09:54:20  1652  1646 guest    28.93M 22.04M 13.71M S    1  72.35% 72.35% 18.0%    0d520    01:50.0230 a.out
0421.09:55:20  1652  1646 guest    28.93M 22.04M 13.71M S    1  74.05% 74.05% 18.0%    0d580    02:30.2395 a.out
0421.09:56:20  1652  1646 guest    28.93M 22.04M 13.71M S    1  73.35% 73.35% 18.0%    0d640    03:10.1359 a.out
 ... skip ...

위의 명령어는 60초 간격으로 WCPU 사용률이 70% 이상이거나 HP+STK(heap+stack)의 크기가 40MB 이상인 프로세스를 화면에 출력한다.

특정 프로세스 이름만 보고 싶으면, -G 옵션을 사용하여 프로세스명을 지정할 수 있다.

# psinfo -G ksh
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
 1725  1722 guest    1.969M 1.531M 0.047M S    1   0.00%  0.00%  1.3%  0d23798       00.1995 /bin/ksh
  460   456 guest    1.953M 1.383M 0.047M S    1   0.00%  0.00%  1.1%  0d36693       01.1701 /bin/ksh
  468   461 guest    1.969M 1.430M 0.047M S    1   0.00%  0.00%  1.2%  0d36692       00.4239 /bin/ksh -o vi
  471   462 guest    1.953M 1.336M 0.047M S    1   0.00%  0.00%  1.1%  0d36692       01.2345 /bin/ksh

-g 옵션에 CMDLINE에 있는 임의의 문자열을 지정하여 일치되는 프로세스 정보를 볼 수도 있다.

# psinfo -g vi
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
 1145   440 guest    1.914M 1.352M 0.027M S    1   0.00%  0.00%  1.1%    0d917       00.8612 vi readme
 1159   428 guest    1.664M 1.273M 0.047M R    1   0.08%  0.08%  1.0%     0d49       00.2692 /bin/ksh -o vi
 1162  1159 guest    1.086M 0.930M 0.070M O    1   0.19%  0.19%  0.8%      0d0       00.0822 psinfo -g vi
 1157   434 guest    1.914M 1.469M 0.027M S    1   0.01%  0.01%  1.2%    0d462       00.9607 vi /etc/termcap

-S 옵션을 사용하면, 시스템에서 같은 이름을 가진 프로세스들을 하나로 그룹핑하여 각 프로세스에 대하여 다음과 같은 내용을 보여준다.

# psinfo -S
Date.time 1016.23:37:09 proc 65 zomb 0 run 0 lwp 144 cpu 1.63% load1m 0.03 ptime 12450.6689 hp+stk 40.93M
         COMMAND NPROC  NLWP    WCPU%    CPU%   HP+STK   MAX_SZ  MAX_RSS   MAX_HS  ELAPSED          TIME     CHILDTIME
            java     2    33    0.42%   0.42%   37.99M   174.0M   63.08M   32.32M  0d18435    01:31.7445       03.3300
         fsflush     1     1    0.20%   0.20%   0.008M   0.000M   0.000M   0.008M  0d19186       16.1461       00.0000
 gnome-netstatus     1     1    0.15%   0.15%   3.312M   69.81M   8.402M   3.312M  0d18446       27.4741       00.0000
              sh     1     1    0.07%   0.07%   0.012M   3.105M   1.105M   0.012M     0d19       00.0364       00.0000
            Xorg     1     1    0.05%   0.05%   20.67M   54.48M   11.67M   20.67M  0d19157       10.8972       00.3000
  gnome-terminal     1     2    0.05%   0.05%   6.523M   153.6M   10.73M   6.523M  0d18442       10.0028       00.0000
   mixer_applet2     1     1    0.04%   0.04%   0.523M   67.03M   7.238M   0.523M  0d18445       07.3121       00.0000
          psinfo     1     1    0.04%   0.04%   0.453M   2.230M   1.320M   0.453M      0d0       00.0078       00.0000
     gnome-panel     1     1    0.01%   0.01%   15.32M   135.6M   11.21M   15.32M  0d18450       03.6375       00.0000
 composite_aux_g     1     1    0.01%   0.01%   3.785M   117.6M   7.465M   3.785M  0d18454       02.6747       00.0000
             ksh     6     6    0.01%   0.01%   0.270M   3.500M   1.289M   0.047M   0d9967       02.4933    07:18.6700
              vi     2     2    0.01%   0.01%   0.062M   4.133M   1.680M   0.031M    0d459       00.3021       00.0000
           mmonx     1     1    0.01%   0.01%   0.594M   3.566M   0.977M   0.594M  0d19160       01.6248       00.0000
        devfsadm     1     7    0.00%   0.00%   0.309M   5.188M   1.035M   0.309M  0d19159       00.7336       00.0000
            nscd     1    30    0.00%   0.00%   1.711M   6.945M   2.168M   1.711M  0d19173       01.2140       00.0000
           iiimx     1     1    0.00%   0.00%   0.105M   3.777M   0.992M   0.105M  0d18464       00.0139       00.2300
            kcfd     1     3    0.00%   0.00%   0.367M   4.211M   1.691M   0.367M  0d19174       00.1758       00.0000
        Xsession     1     1    0.00%   0.00%   0.070M   3.242M   0.695M   0.070M  0d18465       00.0735       00.1600
        sendmail     2     2    0.00%   0.00%   1.016M   9.137M   1.453M   0.508M  0d19101       00.7930       00.1100
        iiim-xbe     1     3    0.00%   0.00%   0.312M   8.953M   1.703M   0.312M  0d18458       00.0579       00.0000

-U 옵션을 사용하면, 같은 사용자명을 가진 프로세스들을 하나로 그룹핑하여 각 사용자에 대하여 다음과 같은 내용을 보여준다.

# psinfo -U
Date.time 1017.00:24:21 proc 65 zomb 0 run 0 lwp 144 cpu 1.69% load1m 0.08 ptime 12680.2382 hp+stk 41.00M
        USERNAME NPROC  NLWP    WCPU%    CPU%   HP+STK   MAX_SZ  MAX_RSS   MAX_HS  ELAPSED          TIME     CHILDTIME
           guest    41    67    0.63%   0.63%   125.9M   174.0M   15.37M   24.46M    0d511    02:02.7105    07:22.7400
            root    40   169    0.36%   0.36%   29.78M   14.96M   2.555M   7.895M      0d0    01:14.2755       04.9100
        noaccess     1    18    0.14%   0.14%   32.32M   128.3M   63.19M   32.32M  0d19200       44.8103       00.0000
          daemon     2     4    0.00%   0.00%   0.855M   4.211M   1.691M   0.488M  0d19216       00.1785       00.0000
           smmsp     1     1    0.00%   0.00%   0.508M   9.137M   0.695M   0.508M  0d19153       00.0970       00.0400

-o 옵션을 사용하면, 현재 CPU를 사용하고 있는 프로세스와 CPU를 사용하기 위해 Run Queue에 대기하고 있는 프로세스 정보를 보여준다.

# psinfo -o
  PID  PPID USERNAME   SIZE    RSS HP+STK S NLWP   WCPU%   CPU%  MEM%  ELAPSED          TIME CMDLINE
  439   436 guest    42.19M 24.28M 20.03M R    1   0.10%  0.10% 20.4%  0d14102    03:14.4040 netscape
  628   417 guest    1.516M 1.156M 0.055M R    1   7.01%  7.01%  1.0%    0d171       12.1341 find / -print
  747   743 root     1.305M 1.031M 0.109M O    1   0.24%  0.24%  0.9%      0d0       00.0539 psinfo -o
  746   436 guest    1.023M 0.828M 0.039M R    1   1.26%  1.26%  0.7%      0d2       00.2745 grep open test.txt

S 컬럼에 O는 CPU를 사용하고 있는 프로세스이고, R은 Run Queue에 대기하고 있는 프로세스를 나타낸다.

만일 프로세스 정보를 저장한 후에 나중에 그 내용을 분석하려면 # psinfo -A를 사용하여 저장하여야 한다. -A 옵션으로 수집한 데이타는 psparse 명령어를 사용하여 다양한 정렬 순서로 가공해 볼 수 있다.

# psinfo -A 60 600 > psinfo-A.log
# psparse pspinfo-A.log
... skip ...
# psparse -h pspinfo-A.log
... skip ...
# psparse -S pspinfo-A.log
... skip ...
# psparse -M wcpu=70,hs=40 60 pspinfo-A.log
... skip ...
# psparse -D pspinfo-A.log
... skip ...

09시 00분 00초 부터 60초 간격으로 10시간 "psinfo -A 60 600" 명령어를 실행하였다고 가정하자. 그 결과 파일에서 PID가 2389인 프로세스가 언제 실행하여 언제 끝나는지를 그래프로 알아 보고 싶다면 다음과 같이 할 수 있다.

# psinfo -A 60 600 > psinfo-A.log
# psparse -p 2389 -L psinfo-A.log > p2389.out
# mkgraph -H -o pid2389 -G "PID::PID 2389 dataserver" -t 09:00:00 -i 60 p2389.out

pid.2389.gif

위의 mkgraph 명령어는 pid2389.gif의 GIF 파일을 만든다. 이 그래프 상에서 PID 2389는 10:35:00 쯤에 실행되어 15:13:00 쯤에 끝났음을 알 수 있다. 이 프로세스가 실행된 동안에 시스템 상태가 어떻게 변했는지 시스템 통계 그래프와 비교하여 쉽게 알 수 있다.
그런데 여기서 -L 옵션을 사용하지 않으면 그래프의 시작이 09:00:00 부터 된다.

또 다른 예를 들면, 사용자가 srvclient 라는 애플리케이션을 일정기간 동안 여러 개 실행하였고, 그 명령어들이 언제 몇개나 실행했는지 그래프로 그리고 싶다면, 다음과 같이 할 수 있다.
다음은 pspinfo -A 명령어로 09:00:00에 30초 간격으로 데이타를 수집한 psinfo-A.log 파일이 있다고 가정한다.

# psparse -S -N srvclient -L psinfo-A.log > p.log
# mkgraph -t 09:00:00 -i 30 -H -G "NPROC::number of process : srvclient" -o output p.log
output.gif

위의 mkgraph 명령어는 output.gif GIF 파일을 만든다. 이 그래프에서 srvclient 프로세스가 언제 몇개 실행되고 있는지 그래프를 보면 한 눈에 알 수 있다.

또한 gpsinfo 명령어는 # psinfo -A 명령어로 수집한 데이타에 있는 헤더 정보를 사용하여 그래프를 만들어 준다.

  4.3 jtop

# jtop
  ----CPU----   ---Memory---     -----THR----- --P-- --SCALL- ------Page------
  usr sys idl   free    swap     r     b     w  fork  syscall  *psr  *api  *apo
;   0   0 100 1.977M  246.6M   0.0   0.0   0.0   0.0     1209     0     0     0
  PROCESS:  proc zomb stop  run  lwp   cpu% load1m    D-ptime   D-pt%  hp+stk
: 21:50:36    67    0    1    0  145  1.30%   0.02     0.0600   1.20%  55.79M

  PID USERNAME HP+STK S NLWP   WCPU%   CPU%  ELAPSED          TIME CMDLINE
 1531 root     0.164M O    1   0.43%  0.43%     0d15       00.1502 jtop
  988 guest    15.22M S    1   0.42%  0.42%   0d9408    02:34.6010 /usr/openwin/bin/Xsun :0
 1107 guest    7.047M S    1   0.26%  0.26%   0d9359       35.6823 /usr/dt/bin/dtterm -sess
 1143 guest    10.18M S    1   0.05%  0.05%   0d9193    13:42.2001 /opt/netscape/netscape
 1530 root     0.023M S    1   0.04%  0.04%     0d41       00.0701 sh
 1118 guest    0.055M S    1   0.03%  0.03%   0d9357       00.2810 /usr/bin/ksh
 1047 guest    10.80M S    9   0.02%  0.02%   0d9377       21.1134 /usr/java/bin/sparc/nati
  288 root     0.156M S   12   0.02%  0.02%  0d47135       11.1134 mibiisa -r -p 32792
    3 root     0.016M S    1   0.02%  0.02%  0d47178       16.9340 fsflush
 1088 guest    1.625M S    8   0.02%  0.02%   0d9368       07.3401 dtwm
    0 root     0.016M T    1   0.00%  0.00%  0d47181       00.3208 sched
HP+STK Top 5:
  988 guest    15.22M S    1   0.42%  0.42%   0d9408    02:34.6010 /usr/openwin/bin/Xsun :0
 1047 guest    10.80M S    9   0.02%  0.02%   0d9377       21.1134 /usr/java/bin/sparc/nati
 1143 guest    10.18M S    1   0.05%  0.05%   0d9193    13:42.2001 /opt/netscape/netscape
 1107 guest    7.047M S    1   0.26%  0.26%   0d9359       35.6823 /usr/dt/bin/dtterm -sess
 1088 guest    1.625M S    8   0.02%  0.02%   0d9368       07.3401 dtwm

jtop 명령어는 디폴트로 5 초 간격으로 시스템 통계정보와 CPU를 많이 사용한 순서로 프로세스 정보를 보여주며, "HP+STK Top 5"에는 HP+STK가 큰 순서로 5개의 프로세스 정보를 보여준다.

  4.4 ParmView,   mmonx   get_mdbxx



mmonx은 시스템 부팅시에 실행되며 시스템 통계정보를 1분에 한번씩 데이타 파일에 저장한다. 웹 애플리케이션 ParmViewmmonx이 수집한 데이타에 대하여 다양한 형태의 그래프를 그려준다.
ParmView를 실행하기 위해서는 먼저 mmonx 명령어에 의해 데이타가 수집되어 있어야 하고, 웹 서버가 /opt/JSparm/parmview 디렉토리를 웹 서비스하여야 한다.
이 디렉토리에는 ParmView를 서비스하는 CGI 프로그램 mrepx.cgi가 있다.

구 버전에서 mmon 명령어를 실행하였다면 데이타 변환이 필요합니다. conv_mdbxx 명령어의 메뉴얼을 먼저 참조하십시오.

JSparm 패키지를 설치한 후에, /opt/JSparm/etc 디렉토리에 있는 parmview.conf 파일을 /etc 디렉토리에 복사하고, 쉘 스크립트 /etc/rc2.d/S90mmonx을 실행하면, ParmView를 서비스하기 위한 mmonx 명령어와 gwserv 명령어가 실행된다. (mmonx 참조)

# cp /opt/JSparm/etc/parmview.conf /etc
# sh /etc/rc2.d/S90mmonx start
mmonx[2033] is started
gwserv[2035] is started on port 9900

ParmView를 실행하려면 다음과 같은 URL를 웹 브라우저에 지정한다.

http://hostname:9900

다음은 ParmView 에서 (Daily View) 버튼을 클릭하여, 나오는 그래프의 예제이다.

또한, 설정에 따라 매분마다 CPU를 많이 사용한 상위 프로세스 정보를 일단위로 웹을 통하여 볼수 있다.

다음은 ParmView 에서 [Process Info] 텝을 클릭하여, 일단위의 프로세스 정보를 보여주는 예제이다.

위에서 특정일에 대하여 클릭하면 다음과 같이 CPU를 많이 사용하는 순서로 10개의 프로세스 정보와 HP+STK를 많이 사용하는 순서로 5개의 프로세스 정보와 RSS를 많이 사용하는 순서로 2개의 프로세스 정보와 SIZE가 큰 순서로 2개의 프로세스 정보를 다음과 같이 보여준다.

또한 Parm V10.2 버전 부터는 여러 시스템에서 수집한 데이타 파일을 한 곳에 모아서 다음과 같이 하나의 그래프로 만들 수 있다.

여러 시스템에서 수집한 데이타 파일을 한 곳에 모으기 위해서 get_mdbxx 명령어를 사용할 수 있다.

  4.5 ParmClient(sysmon.exe, hostview.exe):   parmagentx

  • sysmon.exe:

    sysmon.exe는 Window XP/Vista/7 에서 실행되며, 하나의 화면에 여러 시스템에 TCP(port 9810) 접속하여 성능통계 정보를 보여준다.

  • hostview.exe:

    hostviewn.exe는 Window XP/Vista/7 에서 실행되며, 한 화면당 하나의 시스템에 TCP(port 9810) 접속하여 시스템의 성능통계 정보를 보여준다.

    parmagentx는 시스템에서 데몬 프로세스로 실행되어 있으며, PC의 자바 애플리케이션 sysmon.exehostview.exe의 TCP(Port 9810) 접속을 받아 실시간으로 시스템 통계정보를 전달한다.

    JSparm 패키지를 설치한 후에, /opt/JSparm/etc 디렉토리에 있는 parmclient.conf 파일을 /etc 디렉토리에 복사하고, 쉘 스크립트 /etc/rc2.d/S90parmagentx를 실행하면, ParmClient(sysmon.exe, hostview.exe)를 서비스하기 위한 parmagentx 명령어가 실행된다. (parmagentx 참조)

    # cp /opt/JSparm/etc/parmclient.conf /etc
    # sh /etc/rc2.d/S90parmagentx start
    parmagentx[2042] is started on port 9810
    

    ParmClient 명령어를 실행하려면 /opt/JSparm/parmclient 디렉토리에 있는 parmclient_v10.2.zip 파일을 PC에 가져와서 압축을 풀면, sysmon.exehostview.exe 명령어가 있다.

      4.6 cpuviewd,   cpuview.exe

    cpuview.exe는 PC에서 실행되는 자바 애플리케이션 프로그램이다. 이 명령어는 서버에서 실행하고 있는 cpuviewd 명령어와 TCP(Port 9811) connection을 맺고 서버 시스템의 개별 CPU 사용량에 대한 정보를 받아서 막대 그래프로 보여준다.
    cpuview.exe 명령어를 실행하려면 /opt/JSparm/parmclient 디렉토리에 있는 parmclient_v10.2.zip 파일을 PC에 가져와서 압축을 풀면, cpuview.exe 명령어가 있다.

      4.7 Log file Monitoring tool

    jlogmon 은 시스템에서 로그를 저장하는 파일을 주기적으로 감시하여 새로운 메세지가 로그 파일에 기록되면, 새롭게 기록된 메세지를 사용자에게 알려준다.

    다음과 같이 구성파일(mon.conf)을 만들고

    FILE /var/adm/messages {
        action {
            | /usr/bin/mailx -s 'warning from /var/adm/message' admin@junsoft.com
        }
        match {
            WARNING
            ERROR
        }
    }
    FILE /var/adm/sulog {
        action {
            | mailx -s 'su root' admin@junsoft.com
            | /opt/JSparm/bin/sendmsg -s 192.168.10.8
        }
        match {
            -root
        }
    }
    

    그리고 다음과 같이 jlogmon 명령어를 실행한다.

    # /opt/JSparm/bin/jlogmon -c mon.conf -i 60
    

    위의 명령어는 60초 간격으로 mon.conf 에서 지정한 /var/adm/messages 와 /var/adm/sulog 파일을 조사하여 그 파일의 크기가 변경되면, 추가된 메세지중에 지정한 조건에 맞는 메세지가 있으면, 지정한 명령어를 실행하고 메세지를 그 명령어의 표준 입력으로 전달한다.
    /var/adm/sulog 파일의 action 부분에 sendmsg 명령어가 있는데, 이 명령어는 지정한 조건에 일치되는 메세지를 logviewer 명령어에게 메세지를 보내는 역활을 한다.

    logviewer 명령어는 다음과 같이 사용자의 PC에 실행해 둘 수 있다.

    jlogmon 프로세스가 로그 파일에 새로운 메세지가 도착하면 sendmsg 명령어를 실행하여 메세지를 logviewer 프로세스에게 알려준다. logviewer 가 메세지를 받으면 beep 음을 발생시켜 메세지가 도착했음을 알려준다.

      4.8 mkgraph

    Parm에는 열과 행으로 된 수치 데이타에 대하여 쉽게 그래프를 그려주는 강력한 명령어 mkgraph가 있다. mkgraphfile에서 한 라인씩 읽어서, 지정한 컬럼에 대하여 GIF 파일 포멧의 그래프를 만든다. 그래프를 그리는데 사용되는 컬럼은 -G 옵션을 사용하여 지정할 수 있다.
    파일에 있는 각 컬럼은 하나 이상의 whitespace (공백 또는 탭)로 구분된다.
    file속에 있는 내용 중에 데이타가 아닌 라인이 있을 경우 -S 옵션을 사용하여 그 라인의 첫번째 컬럼에 있는 단어를 지정하여 스킵할 수 있다. 여러 단어일 경우 콤마(,)로 구분한다.
    -S 옵션에 지정되지 않은 문자가 첫 컬럼에 오면, 오류가 발생한다. 예를 들어 vmstat 명령어의 출력물(vmstat.log)에서 12번째 sr 필드와 19번째 cs 필드에 대하여 그래프를 그리려면, 다음과 같은 옵션을 사용하여야 한다.

    # mkgraph -S procs,r -G12,19 vmstat.log   [vmstat.log 파일의 내용]
     procs     memory            page            disk          faults      cpu
     r b w   swap  free  re  mf pi po fr de sr s0 s1 s2 s3   in   sy   cs us sy id
     2 0 0  40720 36488  19 1171 660 127 322 52688 35 2 11 5 17 2086 5581 5394 27 6 67
     0 0 0 6834952 96880  2 1360 423 60 328 0 37 2 5  2 10 1625 24257 5995 22 6 72
     0 0 0 6826888 98000  2 1451 179 38 351 26752 43 0 5 2 8 1628 25939 6106 22 6 72
     .... skip ....
    

    다음은 간단한 mkgraph의 예제이다.

    # mkgraph -S procs,r -G 18,19 vmstat.log
    
    
    
    # mkgraph -S procs,r -G 18:40000:sy,19::cs vmstat.log
    
    
    
    vmstat.log 파일은 그래프를 만드는데 사용될 데이타 파일이다.
    -G 18,19 옵션을 사용하여 그래프를 그릴 컬럼(18번째, 19번째)을 지정한다.
    첫 부분에 있는 2개의 라인은 데이타가 아니기 때문에 -S procs,r 옵션을
    사용하여 procs와 r 단어로 시작하는 라인을 스킵한다.
    Parm 버전 6.1에서는 -S 옵션에 스킵할 단어의 일부분만 지정하여도
    스킵하고, #으로 시작하는 라인은 자동으로 스킵된다.
    즉, -S procs,r 대신에 -S p,r로 지정하여도 된다.
    

    -G 옵션의 형식은 다음과 같다. -G fn[:max[:desc]][,fn[:max[:desc]]]...

  • fn은 그래프를 그릴 때, 사용될 컬럼을 지정한다(1,2,3....).
  • max는 선택된 컬럼에 대한 그래프의 최대 값을 지정한다.
  • desc는 해당되는 각 컬럼의 그래프의 윗부분에는 제목을 지정한다. -o 옵션을 지정하지 않으면, 디폴트로 "graph.gif" 파일을 만든다.
  • # mkgraph -H -S procs vmstat.log
            output
    
    # mkgraph -H -S procs -G cs vmstat.log
    
    
    
    -H 옵션을 지정하면 첫번째 라인에 컬럼의 헤더가 표시되어 있다고
    가정한다. 헤더의 첫번째 글자는 숫자로 시작하면 안 된다.
    헤더에 지정된 문자열은 자동으로 스킵된다.
    -H 옵션을 지정한 경우에, -G 옵션에 컬럼 번호 대신에 컬럼
    이름을 지정할 수 있다.
    

    mkgraph 명령어 -1 옵션을 사용하면, 여러 컬럼에 있는 데이타를 하나의 그래프에 그릴 수 있다.

    다음과 같은 데이타가 data.out 파일에 있다고 가정하자.

  • IT      BT      NANO    MICRO
    10      50      40      30
    20      50      40      30
    20      40      60      30
    20      40      60      30
    70      40      60      30
    70      40      40      50
    40      20      40      50
    40      20      80      50
    40      90      80      50
    20      90      80      50
    20      90      80      50

    # mkgraph -1 sum -e 5 -h 100 -H data.out
    
    -1 sum 옵션을 지정하면 하나의 그래프에 컬럼 1,2,3,4에 데이타를 순서대로 합하여 그래프를 만든다. 이 그래프를 sum 단일 그래프라고 명명한다.
    IT의 값은 파란선의 높이이고, BT의 값은 빨간선에서 파란선의 높이를 뺀 값이 되고, NANO의 값은 초록선에서 빨간선의 높이를 뺀 값이 되고, MICRO의 값은 노란선에서 초록선의 높이를 뺀 값이 된다.
    선의 색을 설명하는 부분에 '+' 표시가 있다. 이 표시가 있는 것은 sum 단일 그래프을 의미한다.
    # mkgraph -1 each -S IT -e 5 -h 100 -G 1=IT,2=BT,3=NANO,4=MICRO data.out
    
    -1 each 옵션을 지정하면 하나의 그래프에 컬럼 1,2,3,4에 데이타를 각각 그래프를 만든다. 이 그래프를 each 단일 그래프라고 명명한다.
    각각의 선에 나타나는 값이 각 데이타의 실제 값이다.
    선의 색을 설명하는 부분에 '+' 표시가 없다. 이 표시가 없는 것은 each 단일 그래프을 의미한다.

      4.9 mkchart

    mkchart 명령어는 입력 파일을 읽어서 지정한 컬럼에 있는 값에 대하여 막대 그래프를 그려서 GIF 포멧의 파일을 만들어 준다.

    다음과 같은 내용을 가진 data 파일이 있다. 이파일을 가지고 mkchart 명령어를 설명한다.

    
    web1    30      18      35      28
    web2    35      24      69      30
    web3    25      20      48      30
    web4    25      26      39      28
    web5    28      30      50      20
    web6    22      19      40      18
    was1    40      25      70      29
    was2    25      22      33      22
    dbserv1 10      9       24      15
    dbserv2 23      15      55      20 

    # mkchart -G 2,3 data
    mkchart 명령어는 지정한 파일에서 한 줄씩 읽어서 -G 옵션에 지정한 컬럼의 데이타에 대하여 막대 그래프를 그려준다.
    -G 옵션의 형식은 다음과 같다.
    
            -G fn1[:desc][,fn2[:desc][,fn3[:desc]]]
    
    -G 옵션에 콤마로 구분하여 최대 3개의 필드를 지정할 수 있다. 입력파일에서 필드의 구분은 디폴트로 공백으로 구분된다. -d 옵션을 사용하여 필드 구분자를 다른 문자로 변경할 수 있다. 필드번호는 숫자로 지정하며, 첫번째 있는 컬럼은 필드번호 1 이 된다.
    필드 번호에 콜론(:)를 붙인 다음에 그 필드에 대한 설명을 붙일 수 있다. 설명을 붙이면, 그 내용이 다음과 같이 그림상에 표시된다.
    # mkchart -G 2:user,3:kernel data # mkchart -m 80 -G 2:user,3:kernel data
    그래프의 왼쪽에는 막대 그래프의 눈금 값을 표시되어 있다. 이 값은 data 파일에 있는 값에 따라 그 값들을 모두 표시할 수 있도록 자동으로 결정된다.
    (디폴트로 최소 최대값은 100이다. 즉, data 파일의 내용을 모두 표시할 수 있는 값이 50 이 되어도 100을 최대값으로 사용한다.)
    왼쪽에 있는 그래프 값을 명시적으로 변경하고 싶으면 -m 옵션을 사용하여 최대값을 지정할 수 있다.

    -o 옵션을 지정하지 않으면, 디폴트로 "chart.gif" 파일이 현재 디렉토리에 만들어 진다.
    -D옵션을 사용하여 출력할 디렉토리를 지정할 수 있다. 디폴트는 "." (현재 디렉토리)로 지정되어 있다).

    # mkchart -N 1 -G 2:user,3:kernel data
    mkchart 명령어에 -N 옵션을 사용하여 막대 그래프에 대한 이름 부분을 가지고 있는 필드를 지정할 수 있다. 지정된 필드의 내용이 막대 그래프의 아랫쪽에 쓰여진다.

      4.10 dolog

    시스템의 상태를 모니터하기 위하여 특정 명령어들을 사용하여 데이타를 수집하고, 그것을 분석한다. 이때 명령어들을 일정 시간 간격으로 실행하거나, 실행한 시간과 파일명을 일관성 있게 저장할 필요가 있다. dolog 명령어는 이러한 것을 쉽게 할 수 있도록 도와 준다.

    dolog 명령어는 지정한 명령어를 일정 시간 간격으로 지정한 횟수 만큼 실행하여 그 결과를 파일에 저장한다. 저장할 파일명은 -o 옵션으로 지정하는데, 실제 만들어지는 파일명에는 지정한 이름에 yymmdd[.HHMMSS[.interval]] 형식의 날짜와 시간 , 시간 간격이 추가된다. -o 옵션으로 파일명을 지정하지 않으면, 표준출력(standard output)으로 명령어의 결과가 출력된다. -T 옵션을 지정하지 않으면 한번만 실행한다.

    다음은 "df -k" 명령어를 60초 간격으로 100번 실행하는 예제이다.

    # dolog -o df -T 60,100 df -k
    # ls
    df.021124.182517.60
    

    생성되는 파일명은 df.021124.182517.60 다음과 같다.

    getdata 명령어로 데이타를 수집하지 않고, 간단히 vmstat 명령어를 실행하여 그 결과를 그래프로 그리고 싶을 경우 다음과 같이 할 수 있다.

    # dolog -o vmstat.30 vmstat 30 60
    # ls
    vmstat.30.021205.164122
    # gvmstat -t 164122 -i 30 vmstat.30.021205.164122
    

    위와 같이 -o 옵션에 vmstat.30 를 지정하면 vmstat 명령어를 30 초 간격으로 실행했다는 것을 알 수 있을 것이고 실행한 날짜와 시간은 그 파일명에 추가된다.

    다음과 같이 아무런 옵션 없이 실행하면, 명령어를 실행한 시간을 화면에 출력하는 효과가 있다.

    # dolog swap -l
    # DATE 2003/01/04 14:29:32
    swapfile             dev  swaplo blocks   free
    /dev/dsk/c0t2d0s1   32,17     16 524384 490496
    

    다음은 dolog 명령어에 -a 옵션을 사용하여 "df -k /" 명령어를 세번 실행한 명령어의 결과이다.

    # dolog -a -o df df -k /
    # sleep 2
    # dolog -a -o df df -k /
    # sleep 2
    # dolog -a -o df df -k /
    # ls
    df.181124
    # cat df.181124
    # DATE 2002/11/04 14:45:48
    Filesystem            kbytes    used   avail capacity  Mounted on
    /dev/dsk/c0t2d0s0    1758462 1621623   84086    96%    /
    # DATE 2002/11/04 14:45:50
    Filesystem            kbytes    used   avail capacity  Mounted on
    /dev/dsk/c0t2d0s0    1758462 1621623   84086    96%    /
    # DATE 2002/11/04 14:45:52
    Filesystem            kbytes    used   avail capacity  Mounted on
    /dev/dsk/c0t2d0s0    1758462 1621623   84086    96%    /
    

    출력될 파일명에 오늘 날짜가 추가된다. 만일 여러 번 실행하는 도중에 날짜가 바뀌면 새로운 날짜가 추가된 파일명을 새로 만든다.

    만일 1 시간마다 "df -k" 명령어는 실행하여 그 결과를 날짜 별로 저장하고 싶다면 다음과 같이 cron 테이블에 등록할 수 있다.

    0 * * * * /opt/JSparm/bin/dolog -a -o df df -k
    

      4.11 tsinfo

    tsinfo 명령어는 프로세스에 있는 각각의 쓰레드에 대한 정보를 보여준다. 옵션을 지정하지 않으면 CPU를 많이 사용하는 순서로 20개의 쓰레드 정보를 보여준다.

    # tsinfo
      PID USERNAME LWPID NLWP CLS PRI S   WCPU%   CPU%  ELAPSED          TIME SYSCALL       CMDLINE 0425.01:36:24
      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 ...
    

    -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
    Tracing 1 thread for 5 seconds ..., 2012/02/10 19:19:00
      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:24:53
     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를 거의 다 사용하면서 오류가 난 시스템 콜을 무한 반복 호출하는 쓰레드
    
      4.12 procinfo

    procinfo 명령어는 지정한 시간 간격(디폴트 5초) 동안에 active한 프로세스를 찾아내어, 그중에서 CPU를 많이 사용한 순서(D-WCPU%)로 상위 20개의 프로세스에 대한 정보를 보여준다. 중간에 종료된 프로세스에 대한 정보는 나타나지 않는다.
    여기서 active한 프로세스란 CPU를 사용한 프로세스를 말한다.

    active한 프로세스는 다음과 같은 것으로 알 수 있다.

    • 그 시간 간격 동안에 시스템 콜이 있었던 프로세스
    또는
    • CPU 시간(tick)을 사용한 프로세스
    어떤 프로세스가 CPU를 차지하고 실행되어도 그 CPU를 one tick(1/100초) 이상 사용하지 않으면 CPU 사용시간은 증가되지 않는다. 따라서 시스템 콜이 여러번 발생한 프로세스라도 CPU 사용시간이 0(zero) 일 수 있다.
    또한 시스템 콜이 하나도 없어도 CPU 사용시간이 증가할 수 있다. 이러한 프로세스는 사용자 모드에서 무한 루프에 빠져있다고 볼 수 있다.

    CPU 사용시간이 0이고 시스템 콜도 0이면 그 프로세스는 그 시간 간격 동안 아무런 동작도 하지 않은 프로세스이다. 이러한 프로세스는 procinfo 명령어의 출력에 나타나지 않는다.

    다음은 5초 동안에 active한 프로세스에 대한 정보를 보여준다.

    # procinfo -f
      PID USERNAME   SIZE    RSS S NLWP   WCPU%   CPU%  ELAPSED D-WCPU%  D-CPU%  D-UTIME  D-STIME    CTX   iCTX      RW SYSCALL CMD 0424.22:34:53
     1381    guest 279.9M 166.6M R    9   0.29%  0.15%  34d1662   1.34%   0.67%   0.0732   0.0008   18.0    1.6  0.104K    67.5 thd-bin
      895    guest 417.9M 337.7M R    1   1.84%  0.92%  34d2205   0.48%   0.24%   0.0261   0.0006    7.3    0.9  4.366K    29.2 Xorg
        3     root 0.000M 0.000M O    1   0.38%  0.19%  34d2242   0.38%   0.19%   0.0000   0.0211    0.9    0.0  0.000K     0.0 fsflush
     1271    guest 96.25M 15.60M R    1   0.13%  0.07%  34d2001   0.12%   0.06%   0.0064   0.0004    6.2    1.8  2.571K    27.6 mixer_applet2
     1178    guest 178.4M 59.47M R    2   0.21%  0.11%  34d2008   0.09%   0.05%   0.0047   0.0005    4.4    2.4  3.824K    11.6 gnome-terminal
     1077    guest 12.26M 9.875M S    1   0.04%  0.02%  34d2018   0.03%   0.02%   0.0016   0.0005    3.1    0.0  3.683K    23.8 gconfd-2
     1265    guest 69.73M 13.26M S    1   0.03%  0.02%  34d2003   0.03%   0.02%   0.0016   0.0004    2.5    0.9  0.184K    10.9 gnome-netstatus
     1174    guest 188.1M 59.00M S    1   0.04%  0.02%  34d2009   0.03%   0.02%   0.0012   0.0005    3.1    0.0  1.543K    22.9 gnome-panel
     1302    guest 242.1M 66.11M R   18   0.03%  0.02%  34d1994   0.02%   0.01%   0.0007   0.0007   21.4    2.4  0.005K    49.7 java
     2140    guest 2.816M 2.043M O    1   0.03%  0.02%      0d6   0.02%   0.01%   0.0002   0.0011    0.2    0.0  10.07K    64.0 procinfo
     1000 noaccess 190.3M 128.2M R   18   0.01%  0.01%  34d2195   0.02%   0.01%   0.0007   0.0004    5.6    0.0  0.000K    15.4 java
    

      4.13 proctime

    proctime 명령어는 지정한 시간 간격(디폴트 5초) 동안에 -p 옵션에서 지정한 프로세스에 대하여 CPU를 사용한 시간 및 sleep 시간에 대한 자세한 정보를 보여준다.

    # proctime -p 6674
      PID USERNAME NLWP S D-WCPU% D-CPU%  SCALL   CS SIG  ELAPSED  USR  SYS  TRP  FLT  LCK  LAT  STP  SLP COMMAND
     6674     root   15 S   0.00%  0.00%      0    0   0 43d86289  0.0  0.0  0.0  0.0 53.3  0.0  0.0 46.7 /usr/sbin/syslogd
    

      4.14 jsyscall

    jsyscall 명령어는 Solars 10 버전에서 제공하는 dtrace 명령어를 이용하여 시스템 콜 정보를 조사하여, CPU를 제일 많이 사용한 순서로 보여준다. 다음은 jsystem 명령어의 사용 예제이다.

    # /opt/JSparm/bin/jsyscall -a -t 2
    Tracing... for 2 seconds
    :: For all processes
    :: Date: 2010 Feb  5 13:17:06
    :: Elapsed: 2.109
                     SYSCALL   CPU-TIME_AVG    COUNT       CPU-TIME   ELAPSED-TIME
                     pollsys    0.000005559      158    0.000878407   22.314550527
                       ioctl    0.000000669      656    0.000439141    0.001418860
                      stat64    0.000007267       38    0.000276180    0.000306580
                      writev    0.000006309       28    0.000176672    0.000200128
                       write    0.000009035       19    0.000171679    0.000199759
                        read    0.000001979       84    0.000166298    0.000244512
                     lstat64    0.000005389       29    0.000156282    0.000178254
                 resolvepath    0.000010403       10    0.000104030    0.000112115
                        mmap    0.000050442        1    0.000050442    0.000052521
                  getdents64    0.000005944        6    0.000035666    0.000039876
               lwp_cond_wait    0.000003002       11    0.000033029    3.071852642
                         brk    0.000003117       10    0.000031179    0.000041234
                    p_online    0.000000121      256    0.000030991    0.000229486
                    lwp_park    0.000002289       13    0.000029768    3.054807326
                        fsat    0.000009750        3    0.000029251    0.000031786
                    schedctl    0.000022588        1    0.000022588    0.000024125
                   setitimer    0.000000375       53    0.000019920    0.000063076
                       yield    0.000001870       10    0.000018708    0.000826615
                   sigaction    0.000000486       25    0.000012170    0.000034730
                 lwp_sigmask    0.000000959       12    0.000011519    0.000022457
                  setcontext    0.000001655        6    0.000009931    0.000014691
             lwp_cond_signal    0.000002717        3    0.000008151    0.000011780
                   getitimer    0.000000313       21    0.000006577    0.000022865
                       close    0.000001499        3    0.000004499    0.000006533
                       gtime    0.000000248       17    0.000004232    0.000016694
                     fstat64    0.000000836        3    0.000002508    0.000004628
                       fstat    0.000001025        2    0.000002051    0.000004558
                        pset    0.000000785        2    0.000001571    0.000003138
                       fcntl    0.000000334        3    0.000001004    0.000003243
                   sysconfig    0.000000311        3    0.000000935    0.000004198
                      getpid    0.000000708        1    0.000000708    0.000001967
                   nanosleep    0.000000000        1    0.000000000    0.000000000
                       TOTAL    0.000001838     1488    0.002736087   28.445330904
    

      4.15 jsyserr

    jsyserr jsyserr 명령어는 Solars 10 버전에서 제공하는 dtrace 명령어를 이용하여, 다음과 같이 오류가 발생한 시스템 콜에 대한 errno 번호 별로 발생한 횟수를 출력한다.

    # /opt/JSparm/bin/jsyserr -a -t 5
    Tracing... for 5 seconds
    :: For all processes
    :: For system call: ALL
    :: Date: 2011 Sep 23 20:09:19
    :: Elapsed: 5.001
                     SYSCALL ERRNO   COUNT DESC
                       ioctl     2     510 ENOENT - No such file or directory
                    p_online    22     255 EINVAL - Invalid argument
                        read    11       4 EAGAIN - Resource temporarily unavailable
                     pollsys     4       4 EINTR - interrupted system call
                    lwp_park    62       1 ETIME - timer expired
               lwp_cond_wait    62       1 ETIME - timer expired
                       ioctl    22       1 EINVAL - Invalid argument
                       TOTAL     -     776
    

      4.16 jmeminfo

    jmeminfo 명령어에 옵션을 지정하지 않고 실행하면 다음과 같이 시스템의 가상 메모리와 물리적 메모리 사용량을 보여준다.

    # /opt/JSparm/bin/jmeminfo
    VMem: 16375M: alloc 2825.M (17.2%), reserv 205.4M (1.2%), free 11331M (69.1%), other 2013.M (12.5%)
    PMem: 8183.M: user 2937.M (36.0%), kernel 989.3M (12.0%), free 4256.M (52.0%)
    misc: Shmem: 600.0M (3), TmpFS: 1618.M (3), SWAPdev: 0.000M (1), RamDisk: 0.000M (0)
    

    -K 옵션을 사용하면, 커널 캐쉬 메모리 중에 사용량이 많은 순서로 상위 20개 정보를 볼 수 있다.

    # jmeminfo -K
    VMem: 16375M: alloc 1136.M (6.9%), reserv 203.0M (1.2%), free 7873.M (48.0%), other 7161.M (43.9%)
    PMem: 8183.M: user 1721.M (21.2%), kernel 6136.M (74.9%), free 325.2M (3.9%)
    misc: Shmem: 0.000M (0), TmpFS: 102.5M (3), SWAPdev: 0.000M (1), RamDisk: 0.000M (0)
    ---------------------------------------------------------------------------------------
                 kmem_cache buf_size buf_inuse buf_total  mem_inuse        alloc  fail
    ---------------------------------------------------------------------------------------
        zio_data_buf_131072   131072     18636     32720     4090.M       353847     0
               kmem_va_4096     4096    205350    205376     802.2M       385035     0
              kmem_va_16384    16384     16314     16320     255.0M        17009     0
              zio_buf_16384    16384     16151     16264     254.1M       298920     0
                    dnode_t      656    143207    144624     94.15M       175747     0
            kmem_alloc_4096     4096     23652     24036     93.89M      6606478     0
                zio_buf_512      512    155306    156032     76.18M      1430848     0
              kmem_oversize        -         -         -     73.72M          182     0
              kmem_va_28672    28672       649      2328     72.75M        12138     0
               rnode4_cache      968       215     70488     68.83M        70854     0
             dmu_buf_impl_t      192    225370    275961     51.33M       934080     0
                   vn_cache      240    137139    187110     48.72M     19681035     0
             kmem_alloc_256      256      6570    159210     41.46M     18821862     0
                rnode_cache      656     62013     62016     40.37M        62158     0
                 anon_cache       48    291178    856212     39.81M   1066069518     0
              arc_buf_hdr_t      168    172356    186552     30.36M      1313864     0
             kmem_alloc_112      112    164060    253296     27.48M      8296554     0
         zio_data_buf_20480    20480      1083      1181     23.06M        38344     0
               kmem_va_8192     8192      2900      2912     22.75M         5255     0
             kmem_alloc_512      512       457     46096     22.50M     16945633     0
    

      4.17 netinfo

    netinfo 명령어는 네트웍 인터페이스의 정보를 수집하여 보여준다.

    다음은 10초 간격으로 3 번 네트웍 인터페이스 정보를 수집하는 예제이다.

    # netinfo -x 10 3
    # Date.time 1107.002055 interval 10
    Name       I-pkts   I-data   I-errs   O-pkts   O-data   O-errs   Collis 00:21:05
    lo0           0.0        -        -      0.0        -        -        -
    hme0        219.0   323.5K        0    116.8   6.317K        0        0
    Name       I-pkts   I-data   I-errs   O-pkts   O-data   O-errs   Collis 00:21:15
    lo0           0.0        -        -      0.0        -        -        -
    hme0        219.2   323.5K        0    116.6   6.322K        0        0
    Name       I-pkts   I-data   I-errs   O-pkts   O-data   O-errs   Collis 00:21:25
    lo0           0.0        -        -      0.0        -        -        -
    hme0        219.5   323.5K        0    116.6   6.336K        0        0
    

    솔라리스 운영체제는 로컬 인터페이스에 대한 데이타 양에 대한 정보는 제공하지 않기 때문에 로컬 로컬 인터페이스에 대한 데이타 양은 표시되지 않는다.

      4.18 tcpinfo

    tcpinfo 명령어를 실행하면, TCP 와 관련된 정보를 다음과 같이 보여준다.

    # tcpinfo 1 5
    # Date.time 0819.145759 interval 1
        Time CurEs AOpen POpen +DrpQ +DrpQ0 +DrpR   ISeg   OSeg   IData   OData +RSeg +RData +Rst_a +Rst_e +Rst_o
    14:58:00     5   0.0   0.0     0      0     0    3.0    6.0  0.141K  0.141K     0 0.000K      0      0      0
    14:58:01     5   0.0   0.0     0      0     0    4.0    7.0  0.141K  0.188K     1 0.000K      0      0      0
    14:58:02     7   1.0   1.0     0      0     0   29.0   35.0  4.888K  4.888K     0 0.000K      0      0      0
    14:58:03     5   0.0   0.0     0      0     0    8.0    7.0  0.194K  0.092K     0 0.000K      0      1      1
    14:58:04     5   0.0   0.0     0      0     0    0.0    0.0  0.000K  0.000K     0 0.000K      0      0      0
    

      4.19 imglist

    imglist 명령어는 mkgraph 명령어나 기타 명령어로 만든 그래프 파일들을 HTML 페이지로 한번에 볼 수 있도록 HTML 테그로 만들어 표준출력에 출력한다.
    이 내용을 파일로 받아 웹으로 볼 수 있다.

    # imglist vm.gif mp.gif <html> <head> <title>image list</title> </head> <body> <table border=0 cellpadding=0 cellspacing=0> <tr> <td valign=top align=left> <img src='vm.gif'><br> </td> </tr> <tr> <td valign=top align=left> <img src='mp.gif'><br> </td> </tr> </table> </body> </html> # imglist *.gif > all_graph.html

    # imglist -B /tmp vm.gif

    <html> <head> <title>image list</title> </head> <body> <table border=0 cellpadding=0 cellspacing=0> <tr> <td valign=top align=left> <img src='/tmp/vm.gif'><br> </td> </tr> </table> </body> </html> # imglist -l sys1.html sys2.html <html> <head> <title>image list</title> </head> <body> <table border=0 cellpadding=0 cellspacing=0> <tr> <td valign=top align=left> <a href='sys1.html'>sys1.html</a><br> </td> </tr> <tr> <td valign=top align=left> <a href='sys2.html'>sys2.html</a><br> </td> </tr> </table> </body> </html>
    # imglist csw.gif ithr.gif syscl.gif > test.html

    [test.html]



    # imglist csw.gif "=Interrupt" ithr.gif syscl.gif > test2.html

    [test2.html]

    Interrupt


    # cat pic.txt
    csw.gif
    ithr.gif
    syscl.gif
    # imglist -f pic.txt > test3.html

    [test3.html]



      4.20 jhexdump

    jhexdump 명령어는 지정한 파일에 대해 다음과 같이 그 내용을 16 진수와 문자로 화면에 보여준다.

    # jhexdump /usr/bin/ps
    00000000   7f 45 4c 46 01 02 01 00  00 00 00 00 00 00 00 00   .ELF............
    00000010   00 02 00 02 00 00 00 01  00 01 08 f4 00 00 00 34   ...............4
    00000020   00 00 11 20 00 00 00 00  00 34 00 20 00 06 00 28   ... .....4. ...(
    00000030   00 1a 00 19 00 00 00 06  00 00 00 34 00 01 00 34   ...........4...4
    00000040   00 00 00 00 00 00 00 c0  00 00 00 c0 00 00 00 05   ................
    00000050   00 00 00 00 00 00 00 03  00 00 00 f4 00 00 00 00   ................
    00000060   00 00 00 00 00 00 00 11  00 00 00 00 00 00 00 04   ................
    00000070   00 00 00 00 00 00 00 01  00 00 00 00 00 01 00 00   ................
    00000080   00 00 00 00 00 00 0d d8  00 00 0d d8 00 00 00 05   ................
    00000090   00 01 00 00 00 00 00 01  00 00 0d d8 00 02 0d d8   ................
    000000a0   00 00 00 00 00 00 02 30  00 00 03 78 00 00 00 07   .......0...x....
    000000b0   00 01 00 00 00 00 00 02  00 00 0e e8 00 02 0e e8   ................
    000000c0   00 00 00 00 00 00 00 b8  00 00 00 00 00 00 00 07   ................
    000000d0   00 00 00 00 6f ff ff fb  00 00 00 00 00 00 00 00   ....o...........
    000000e0   00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 06   ................
    ... skip ...
    

    jhexdump는 디폴트로 한줄에 16 바이트의 데이타를 바이트 별로 왼쪽에는 16진수로 오른쪽에는 문자로 표시한다. 출력가능한 코드(printable code)가 아닌 것은 .(dot)로 표시한다.

      4.21 jtab

    jtab 명령어는 구분자로 분리된 데이타를 읽어서 HTML의 형식으로 table을 출력한다. 입력 파일명을 지정하지 않으면 표준입력이 사용된다.
    다음은 kstat 명령어로 ce 네트웍 인터페이스 정보를 출력하여 egrep 명령어로 ipackets64, opackets64, rbytes64, obytes64를 추출하여, tr 명령어로 TAB을 콜론으로 변경하여 파일에 저장한다. 이렇게 저장된 데이타는 jtab 명령어의 입력으로 사용한다.

    # kstat -p ce | egrep 'ipackets64|opackets64|rbytes64|obytes64' | tr '\t' : > output
    # cat output
    ce:0:ce0:ipackets64:102441
    ce:0:ce0:obytes64:24117394
    ce:0:ce0:opackets64:111255
    ce:0:ce0:rbytes64:14884687
    ce:1:ce1:ipackets64:72527
    ce:1:ce1:obytes64:26244879
    ce:1:ce1:opackets64:84249
    ce:1:ce1:rbytes64:9296584
    ce:2:ce2:ipackets64:1679135
    ce:2:ce2:obytes64:5543200
    ce:2:ce2:opackets64:26219
    ce:2:ce2:rbytes64:323122974
    ce:3:ce3:ipackets64:0
    ce:3:ce3:obytes64:0
    ce:3:ce3:opackets64:0
    ce:3:ce3:rbytes64:0
    #
    

    위에 수집된 데이타에 다음과 같이 jtab 명령어를 사용하여 HTML 페이지를 만들었다.

    # jtab -d : -G 3,4,5 output > out.html
    
    다음은 out.html 파일의 내용이다:
    + ce0ce1ce2ce3
    ipackets641024417252716791350
    obytes64241173942624487955432000
    opackets6411125584249262190
    rbytes641488468792965843231229740

    -G 옵션에 3개의 필드 번호를 지정하는데, 첫번째 필드는 컬럼명으로 사용될 필드 번호이고, 두번째 필드는 열명(row name)으로 사용될 필드 번호이고, 세번째 필드는 데이타로 사용될 필드 번호이다.
    다음은 output 파일에 구분자를 콜론(:)으로 사용하여 3번째 필드를 테이블의 컬럼명으로 사용하고 4번째 필드를 열명(row name)으로 사용하고 5번째 필드를 데이타로 사용하여 HTML table을 만든다. -d 옵션으로 필드의 구분자를 지정한다.

    -P 옵션을 사용하면 HTML 형식의 출력이 아닌, 텍스트 형식으로 출력한다.

    # jtab -d : -P -G 3,4,5 output
    
             +      ce0      ce1       ce2 ce3
    ipackets64   102441    72527   1679135   0
      obytes64 24117394 26244879   5543200   0
    opackets64   111255    84249     26219   0
      rbytes64 14884687  9296584 323122974   0
    

      4.22 jsum

    jsum 명령어는 지정한 파일이나 표준입력에서 데이타를 읽어서 지정한 컬럼 별 또는 라인 별로 합계를 구해준다. file을 지정하지 않으면 표준입력을 사용한다.

    # cat bin.dat
    -r-xr-xr-x   1 bin      bin        10492 Oct  6  1998 /usr/bin/keylogin
    -r-xr-xr-x   1 bin      bin         5412 Oct  6  1998 /usr/bin/keylogout
    -r-xr-xr-x   1 bin      bin         7068 Oct  6  1998 /usr/bin/kinit
    -r-xr-xr-x   1 bin      bin         8376 Oct  6  1998 /usr/bin/klist
    # jsum -G 5 bin.dat
    31348
    # jsum -G 2,5 bin.dat
    4       31348
    

    위의 예제에 있는 bin.dat 파일은 "ls -l" 명령어의 결과를 가지고 있다. 여기서 첫번째 예제는 5번째 필드의 값을 더하여 합계를 보여준다. 두번째 예제는 2번째 필드와 5번째 필드의 합계를 동시에 보여주는 예제이다. 계산하고 싶은 컬럼번호를 -G 옵션에 지정한다. 여러개를 동시에 보고 싶으면 콤마로 구분하여 여러 컬럼번호를 지정할 수 있다. 입력되는 컬럼의 구분은 white space(TAB 또는 SPACE)로 구분한다. 구분자를 다른 것으로 사용하고 싶으면 -d 옵션을 사용하여 컬럼 구분자를 지정할 수 있다.

    다음은 라인 별로 합계를 구하는 예제이다. -l 옵션을 사용하면 각각의 라인에 있는 숫자를 모두 더하여 라인 별로 합계를 출력한다.

    # cat exam.dat
    120 10 29 10.001
    99 89 12.1 10.02
    20 20 10 10
    20 20 20 20
    # jsum -l exam.dat
    169.001
    210.12
    60
    80
    # jsum -l -i exam.dat
    169
    210
    60
    80
    # jsum -l -G 2,3 exam.dat2
    39
    101.1
    30
    40
    

    합계를 구하는데 사용되는 데이타는 양수이어야 하고 반드시 숫자로 시작하여야 한다. 숫자가 아닐 경우에 오류가 발생한다.
    숫자와 문자가 섞여 있을 때, 문자는 숫자의 끝으로 인식한다. 음수는 숫자로 인식하지 않는다.
    -G 2,3 옵션을 지정하여 두번째와 세번째 데이타만 더하여 합계를 출력한다.

    숫자는 64 bit로 계산한다. 따라서 최대값은 2^64(18446744073709551616) 이다. 이 보다 값이 커지게 되면 부정확한 값이 나온다.
    소수점 이하의 숫자가 있을 경우, 소수점 이하 9자리까지만 숫자로 인식한다.
    소수점 이하를 계산하지 않으려면, -i 옵션을 사용하면 된다.

      4.23 jcal

    jcal 명령어는 날짜에 관련한 정보를 제공한다. 지정한 날짜가 무슨 요일인지, 지정한 달에는 몇일이 있는지, 지정한 날짜를 기준으로 며칠전 또는 며칠후는 몇월 몇일인지 등등의 데이타를 제공한다.

    다음은 jcal 명령어에 대한 예제이다.

    # jcal 2005/06/10 100
    2005/09/18 Tue
    # jcal 2005/06/10 -100
    2005/03/02 Tue
    # jcal 0 -1
    2005/06/09 Tue
    # jcal -D 2005/02
    28
    # jcal -D 0
    30
    # jcal -f %y%m%d 0 0
    050610
    

    jcal 명령어는 지정한 날짜로 부터 며칠전 또는 며칠후가 몇월 몇일인지를 계산하여 준다. 그리고 그날이 무슨 요일인지 보여준다. 날짜를 지정하지 않고 0(zero)을 지정하면 현재 날짜를 지정한 것과 같다. "# jcal 2005/06/10 -100" 명령어는 2005년 6월 10일에서 100일 전에는 몇년 몇월 몇일이지를 보여준다.
    -D 옵션을 사용하면 지정한 달에 몇일이 있는지 알려준다.

      4.24 timecheck

    시스템에서 데이타를 수집할 때, 시간 정보를 함께 수집하는 명령어들이 있다. 또한 사용자가 쉘 스크립트를 만들어 데이타를 수집할 때, 시간 정보를 함께 수집할 수 있다. 이러한 데이타를 가지고 그래프를 그릴때, 수집한 데이타가 일정시간 간격으로 수집되었는지 확인하고 싶을 경우에 timecheck 명령어를 사용할 수 있다. 프로그램이 일정시간 간격으로 실행하였다고 하여도 시스템의 로드가 많으면, 주어진 시간 간격으로 데이타를 수집하지 못하고 시간이 밀리는 경우가 있을 수 있다.

    다음은 psinfo 명령어의 결과물과 dolog 명령어의 결과물에서 시간정보를 처리하는 예제이다.

    # psinfo -A 5 10 > psinfo.log
    # grep Date.time psinfo.log > tt
    # cat tt
    Date.time 0819.18:15:58 proc 68 zombie 0 runnable 0 lwp 136 cpu 3.58% avgload  0.09  0.07  0.07 hp+stk 42896K
    Date.time 0819.18:16:03 proc 68 zombie 0 runnable 0 lwp 136 cpu 10.21% avgload  0.08  0.07  0.07 hp+stk 42896K
    Date.time 0819.18:16:08 proc 70 zombie 0 runnable 3 lwp 138 cpu 16.60% avgload  0.28  0.11  0.09 hp+stk 42992K
    Date.time 0819.18:16:13 proc 70 zombie 0 runnable 3 lwp 138 cpu 23.59% avgload  0.45  0.15  0.10 hp+stk 42960K
    Date.time 0819.18:16:18 proc 70 zombie 0 runnable 3 lwp 138 cpu 29.34% avgload  0.59  0.18  0.11 hp+stk 42992K
    # timecheck -d . -G 3 tt
    Interval
    5
    5
    5
    5
    # timecheck -t -d . -G 3 tt
    Line     Time Interval
       2 18:16:03    5
    
    # dolog -o df-k -T 5,4 df -k /
    # ls x*
    df-k.021216.124120.5
    # grep DATE df-k.021216.124120.5
    # DATE 2002/12/16 12:41:20
    # DATE 2002/12/16 12:41:25
    # DATE 2002/12/16 12:41:30
    # DATE 2002/12/16 12:41:35
    # grep DATE df-k.021216.124120.5 | timecheck -G 4
    Interval
    5
    5
    5
    

    -d 옵션으로 컬럼의 구분자를 지정하고, -G 옵션으로 시간정보가 있는 컬럼을 지정한다.

      4.25 jwget

    jwget 명령어는 HTTP 프로토콜을 이용하여 HTML page를 웹서버로 부터 가져온다.

    # jwget -o index.html -h localhost -p 9900 /index.html
    # jwget -o cpu.gif -h localhost -p 9900 /mrepx.cgi?-n+-k+D:2010.07,7,0,24,1,100,1,3,CPU
    # ls -l cpu.gif index.html
    -rw-r--r--   1 guest    other      13681 Sep  7 18:02 cpu.gif
    -rw-r--r--   1 guest    other       1616 Sep  7 18:06 index.html
    

    위에서 첫번째 jwget 명령어는 localhost 에 9900 포트로 접속하여 "/mrepx.cgi?-n+-k+D:2010.07,7,0,24,1,100,1,3,CPU" 페이지를 요청하여 그 결과를 cpu.gif 파일에 저장한다.
    두번째 jwget 명령어는 localhost 에 9900 포트로 접속하여 index.html 페이지를 요청하여 그 결과를 index.html 파일에 저장한다.
    -h 옵션으로 웹서버 이름을 지정하고, -p 옵션을 사용하여 TCP 포트 번호를 지정한다.
    jwget 명령어는 ParmView에서 웹으로 보는 그래프 데이타를 명령어 라인에서 그래프 테이타를 가져올 수 있도록 최소한의 기능만 구현한 것이다.
    이 명령어를 범용으로 웹페이지 데이타를 가져오기 위해 사용하기에는 기능이 미비하다.

      4.26 jfind,   jfparse

    jfind 명령어는 지정한 디렉토리와 동일한 파일 시스템에 있는 하위의 모든 디렉토리 및 파일의 크기를 수집하는 명령어이다.
    jfparse 명령어는 jfind 명령어가 수집한 데이타를 분석하는 명령어이다.

    다음의 명령어는 / 루트 파일 시스템에 있는 모든 디렉토리 및 파일의 크기와 사용자 ID, 그룹 ID, 파일 모드, 최종 수정시간 정보를 수집~ 한다.

    # jfind -o jfind_root.log /
    

    다음은 jfind 명령어의 출력물의 일부이다.

    # head jfind_root.log
    DATE 2018-11-15 17:42:13
    TOP_DIRECTORY /
    T SIZE BLOCK UID GID NDIR NFILE MODE DATE FILE
    d 0:0 0:0 0 3 0:1 0:0 41ed 5613ed62 /etc/fm/fmd
    - 161 2 0 2 - - 81a4 5613edee /etc/fm/libfruid.conf
    d 161:161 2:2 0 3 1:2 1:1 41ed 5b5bfdbe /etc/fm
    l 21 1 0 0 - - a1ff 5b5bfdcb /etc/fs/hsfs -> ../../usr/lib/fs/hsfs
    l 20 1 0 0 - - a1ff 5b5bfdcb /etc/fs/dev -> ../../usr/lib/fs/dev
    l 20 1 0 0 - - a1ff 5b5bfdcb /etc/fs/zfs -> ../../usr/lib/fs/zfs
    l 20 1 0 0 - - a1ff 5b5bfdcb /etc/fs/nfs -> ../../usr/lib/fs/nfs
    l 20 1 0 0 - - a1ff 5b5bfdcb /etc/fs/ufs -> ../../usr/lib/fs/ufs
    

    이렇게 수집된 결과물을 jfparse 명령어의 입력 파일로 사용하면, 다음과 같이 디렉토리 별로 그 하위에 있는 모든 파일의 크기의 합계를 보여준다.

    # jfparse jfind-root.log
                 SIZE             BSIZE  PERCENT  NUM_DIR  NUM_FILE   UID DIRECTORY
           5272000560        5587883008  100.00%     8933    157655     0 /
    ---------------------------------------------------------------------
           4670628851        4952501248   88.63%     8378    151591     0 usr
            192024020         203720704    3.65%      217      1908     0 etc
            120006907         126769664    2.27%      151      1881     0 platform
            107054770         108995584    1.95%       54       484     0 boot
            103076038         108106752    1.93%       44       714     0 kernel
             67078534          75447296    1.35%       75      1060     0 lib
             12130410          12333056    0.22%        1         4     0 .
                  773              3584    0.00%        2         3     0 root
                  192              3584    0.00%        6         7     0 opt
                   65              1024    0.00%        1         2     0 cdrom
                    0               512    0.00%        1         1     0 media
                    0                 0    0.00%        1         0     0 mnt
                    0                 0    0.00%        2         0     0 system
    

    jfparse 명령어에 -d directory 옵션을 추가하면, 지정한 디렉토리에 포함된 디렉토리 목록을 보여준다.
    다음은 -d /etc 옵션을 지정하여, /etc 디렉토리에 포함된 모든 디렉토리에 대한 총량을 다음과 같이 출력한다.

    # jfparse -d /etc jfind-root.log
                 SIZE             BSIZE  PERCENT  NUM_DIR  NUM_FILE   UID DIRECTORY
            192024020         203720704    3.65%      217      1908     0 /etc
    ---------------------------------------------------------------------
            116416625         117045760    2.09%        3        24     0 svc
             66533343          75523584    1.35%        5       312     0 gconf
              3058410           3571200    0.06%        1       261     0 brltty
              2473100           2812928    0.05%        8       188     0 net-snmp
               638412            799232    0.01%        9        97     0 mail
               452607            612864    0.01%        2       151     0 certs
               294014            421888    0.01%        6         8     0 amd64
               228561            277504    0.00%        2         3     0 bash
               253659            272384    0.00%        2        25     0 openldap
               134136            268800    0.00%        1         5     0 devices
               177736            250880    0.00%        7        92     0 security
               172890            240640    0.00%        1        94     0 .
               141144            156160    0.00%        5        20     0 apache2
               126553            141824    0.00%       14        21     0 hal
                74325            117248    0.00%        3        66     0 fonts
               103575            109056    0.00%        4         7     0 pkg
                83307            103936    0.00%        3        27     0 xdg
                95650            101376    0.00%        1         7     0 ssh
                89834             95744    0.00%        2         8     0 ssm
                28516             95232    0.00%        4       142     0 openssl
    

      4.47 jsysexec

    jsysexec 명령어는 Solars 10 버전에서 제공하는 dtrace 명령어를 이용하여, 새로 실행한( EXEC) 프로세스 정보를 보여준다.

    다음과 같이 아무 옵션 없이 jsysexec 명령어를 실행하면, 새로 실행되는 프로세스 정보를 보여준다.

    # /opt/JSparm/bin/jsysexec
      PID   UID   PPID COMMAND
    17527   100    886 psinfo
    17528   100    886 ls
    17529   100    886 find -ls /opt
    17530   100    886 vi /etc/group
    ^C
    

    -v 옵션을 지정하면, 다음과 같이 조부모 프로세스 ID 정보를 보여주고, -N 옵션을 지정하면, 부모 프로세스와 조부모 프로세스 이름을 함께 보여준다.

    # /opt/JSparm/bin/jsysexec -v -N
      PID   UID   PPID:CMD               GPPID:CMD              COMMAND
    17533   100    886:ksh                 880:sshd             ls -l
    17534   100    886:ksh                 880:sshd             grep root /etc/passwd
    17536   100    886:ksh                 880:sshd             grep vi
    17535   100    886:ksh                 880:sshd             ps -ef
    17535   100    886:ksh                 880:sshd             ps -ef
     ^C
    

    -P file 옵션을 사용하여, jsysexec 명령어를 실행한 결과물 파일을 -P 옵션에 지정하면, 들여쓰기 방식으로 프로세스 트리를 보여준다.

    # /opt/JSparm/bin/jsysexec > jsysexec.log
    
    # cat jsysexec.log
      PID   UID   PPID COMMAND
     2626   100   2625 -bash
     2627   100   2626 /usr/sbin/quota
     2628   100   2626 /bin/cat -s /etc/motd
     2629   100   2626 /bin/mail -E
     2630   100   2626 ps
    # /opt/JSparm/bin/jsysexec -P jsysexec.log
    2625 [?] = (?)
        2626 [100] = -bash
            2627 [100] = /usr/sbin/quota
            2628 [100] = /bin/cat -s /etc/motd
            2629 [100] = /bin/mail -E
            2630 [100] = ps
    

      4.48 jsystcp

    jsystcp 명령어는 Solars 11 버전 이상에서 실행되며, dtrace 명령어를 이용하여, TCP 접속에 대한 정보를 조사합니다.

    다음과 같이 아무 옵션 없이 jsystcp 명령어를 실행하면, 나의 시스템으로 들어오는 TCP 접속과 나의 시스템에서 나가는 TCP 접속 정보를 보여준다.
    프로세스를 종료하려면, <CTRL-C>을 치면 됩니다.

    # /opt/JSparm/bin/jsystcp
      PID              IP  PORT  MSS  DIR
     2542  192.168.56.110    22 1460  OUT
      886  192.168.56.110    22 1460   IN
      778       127.0.0.1    53 8232  OUT
      778       127.0.0.1    53 8232  OUT
    ^C
    

    다음과 같이 -v 옵션을 지정하면, 좀 더 자세한 정보를 보여준다.

    # /opt/JSparm/bin/jsystcp -v
      PID         FROM_IP           TO_IP F_PORT T_PORT  MSS  DIR
      895  192.168.56.110  192.168.56.113  32805     22 1460   IN
     2487       127.0.0.1       127.0.0.1  57649     53 8232  OUT
     2487       127.0.0.1       127.0.0.1  37288     53 8232  OUT
     2487       127.0.0.1       127.0.0.1  44834     53 8232  OUT
     2487       127.0.0.1       127.0.0.1  55512     53 8232  OUT
    ^C
    

      4.48 jsysudp

    jsysudp 명령어는 Solars 11 버전 이상에서 실행되며, dtrace 명령어를 이용하여, UDP 페킷에 대한 정보를 조사합니다.

    다음과 같이 아무 옵션 없이 jsysudp 명령어를 실행하면, 나의 시스템으로 들어오는 UDP 페킷과 나의 시스템에서 나가는 UDP 페킷 정보를 보여준다.
    프로세스를 종료하려면, <CTRL-C>을 치면 됩니다.

    # /opt/JSparm/bin/jsysudp
      PID              IP  PORT   LEN  DIR
     2590  192.168.56.110  4321  1032  OUT
      378       ff02::1:2   547    72  OUT
     2577  192.168.56.110  4321  1032   IN
      378 255.255.255.255    67   308  OUT
      378 255.255.255.255    67   308  OUT
    ^C
    

    다음과 같이 -v 옵션을 지정하면, 좀 더 자세한 정보를 보여준다.

    # /opt/JSparm/bin/jsysudp -v
      PID         FROM_IP           TO_IP F_PORT T_PORT   LEN  DIR
     2577  192.168.56.110  192.168.56.113  38430   4321  1032   IN
     2613  192.168.56.113  192.168.56.110  57398   4321  1032  OUT
    ^C
    

      4.48 rmtimef

    rmtimef 명령어는 지정한 디렉토리에서 지정한 날짜/시간 패턴의 형식을 가지고 있는 파일명을 보여주거나 삭제한다.
    rmtimef 명령어는JSparm의 mmonx 시스템 통계정보 서버가 생성하는 파일이나 getdata 명령어가 생성하는 파일들을 일정 시간이 지나면, 자동으로 지울 수 있도록 도와 주는 명령어있다.

    mmonx 데몬 프로세스는 /opt/JSparm/dbspace 디렉토리에 한달에 하나씩 mdbxx-yyyy.mm 형식을 파일을 생성한다.

    다음과 같이 명령어를 실행하면, /opt/JSparm/dbspace 디렉토리에서 mdbxx-yyyy.mm 형식의 파일명을 가진 파일명들을 보여준다.

    # rmtimef -d /opt/JSparm/dbspace mdbxx-{yyyy.mm}
    mdbxx-2018.11
    mdbxx-2018.10
    mdbxx-2018.09
    mdbxx-2018.08
    mdbxx-2018.07
    mdbxx-2018.05
    mdbxx-2018.04
    mdbxx-2018.03
    mdbxx-2018.02
    mdbxx-2018.01
    mdbxx-2017.12
    mdbxx-2017.11
    mdbxx-2017.10
    mdbxx-2017.09
    

    -L 옵션과 -c 옵션을 함께 사용하면, -c 옵션에 지정한 조건에 따라 지워질 파일과 보관될 파일이 무엇인지 확인할 수 있다.
    파일이 지워지지는 않는다.
    (명령어는 2018년 11월 8일에 실행함)

    # rmtimef -L -c month=3 -d /opt/JSparm/dbspace mdbxx-{yyyy.mm}
      keep: /opt/JSparm/dbspace/mdbxx-2018.11
      keep: /opt/JSparm/dbspace/mdbxx-2018.10
      keep: /opt/JSparm/dbspace/mdbxx-2018.09
    delete: /opt/JSparm/dbspace/mdbxx-2018.08
    delete: /opt/JSparm/dbspace/mdbxx-2018.07
    delete: /opt/JSparm/dbspace/mdbxx-2018.05
    delete: /opt/JSparm/dbspace/mdbxx-2018.04
    delete: /opt/JSparm/dbspace/mdbxx-2018.03
    delete: /opt/JSparm/dbspace/mdbxx-2018.02
    delete: /opt/JSparm/dbspace/mdbxx-2018.01
    delete: /opt/JSparm/dbspace/mdbxx-2017.12
    delete: /opt/JSparm/dbspace/mdbxx-2017.11
    delete: /opt/JSparm/dbspace/mdbxx-2017.10
    delete: /opt/JSparm/dbspace/mdbxx-2017.09
    

    -D 옵션과 -c 옵션을 함께 사용하면, 조건에 맞는 파일을 삭제한다.

    # rmtimef -D -v -c month=3 -d /opt/JSparm/dbspace mdbxx-{yyyy.mm}
    [deleting condition] file before the time '2018-08-01.00:00:00'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.08'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.07'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.05'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.04'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.03'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.02'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2018.01'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2017.12'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2017.11'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2017.10'
    executing 'rm -rf /opt/JSparm/dbspace/mdbxx-2017.09'