RH442之strace和ltrace性能分析

2015年10月20日 发表评论 阅读评论

strace、ltrace是Linux环境下的程序调试工具,strace用来监察一个应用程序所使用的系统调用及它所接收的系统信息。追踪程序运行时的整个生命周期,输出每一个系统调用的名字,参数,返回值和执行消耗的时间等。其与ltrace的区别是:strace主要用于跟踪系统调用和信号;ltrace用于跟踪用户级别的函数。

一、strace程序

strace程序常用的参数如下:

-p 跟踪指定的进程
-f 跟踪由fork子进程系统调用
-F 尝试跟踪vfork子进程系统调吸入,与-f同时出现时, vfork不被跟踪
-o filename 默认strace将结果输出到stdout。通过-o可以将输出写入到filename文件中
-ff 常与-o选项一起使用,不同进程(子进程)产生的系统调用输出到filename.PID文件
-r 打印每一个系统调用的相对时间
-t 在输出中的每一行前加上时间信息。 -tt 时间确定到微秒级。还可以使用-ttt打印相对时间
-v 输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出
-s 指定每一行输出字符串的长度,默认是32。文件名一直全部输出
-c 统计每种系统调用所执行的时间,调用次数,出错次数。
-e expr 输出过滤器,通过表达式,可以过滤出掉你不想要输出

对于即将执行的命令,可以通过strace直接跟踪,这里以执行uname命令为例,如下:

[student@desktop0 ~]$ strace uname
execve("/bin/uname", ["uname"], [/* 17 vars */]) = 0
brk(0)                                  = 0x1cfe000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fdaca195000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=67468, ...}) = 0
mmap(NULL, 67468, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fdaca184000
close(3)                                = 0
open("/lib64/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
………………略

如果是已经运行的程序,可以通过-p参数查看进程的系统调用:

[root@desktop0 ~]# strace -p 1135
Process 1135 attached
select(7, [3 4], NULL, NULL, NULL
)      = ? ERESTARTNOHAND (To be restarted if no handler)
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4164, si_status=255, si_utime=2, si_stime=24} ---
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 255}], WNOHANG, NULL) = 4164
wait4(-1, 0x7fffb3ff5a94, WNOHANG, NULL) = 0
rt_sigaction(SIGCHLD, NULL, {0x7f172309f080, [], SA_RESTORER, 0x7f1720248a00}, 8) = 0
rt_sigreturn()                          = -1 EINTR (Interrupted system call)
select(7, [3 4], NULL, NULL, NULL)      = 1 (in [3])
accept(3, {sa_family=AF_INET, sin_port=htons(52208), sin_addr=inet_addr("172.25.0.250")}, [16]) = 5
fcntl(5, F_GETFL)                       = 0x2 (flags O_RDWR)
pipe([6, 7])                            = 0
…………略

不过这里使用-p参数输出的结果比较少,需要使用-f参数才能捕获fork的进程。使用-c参数能可以统计系统调用:

[root@desktop0 ~]# strace -c uname
Linux
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 26.88    0.000050           6         9           mmap
 17.74    0.000033          11         3           open
 15.05    0.000028          14         2           munmap
 13.98    0.000026           7         4           mprotect
  5.38    0.000010          10         1           write
  4.30    0.000008           2         4           fstat
  4.30    0.000008           8         1         1 access
  3.76    0.000007           1         5           close
  3.76    0.000007           2         4           brk
  1.61    0.000003           3         1           read
  1.61    0.000003           3         1           execve
  1.08    0.000002           2         1           uname
  0.54    0.000001           1         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000186                    37         1 total

如果需要捕获子进程调用,可以strace -fc配合使用。

二、ltrace程序

ltrace相关的参数如下:

-a 对齐具体某个列的返回值
-c 计算时间和调用,并在程序退出时打印摘要
-C 解码低级别名称(内核级)为用户级名称
-d 打印调试信息
-e 改变跟踪的事件
-f 跟踪子进
-h 打印帮助信息
-i 打印指令指针,当库调用时。
-l 只打印某个库中的调用。
-L 不打印库调用。
-n, --indent=NR 对每个调用级别嵌套以NR个空格进行缩进输出。
-o, --output=file 把输出定向到文件。
-p PID 附着在值为PID的进程号上进行ltrace。
-r 打印相对时间戳。
-s STRLEN 设置打印的字符串最大长度。
-S 显示系统调用。
-t, -tt, -ttt 打印绝对时间戳。
-T 输出每个调用过程的时间开销。
-u USERNAME 使用某个用户id或组ID来运行命令。 

其使用方法如下:

[root@desktop0 ~]# ltrace uname
__libc_start_main(0x401490, 1, 0x7fff0fbd9648, 0x4042a0 <unfinished ...>
strrchr("uname", '/')                                      = nil
setlocale(LC_ALL, "")                                      = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale")           = "/usr/share/locale"
textdomain("coreutils")                                    = "coreutils"
__cxa_atexit(0x401c40, 0, 0, 0x736c6974756572)             = 0
getopt_long(1, 0x7fff0fbd9648, "asnrvmpio", 0x606be0, nil) = -1
uname(0x7fff0fbd93b0)                                      = 0
fputs_unlocked(0x7fff0fbd93b0, 0x7fb4b5607400, 0x7fb4b5606280, -1) = 1
__overflow(0x7fb4b5607400, 10, 0x7fb4b582b004, 1024Linux
)       = 10
…………略

其统计时间使用方法如下:

[root@desktop0 ~]# ltrace -c uname
Linux
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 44.84    0.008281        8281         1 __libc_start_main
 23.00    0.004248        4248         1 exit
  4.19    0.000774         193         4 __freading
  3.64    0.000673         673         1 setlocale
  3.03    0.000559         279         2 fflush
  2.95    0.000545         272         2 fclose
  2.93    0.000541         541         1 __overflow
  2.68    0.000494         247         2 fileno
  2.27    0.000420         210         2 __fpending
  1.62    0.000300         300         1 bindtextdomain
  1.55    0.000287         287         1 fputs_unlocked
  1.51    0.000278         278         1 getopt_long
  1.44    0.000265         265         1 uname
  1.28    0.000237         237         1 textdomain
  1.23    0.000227         227         1 strrchr
  1.06    0.000196         196         1 __cxa_atexit
  0.76    0.000141         141         1 exit_group
------ ----------- ----------- --------- --------------------
100.00    0.018466                    24 total

通过-e进行函数类型匹配调用方法如下:

[root@desktop0 ~]# ltrace -e fclose -c uname
Linux
% time     seconds  usecs/call     calls      function
------ ----------- ----------- --------- --------------------
 83.61    0.000699         349         2 fclose
 16.39    0.000137         137         1 exit_group
------ ----------- ----------- --------- --------------------
100.00    0.000836                     3 total

通过strace、ltrace这类工具的分析,我们可以找出某些程序的性能问题在哪。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

分类: Linux/unix/mac 标签: ,
  1. feitat
    2018年5月16日16:33 | #1

    请问大神有没有bigmem这个包,rh442里讲swap优化时用到的,发行版里不自带,elel也找不到

    • admin
      2018年5月17日09:22 | #2

      这个只是红帽教学用的,发行版里是不带的

  2. feitat
    2018年5月17日09:46 | #3

    大神,您能发这个包给我吗,我需要这个包

  1. 本文目前尚无任何 trackbacks 和 pingbacks.