jsyscall

   jsyscall

  사용법


	jsyscall -a [-t second] [-o output][-S][-X]
	jsyscall -c "command" [-t second] [-o output][-S][-X]
	jsyscall -n execname [-t second] [-o output][-S][-X]
	jsyscall -p pid [-t second] [-o output][-S][-X]
	jsyscall -l [-o output]
	jsyscall -C { -a | -c "command" | -n execname | -p pid } [-v] [-t second] [-o output][-S][-X]
	jsyscall -E { -a | -c "command" | -n execname | -p pid } [-t second] [-o output][-S][-X]
	jsyscall -F syscall[,...] { -a | -c "command" | -n execname | -p pid } [-v] [-t second] [-o output][-S][-X][-A][-0]
	jsyscall -P syscall[,...] { -a | -c "command" | -n execname | -p pid } [-t second] [-o output][-S][-X]
	jsyscall -T syscall[,...] { -a | -c "command" | -n execname | -p pid } [-t second] [-o output][-S][-X][-A][-0]
	jsyscall -V

	Options are as follows:

	-?                print this help
	-0                show time information
	-A                print process name and arguments instead of execname with -F or -T option
	-a                examine system calls for all processes
	-C                print the number of system calls and errors per system call
	-c "command"      run the command and examine its system calls
	-E                print the number of system calls and errors per process
	-F syscall[,...]  print system call information directly
	-l                print the names of system calls in the OS
	-n execname       examine system calls for the 'execname'
	-o output         specify output file
	-P syscall[,...]  print the number of system calls per 'COMMAND' and 'PID' and 'SYSCALL'
	-p pid            examine system calls for the 'pid'
	-S                print only dtrace script
	-T syscall[,...]  print user stack trace directly
	-t second         examine system calls during the second
	-v                verbose mode
	-V                show version
	-X                except system call of 'dtrace' commands
  설명

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

다음은 jsyscall 명령어의 사용 예제이다.

# /opt/JSparm/bin/jsyscall -a -t 2
Tracing... for 2 seconds
:: For all processes
:: For system call: ALL
:: 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

위의 명령어에서 -a 옵션은 모든 프로세스의 시스템 콜을 조사하라는 의미이고, -t 옵션을 사용하여 데이타를 수집하는 시간을 2초로 지정하였다.
jsyscall 명령어는 CPU-TIME 컬럼의 값이 큰 순서로 데이타를 보여준다.

jsyscall 명령어의 출력의 의미는 다음과 같다.

:: For all processes
모든 프로세스에 대하여 조사를 하였다는 의미이다.
:: For all system: ALL
모든 시스템 콜에 대하여 조사를 하였다는 의미이다.
:: Date: 2010 Feb 5 13:17:06
데이타를 수집한 날짜를 보여준다.
:: Elapsed: 2.109
데이타를 수집하는데 소요된 시간을 1/1000초 까지 보여준다.
컬럼 설명
SYSCALL 시스템 콜 이름

맨 밑에 있는 'TOTAL'에서 CPU-TIME_AVG에 대해서는 시스템 콜당 소요된 평균시간이고, 나머지는 전체에 대한 합계이다.

CPU-TIME_AVG 1개의 시스템 콜이 CPU를 사용한 평균시간

CPU-TIME_AVG = CPU_TIME / COUNT

COUNT 시스템 콜이 호출된 횟수
CPU-TIME 시스템 콜이 실제로 CPU를 사용한 시간
ELAPSED-TIME 시스템 콜에서 소요된 시간
시스템 콜 내부에서 sleep한 시간도 포함된다.

다음은 -p 옵션을 사용하여 PID 895 번 프로세스의 시스템 콜 정보를 5 초 동안 수집한 예제이다.

# jsyscall -p 895 -t 5
Tracing... for 5 seconds
:: For pid = 895
:: Date: 2010 Feb  5 13:48:54
:: Elapsed: 5.003
            SYSCALL   CPU-TIME_AVG    COUNT       CPU-TIME   ELAPSED-TIME
            pollsys    0.000005503       35    0.000192631    4.077108994
               read    0.000002112       49    0.000103511    0.000146127
             writev    0.000006594        6    0.000039569    0.000044524
          setitimer    0.000001400       24    0.000033612    0.000057073
         setcontext    0.000001840       13    0.000023932    0.000034371
        lwp_sigmask    0.000000404       13    0.000005261    0.000027997
              TOTAL    0.000002846      140    0.000398516    4.077419086

