[转载] 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文件里面。

posted on 2017-08-07 17:50  secdata  阅读(350)  评论(0编辑  收藏  举报

导航