[转载] Linux常用性能分析命令(二)
目录结构:
5. 性能分析命令之sar命令使用
6. 性能分析命令之strace命令使用
5. 性能分析命令之sar命令
sar(System ActivityReporter 系统活动情况报告)是目前Linux上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用sar命令有需要安装sysstat包。
sar常用格式:
sar [options] [-A] [-o file] t [n]
其中:
t为采样间隔,n为采样次数,默认值是1;
-o file表示将命令结果以二进制格式存放在文件中,file 是文件名。
options 为命令行选项,sar命令常用选项如下:
$ sar --help Usage: sar [ options ] [ <interval> [ <count> ] ] Options are: [ -A ] [ -b ] [ -B ] [ -C ] [ -d ] [ -h ] [ -m ] [ -p ] [ -q ] [ -r ] [ -R ] [ -S ] [ -t ] [ -u [ ALL ] ] [ -v ] [ -V ] [ -w ] [ -W ] [ -y ] [ -I { <int> [,...] | SUM | ALL | XALL } ] [ -P { <cpu> [,...] | ALL } ] [ -j { ID | LABEL | PATH | UUID | ... } ] [ -n { <keyword> [,...] | ALL } ] [ -o [ <filename> ] | -f [ <filename> ] ] [ --legacy ] [ -i <interval> ] [ -s [ <hh:mm:ss> ] ] [ -e [ <hh:mm:ss> ] ]
-A:所有报告的总和
-u:输出CPU使用情况的统计信息
-v:输出inode、文件和其他内核表的统计信息
-d:输出每一个块设备的活动信息
-r:输出内存和交换空间的统计信息
-b:显示I/O和传送速率的统计信息
-a:文件读写情况
-c:输出进程统计信息,每秒创建的进程数
-R:输出内存页面的统计信息
-y:终端设备活动情况
-w:输出系统交换活动信息
5.1 CPU资源监控
例如,每10秒采样一次,连续采样3次,观察CPU的使用情况,并将采样结果以二进制形式存入当前目录下的文件sar_cpumonitor中,需键入如下命令:
$ sar -u -o /home/deployer/sar_cpumonitor 10 3 Linux 2.6.32-504.el6.x86_64 (resuathenan) 08/07/2017 _x86_64_ (8 CPU) 02:20:35 PM CPU %user %nice %system %iowait %steal %idle 02:20:45 PM all 0.60 0.00 0.61 0.01 0.00 98.77 02:20:55 PM all 0.43 0.00 0.49 0.01 0.00 99.07 02:21:05 PM all 0.46 0.00 0.50 0.00 0.00 99.03 Average: all 0.50 0.00 0.54 0.01 0.00 98.96
输出项说明:
CPU:all 表示统计信息为所有 CPU 的平均值。
%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。
%nice:显示在用户级别,用于nice操作,所占用 CPU 总时间的百分比。
%system:在核心级别(kernel)运行所使用 CPU 总时间的百分比。
%iowait:显示用于等待I/O操作占用 CPU 总时间的百分比。
%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。
%idle:显示 CPU 空闲时间占用 CPU 总时间的百分比。
1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈
2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量
3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU 。
如果要查看二进制文件test中的内容,需键入如下sar命令:
$ sar -u -f /home/deployer/sar_cpumonitor Linux 2.6.32-504.el6.x86_64 (resuathenan) 08/07/2017 _x86_64_ (8 CPU) 02:20:35 PM CPU %user %nice %system %iowait %steal %idle 02:20:45 PM all 0.60 0.00 0.61 0.01 0.00 98.77 02:20:55 PM all 0.43 0.00 0.49 0.01 0.00 99.07 02:21:05 PM all 0.46 0.00 0.50 0.00 0.00 99.03 Average: all 0.50 0.00 0.54 0.01 0.00 98.96
5.2 inode、文件和其他内核表监控
例如,每10秒采样一次,连续采样3次,观察核心表的状态,需键入如下命令:
# sar -v 10 3 Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 02:56:17 PM dentunusd file-nr inode-nr pty-nr 02:56:27 PM 191184 32288 64396 2 02:56:37 PM 191144 31712 64339 1 02:56:47 PM 191148 31648 64336 1 Average: 191159 31883 64357 1
输出项说明:
dentunusd:目录高速缓存中未被使用的条目数量
file-nr:文件句柄(file handle)的使用数量
inode-nr:索引节点句柄(inode handle)的使用数量
pty-nr:使用的pty数量
5.3 内存和交换空间监控
例如,每10秒采样一次,连续采样3次,监控内存分页:
# sar -r 10 3 Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 03:00:32 PM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit 03:00:42 PM 48430180 216121820 81.69 329908 208611880 37177152 9.32 03:00:52 PM 48431872 216120128 81.69 329908 208611880 37174352 9.32 03:01:02 PM 48425688 216126312 81.70 329908 208611880 37189264 9.33 Average: 48429247 216122753 81.69 329908 208611880 37180256 9.32
输出项说明:
kbmemfree:这个值和free命令中的free值基本一致,所以它不包括buffer和cache的空间.
kbmemused:这个值和free命令中的used值基本一致,所以它包括buffer和cache的空间.
%memused:这个值是kbmemused和内存总量(不包括swap)的一个百分比.
kbbuffers和kbcached:这两个值就是free命令中的buffer和cache.
kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap).
%commit:这个值是kbcommit与内存总量(包括swap)的一个百分比.
5.4 内存分页监控
例如,每10秒采样一次,连续采样3次,监控内存分页:
$ sar -B 10 3 Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 03:06:09 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 03:06:19 PM 0.00 22.49 15449.20 0.00 4163.05 0.00 0.00 0.00 0.00 03:06:29 PM 0.00 31.76 7719.40 0.00 2936.08 0.00 0.00 0.00 0.00 03:06:39 PM 0.00 29.63 6918.02 0.00 2665.37 0.00 0.00 0.00 0.00 Average: 0.00 27.96 10026.52 0.00 3254.35 0.00 0.00 0.00 0.00
输出项说明:
pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)
pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)
fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)
majflt/s:每秒钟产生的主缺页数.
pgfree/s:每秒被放入空闲队列中的页个数
pgscank/s:每秒被kswapd扫描的页个数
pgscand/s:每秒直接被扫描的页个数
pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数
%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比
5.5 I/O和传送速率监控
例如,每10秒采样一次,连续采样3次,报告缓冲区的使用情况,需键入如下命令:
$ sar -b 10 3 Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 03:16:14 PM tps rtps wtps bread/s bwrtn/s 03:16:24 PM 19.56 0.00 19.56 0.00 247.14 03:16:34 PM 9.66 0.00 9.66 0.00 120.72 03:16:44 PM 11.81 0.00 11.81 0.00 147.35 Average: 13.68 0.00 13.68 0.00 171.77
输出项说明:
tps:每秒钟物理设备的 I/O 传输总量
rtps:每秒钟从物理设备读入的数据总量
wtps:每秒钟向物理设备写入的数据总量
bread/s:每秒钟从物理设备读入的数据量,单位为 块/s
bwrtn/s:每秒钟向物理设备写入的数据量,单位为 块/s
5.6 进程队列长度和平均负载状态监控
例如,每10秒采样一次,连续采样3次,监控进程队列长度和平均负载状态:
$ sar -q 10 3 Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 03:18:42 PM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 03:18:52 PM 2 523 0.37 0.60 0.44 03:19:02 PM 1 521 0.31 0.58 0.44 03:19:12 PM 1 525 0.26 0.56 0.43 Average: 1 523 0.31 0.58 0.44
输出项说明:
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(System load average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载
5.7 设备使用情况
例如,每10秒采样一次,连续采样3次,报告设备使用情况,需键入如下命令:
$ sar -d 10 3 -p Linux 2.6.32-504.el6.x86_64 (OSS-ZYGL-291) 08/07/2017 _x86_64_ (16 CPU) 03:22:57 PM DEV tps rd_sec/s wr_sec/s avgrq-sz avgqu-sz await svctm %util 03:23:07 PM sda 1.80 0.00 20.04 11.11 0.00 0.00 0.00 0.00 03:23:07 PM VolGroup00-LogVol00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 03:23:07 PM VolGroup00-LogVol01 2.51 0.00 20.04 8.00 0.00 0.00 0.00 0.00
。。。。。。
其中:
参数-p可以打印出sda,hdc等磁盘设备名称,如果不用参数-p,设备节点则有可能是dev8-0,dev22-0
tps:每秒从物理磁盘I/O的次数.多个逻辑请求会被合并为一个I/O磁盘请求,一次传输的大小是不确定的.
rd_sec/s:每秒读扇区的次数.
wr_sec/s:每秒写扇区的次数.
avgrq-sz:平均每次设备I/O操作的数据大小(扇区).
avgqu-sz:磁盘请求队列的平均长度.
await:从请求磁盘操作到系统完成处理,每次请求的平均消耗时间,包括请求队列等待时间,单位是毫秒(1秒=1000毫秒).
svctm:系统处理每次请求的平均时间,不包括在请求队列中消耗的时间.
%util:I/O请求占CPU的百分比,比率越大,说明越饱和.
1. avgqu-sz 的值较低时,设备的利用率较高。
2. 当%util的值接近 1% 时,表示设备带宽已经占满。
补充:要判断系统瓶颈问题,有时需几个 sar 命令选项结合起来
怀疑CPU存在瓶颈,可用 sar -u 和 sar -q 等来查看
怀疑内存存在瓶颈,可用 sar -B、sar -r 和 sar -W 等来查看
怀疑I/O存在瓶颈,可用 sar -b、sar -u 和 sar -d 等来查看
6. 性能分析命令之strace命令
strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通 过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。
$ strace ls execve("/bin/ls", ["ls"], [/* 26 vars */]) = 0 brk(0) = 0x10f1000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d47000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=42854, ...}) = 0 mmap(NULL, 42854, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f43f2d3c000 close(3) = 0 open("/lib64/libselinux.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\320X\0M2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=124624, ...}) = 0 mmap(0x324d000000, 2221912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324d000000 mprotect(0x324d01d000, 2093056, PROT_NONE) = 0 mmap(0x324d21c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c000) = 0x324d21c000 mmap(0x324d21e000, 1880, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x324d21e000 close(3) = 0 open("/lib64/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@!\0L2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=47112, ...}) = 0 mmap(0x324c000000, 2128816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324c000000 mprotect(0x324c007000, 2093056, PROT_NONE) = 0 mmap(0x324c206000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x324c206000 close(3) = 0 open("/lib64/libcap.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\23@N2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=19016, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d3b000 mmap(0x324e400000, 2111776, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324e400000 mprotect(0x324e404000, 2093056, PROT_NONE) = 0 mmap(0x324e603000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x324e603000 close(3) = 0 open("/lib64/libacl.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\36\200P2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=33816, ...}) = 0 mmap(0x3250800000, 2126416, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x3250800000 mprotect(0x3250807000, 2093056, PROT_NONE) = 0 mmap(0x3250a06000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x3250a06000 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0p\356\201K2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1926760, ...}) = 0 mmap(0x324b800000, 3750152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324b800000 mprotect(0x324b98a000, 2097152, PROT_NONE) = 0 mmap(0x324bb8a000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18a000) = 0x324bb8a000 mmap(0x324bb8f000, 18696, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x324bb8f000 close(3) = 0 open("/lib64/libdl.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340\r@K2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=22536, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d3a000 mmap(0x324b400000, 2109696, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324b400000 mprotect(0x324b402000, 2097152, PROT_NONE) = 0 mmap(0x324b602000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x324b602000 close(3) = 0 open("/lib64/libpthread.so.0", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340]\300K2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=145896, ...}) = 0 mmap(0x324bc00000, 2212848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324bc00000 mprotect(0x324bc17000, 2097152, PROT_NONE) = 0 mmap(0x324be17000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x324be17000 mmap(0x324be19000, 13296, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x324be19000 close(3) = 0 open("/lib64/libattr.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200\23\200M2\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=21152, ...}) = 0 mmap(0x324d800000, 2113888, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x324d800000 mprotect(0x324d804000, 2093056, PROT_NONE) = 0 mmap(0x324da03000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x3000) = 0x324da03000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d39000 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d37000 arch_prctl(ARCH_SET_FS, 0x7f43f2d377a0) = 0 mprotect(0x324d21c000, 4096, PROT_READ) = 0 mprotect(0x324c206000, 4096, PROT_READ) = 0 mprotect(0x3250a06000, 4096, PROT_READ) = 0 mprotect(0x324bb8a000, 16384, PROT_READ) = 0 mprotect(0x324b602000, 4096, PROT_READ) = 0 mprotect(0x324b21f000, 4096, PROT_READ) = 0 mprotect(0x324be17000, 4096, PROT_READ) = 0 mprotect(0x324da03000, 4096, PROT_READ) = 0 munmap(0x7f43f2d3c000, 42854) = 0 set_tid_address(0x7f43f2d37a70) = 1174 set_robust_list(0x7f43f2d37a80, 0x18) = 0 futex(0x7fffbe37489c, FUTEX_WAKE_PRIVATE, 1) = 0 futex(0x7fffbe37489c, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 7f43f2d377a0) = -1 EAGAIN (Resource temporarily unavailable) rt_sigaction(SIGRTMIN, {0x324bc05c60, [], SA_RESTORER|SA_SIGINFO, 0x324bc0f710}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0x324bc05cf0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x324bc0f710}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=10240*1024, rlim_max=RLIM_INFINITY}) = 0 statfs("/selinux", {f_type="EXT2_SUPER_MAGIC", f_bsize=4096, f_blocks=7708159, f_bfree=6965250, f_bavail=6572034, f_files=1966080, f_ffree=1898279, f_fsid={306938220, 1840112842}, f_namelen=255, f_frsize=4096}) = 0 brk(0) = 0x10f1000 brk(0x1112000) = 0x1112000 open("/proc/filesystems", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f43f2d46000 read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tb"..., 1024) = 317 read(3, "", 1024) = 0 close(3) = 0 munmap(0x7f43f2d46000, 4096) = 0 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=99158576, ...}) = 0 mmap(NULL, 99158576, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f43ecea6000 close(3) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 ioctl(1, TIOCGWINSZ, {ws_row=29, ws_col=107, ws_xpixel=0, ws_ypixel=0}) = 0 open(".", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 3 fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC) getdents(3, /* 7 entries */, 32768) = 224 getdents(3, /* 0 entries */, 32768) = 0 close(3) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ?
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
strace参数
-c 统计每一系统调用的所执行的时间,次数和出错的次数等. -d 输出strace关于标准错误的调试信息. -f 跟踪由fork调用所产生的子进程. -ff 如果提供-o filename,则所有进程的跟踪结果输出到相应的filename.pid中,pid是各进程的进程号. -F 尝试跟踪vfork调用.在-f时,vfork不被跟踪. -h 输出简要的帮助信息. -i 输出系统调用的入口指针. -q 禁止输出关于脱离的消息. -r 打印出相对时间关于,,每一个系统调用. -t 在输出中的每一行前加上时间信息. -tt 在输出中的每一行前加上时间信息,微秒级. -ttt 微秒级输出,以秒了表示时间. -T 显示每一调用所耗的时间. -v 输出所有的系统调用.一些调用关于环境变量,状态,输入输出等调用由于使用频繁,默认不输出. -V 输出strace的版本信息. -x 以十六进制形式输出非标准字符串 -xx 所有字符串以十六进制形式输出. -a column 设置返回值的输出位置.默认 为40. -e expr 指定一个表达式,用来控制如何跟踪.格式如下: [qualifier=][!]value1[,value2]... qualifier只能是 trace,abbrev,verbose,raw,signal,read,write其中之一.value是用来限定的符号或数字.默认的 qualifier是 trace.感叹号是否定符号.例如: -eopen等价于 -e trace=open,表示只跟踪open调用.而-etrace!=open表示跟踪除了open以外的其他调用.有两个特殊的符号 all 和 none. 注意有些shell使用!来执行历史记录里的命令,所以要使用\\. -e trace=set 只跟踪指定的系统 调用.例如:-e trace=open,close,rean,write表示只跟踪这四个系统调用.默认的为set=all. -e trace=file 只跟踪有关文件操作的系统调用. -e trace=process 只跟踪有关进程控制的系统调用. -e trace=network 跟踪与网络有关的所有系统调用. -e strace=signal 跟踪所有与系统信号有关的 系统调用 -e trace=ipc 跟踪所有与进程通讯有关的系统调用 -e abbrev=set 设定 strace输出的系统调用的结果集.-v 等与 abbrev=none.默认为abbrev=all. -e raw=set 将指 定的系统调用的参数以十六进制显示. -e signal=set 指定跟踪的系统信号.默认为all.如 signal=!SIGIO(或者signal=!io),表示不跟踪SIGIO信号. -e read=set 输出从指定文件中读出 的数据.例如: -e read=3,5 -e write=set 输出写入到指定文件中的数据. -o filename 将strace的输出写入文件filename -p pid 跟踪指定的进程pid. -s strsize 指定输出的字符串的最大长度.默认为32.文件名一直全部输出. -u username 以username 的UID和GID执行被跟踪的命令
命令示例
通用的完整用法
$ strace -o output.txt -T -tt -e trace=all -p 2184
上面的含义是跟踪2184进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。