실행 도중에 'CTRL-C' 키를 타이핑하면, 그때까지의 정보를 출력한다.

jsyscall 명령어는 dtrace 명령어를 실행하여, 그 결과물을 받아서 사용자가 보기 쉽게 가공하여 보여준다.
-S 옵션을 지정하면, dtrace 명령어를 실행할 때 사용되는 script의 내용을 보여준다.

# jsyscall -a -t 2 -S
#!/usr/sbin/dtrace -s
#

#pragma D option quiet
#pragma D option dynvarsize=32m

dtrace:::BEGIN
{
        self->begin = timestamp;
        self->start = 0;
        self->vstart = 0;
        printf( "Tracing... for 2 seconds\n" );
        printf( ":: For all processes\n" );
        printf( ":: For system call: ALL\n" );

}

syscall:::entry
{
        @V_calls[probefunc] = count();
        self->start = timestamp;
        self->vstart = vtimestamp;
}

syscall:::return
/self->start/
{
        this->elapsed_time = timestamp - self->start;
        @V_etime[probefunc] = sum(this->elapsed_time);
        self->start = 0;
        this->cpu_time = vtimestamp - self->vstart;
        @V_vtime[probefunc] = sum(this->cpu_time);
        self->vstart = 0;
}

tick-2sec
{
        exit(0);
}

dtrace:::END
{
        self->elapsed = timestamp - self->begin;
        printf( ":: Date: %Y\n", walltimestamp );
        printf( ":: Elapsed: %d\n", self->elapsed );
        printf( "\n" );
        printf( ":: Syscall counts:\n%16s %15s\n", "SYSCALL", "COUNT" );
        printa( "%16s %@15d\n", @V_calls );
        printf( "\n" );
        printf( ":: Elapsed time:\n%16s %15s\n", "SYSCALL", "TIME(ns)" );
        printa( "%16s %@15d\n", @V_etime );
        printf( "\n" );
        printf( ":: CPU time:\n%16s %15s\n", "SYSCALL", "TIME(ns)" );
        printa( "%16s %@15d\n", @V_vtime );
        printf( "\n" );
}

다음은 jsyscall 명령어의 옵션이다.

옵션설명
-0 -0 옵션을 지정하면, -P 옵션과 -T 옵션을 사용할 때 시간정보를 출력한다.
-A -A 옵션을 지정하면, -P 옵션과 -T 옵션을 사용할 때 프로세스명과 인수도 함께 출력한다.
-a -a 옵션을 지정하면, 모든 프로세스의 시스템 콜 정보를 조사한다.
-C -C 옵션을 지정하면, 시스템 콜 별로 호출된 횟수만 보여준다.

# jsyscall -C -a -t 2
Tracing... for 2 seconds
:: For all processes
:: For system call: ALL
:: Date: 2012 Jan 17 17:36:50
:: Elapsed: 2.001
            SYSCALL    COUNT
              ioctl       94
            pollsys       48
           p_online       32
               read        8
                brk        8
          setitimer        7
              write        6
          sigaction        4
              gtime        3
        lwp_sigmask        3
          sysconfig        3
	... skip ...
              TOTAL      228

-v 옵션을 함께 사용하면, 해당 시스템 콜 중에서 오류가 발생한 시스템 콜의 횟수도 보여준다.

# jsyscall -C -v -a -t 2
Tracing... for 2 seconds
:: For all processes
:: For system call: ALL
:: Date: 2012 Jan 17 17:38:55
:: Elapsed: 2.006
            SYSCALL    COUNT  CNT_ERR
              ioctl       98       63
            pollsys       48        4
           p_online       32       31
               read        8        4
                brk        8        0
          setitimer        8        0
              write        6        0
         setcontext        4        0
        lwp_sigmask        4        0
          sigaction        4        0
          sysconfig        3        0
	... skip ...
              TOTAL      234      104

-c "command" -c "command" 옵션을 지정하면, 지정한 명령어를 실행하고, 그 프로세스의 시스템 콜을 정보를 조사한다.

# jsyscall -c "ls -l /tmp"

위의 명령어를 실행하면, "ls -l /tmp" 명령어를 먼저 실행하고, 그 프로세스의 시스템 콜 정보만 수집한다.

-E -E 옵션을 지정하면, 프로세스 별로 다음과 같이 시스템 콜의 횟수와 그 중에 오류가 난 시스템 콜 회수도 CNT_ERR 컬럼에 보여준다.

