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은 처리하지 않는다.
|
|