# jsyscall -E -a -t 5
Tracing... for 5 seconds
:: For all processes
:: For system call: ALL
:: Date: 2011 Sep 22 23:15:11
:: Elapsed: 5.001
         COMMAND   PID     COUNT  CNT_ERR
          dtrace  1919     1594     1539
              ls  1920      414        2
            java   745       99        4
            Xorg   601       79       20
             ksh   789       63        5
         dtgreet   703       49        0
             ksh  1920       15        0
           httpd   653       14        0
        sendmail   767        7        0
        devfsadm   522        5        2
        jsyscall  1918        1        0
           TOTAL     -     2340     1572

-F syscall[,...] -F syscall[,...] 옵션을 지정하면, 지정한 시스템 콜을 호출한 사용자 프로세스에 대하여 다음과 같은 정보를 실시간으로 보여준다.

# jsyscall -F read -a -t 2 -0
Tracing... for 2 seconds
:: For all processes
:: For system call: 'read'
.......WALLTIMESTAMP   PID  PPID  UID                  SYSCALL   RETVAL ERR COMMAND
2012 Jan 17 14:38:26   775   765    0                     read       40   0 Xorg
2012 Jan 17 14:38:26   775   765    0                     read ffffffff  11 Xorg
2012 Jan 17 14:38:27   775   765    0                     read       38   0 Xorg
2012 Jan 17 14:38:27   775   765    0                     read ffffffff  11 Xorg
2012 Jan 17 14:38:27  1923   765    0                     read       98   0 dtrace
2012 Jan 17 14:38:27   775   765    0                     read       40   0 Xorg
2012 Jan 17 14:38:27   775   765    0                     read ffffffff  11 Xorg
2012 Jan 17 14:38:28   775   765    0                     read       38   0 Xorg
2012 Jan 17 14:38:28   775   765    0                     read ffffffff  11 Xorg

위에서 RETVAL은 시스템 콜에서 반환되는 값이고 16진수 값이다. ERR을 시스템 콜 오류시에 지정되는 errno 변수의 값이다.

-0 옵션을 지정하면 위와 같이 시스템 콜을 호출한 시간 정보가 출력된다.

-v 옵션을 함께 사용하면, 다음과 같이 시스템 콜에서 경과한 시간(ETIME)과 실제 CPU를 사용한 시간(CTIME)을 추가적으로 보여준다.
시간의 단위는 초단위이고 1/1000000 초까지 나타낸다.

# jsyscall -F read -v -a -t 2 -0
Tracing... for 2 seconds
:: For all processes
:: For system call: 'read'
.......WALLTIMESTAMP   PID  PPID  UID             SYSCALL   RETVAL ERR     ETIME    CTIME COMMAND
2012 Jan 17 19:12:38   775   765    0                read       40  0   0.000011 0.000005 Xorg
2012 Jan 17 19:12:38   775   765    0                read ffffffff 11   0.000006 0.000003 Xorg
2012 Jan 17 19:12:38   775   765    0                read       38  0   0.000014 0.000007 Xorg
2012 Jan 17 19:12:38   775   765    0                read ffffffff 11   0.000002 0.000001 Xorg
2012 Jan 17 19:12:38  4536  4208    0                read       98  0   0.000013 0.000009 dtrace
2012 Jan 17 19:12:39   775   765    0                read       40  0   0.000012 0.000006 Xorg
2012 Jan 17 19:12:39   775   765    0                read ffffffff 11   0.000002 0.000001 Xorg
2012 Jan 17 19:12:39   775   765    0                read       38  0   0.000013 0.000007 Xorg
2012 Jan 17 19:12:39   775   765    0                read ffffffff 11   0.000002 0.000001 Xorg

-l -l 옵션을 지정하면, 다음과 같이 system call의 이름을 보여준다.

# jsyscall -l
   ID   PROVIDER            MODULE                          FUNCTION NAME
48806    syscall                                               nosys entry
48807    syscall                                               nosys return
48808    syscall                                               rexit entry
48809    syscall                                               rexit return
48810    syscall                                             forkall entry
48811    syscall                                             forkall return
48812    syscall                                                read entry
48813    syscall                                                read return
48814    syscall                                               write entry
48815    syscall                                               write return
48816    syscall                                                open entry
48817    syscall                                                open return
48818    syscall                                               close entry
48819    syscall                                               close return
48820    syscall                                                wait entry
48821    syscall                                                wait return
... skip ...

-n execname -n execname 옵션을 지정하면, 지정한 명령어의 이름을 가진 프로세스의 시스템 콜을 정보를 조사한다
-o output -o output 옵션을 지정하면, jsyscall 명령어의 출력을 표준출력으로 보내지 않고, 파일로 파일로 저장한다.
-P syscall[,...] -P syscall[,...] 옵션을 사용하면, 다음과 같이 지정한 시스템 콜을 호출한 명령어 이름과 PID와 횟수를 보여준다.

# jsyscall -P mmap,munmap -t 10 -a
:: For syscal call: 'mmap,munmap'
:: Date: 2010 Sep  3 10:23:59
:: Elapsed: 10.001
         COMMAND   PID         SYSCALL   COUNT
          vmstat 15162          munmap      50
          vmstat 15162            mmap      50
              ps 16476            mmap      35
              ls 16477            mmap      25
            find 16478            mmap      25
              ps 16476          munmap      10
              ls 16477          munmap       7
            find 16478          munmap       7
          dtrace 16475            mmap       1
           TOTAL     -               -     210

시스템 콜 이름에 'all' 이라고 지정하면, 모든 시스템 콜에 대하여 stack trace를 출력한다.

-p pid -p pid 옵션을 지정하면, 지정한 PID의 프로세스의 시스템 콜 정보만 수집한다.
-S -S 옵션을 지정하면, dtrace 명령어가 실행할 dtrace script를 보여준다.
-T syscall[,...] -T syscall 옵션을 사용하면, 지정한 시스템 콜을 호출한 사용자 프로세스의 stack trace를 실시간으로 보여준다.

# jsyscall -T write -t 2 -0
Tracing... for 2 seconds
:: For syscal call: 'write'

2011 Sep 18 23:58:25 pid=4958 uid=0 syscall=write execname=dtrace
              libc.so.1`_write+0xa
              libc.so.1`_ndoprnt+0x252a
              libc.so.1`vfprintf+0x71
              libdtrace.so.1`dt_printf+0x127
              libdtrace.so.1`dt_printf_format+0x520
              libdtrace.so.1`dtrace_fprintf+0x30
              libdtrace.so.1`dt_consume_cpu+0x4a3
              libdtrace.so.1`dt_consume_begin+0x92
              libdtrace.so.1`dtrace_consume+0x114
              libdtrace.so.1`dtrace_work+0xaa
              dtrace`main+0x902
              dtrace`_start+0x6c

2011 Sep 18 23:58:25 pid=4958 uid=0 syscall=write execname=dtrace
              libc.so.1`_write+0xa
              libc.so.1`_ndoprnt+0x252a
              libc.so.1`vfprintf+0x71
              libdtrace.so.1`dt_printf+0x127
              libdtrace.so.1`dt_print_ustack+0x97
              libdtrace.so.1`dt_consume_cpu+0x3ae
              libdtrace.so.1`dtrace_consume+0x181
              libdtrace.so.1`dtrace_work+0xaa
              dtrace`main+0x902
              dtrace`_start+0x6c
... skip ...

여러 개의 시스템 콜을 지정하려면, 콤마로 분리하여 여러 개를 지정할 수 있다.
시스템 콜 이름에 'all' 이라고 지정하면, 모든 시스템 콜에 대하여 stack trace를 출력한다.

-0 옵션을 지정하면 위와 같이 시스템 콜을 호출한 시간 정보가 출력된다.

-t second -t second 옵션을 사용하여, 몇초 동안 시스템 콜을 조사할지 지정한다.

-c "command" 옵션을 사용할 경우에는 해당 명령어가 종료되면, jsyscall 명령어도 종료된다.
지정한 시간에 되기 전에 Ctrl-C를 타이핑하면 그때까지 수집한 정보를 보여준다.
-t 옵션을 지정하지 않으면, Ctrl-C를 타이핑 타이핑할 때까지 계속 모니터링한다.

-v -v 옵션을 지정하면, 메인 옵션에서 보여주는 정보를 좀 더 자세히 보여준다.
-v 옵션은 -C 와 -F 옵션과 함께 사용할 수 있다.
-C 옵션과 함께 사용하면, 오류가 발생한 시스템 콜의 횟수도 함께 보여준다.
-F 옵션과 함께 사용하면, 시스템 콜에 소요된 시간도 함께 표시한다.
-V -V 옵션을 지정하면, 명령어의 버전 정보를 보여준다.
-X -X 옵션을 지정하면 "dtrace" 이름을 가진 프로세스의 system call은 처리하지 않는다.