"工欲善其事必先利其器",因此在具体讨论Linux应用性能优化之前,先著重描述一下常见的性能工具。对于每个工具,其主要介绍内容包括:

  • 工具的目的
  • 工具的实现原理
  • 工具的使用

首先要讨论的是ltrace工具,其介绍如下:

  • ltrace 的目的

跟踪库函数调用(顺便提一句,strace 主要用来跟踪系统调用)。

  • ltrace的实现原理

实现的关键在于系统调用ptrace(关于ptrace系统调用更多信息,可参阅ptrace(2) - Linux manual page)。主要分两部分:

    • ltrace进程本身:首先会fork一个新进程,并调用execvp执行被跟踪的进程,此后调用"waitpid(-1, &status, __WALL)"捕获被跟踪进程的相关信息,并调用WIFSTOPPED等来解析status,从而可以获知相关库调用信息;
    • 被ltrace跟踪的进程: 主要是调用」ptrace(PTRACE_TRACEME, 0, 0, 0) 「,从而相关调用可以被捕获;

  • ltrace的使用
    • 跟踪某个程序:例如要跟踪「top"命令的函数调用,可以使用"ltrace top",如下:

xxx@xxx:/usr/bin$ ltrace top __libc_start_main(0x402b60, 1, 0x7ffc31b77b88, 0x411620 <unfinished ...> __cxa_atexit(0x4115b0, 0, 0, 32) = 0 look_up_our_self(0x7ffc31b775e0, 0x7f3a2bd1cc90, 3, 64) = 0 strrchr("top", /) = nil setlocale(LC_ALL, "") = "zh_CN.UTF-8" bindtextdomain("procps-ng", "/usr/share/locale") = "/usr/share/locale"

textdomain("procps-ng") = "procps-ng"

dcgettext(0, 0x4138e0, 5, 0) = 0x4138e0 dcgettext(0, 0x4138d4, 5, 2) = 0x4138d4 dcgettext(0, 0x4138df, 5, 2) = 0x4138df。。。。。。
    • 跟踪已有的进程: 例如要跟踪已经运行的firefox进程,可以使用」ltrace -p <pid>"

xxx@xxx:/usr/bin$ ps -aux | grep firefox

xx+ 4560 12.1 7.2 1703568 583908 ? Sl 20:31 7:55 /usr/lib/firefox/firefox

xxx+ 4659 1.1 2.2 827100 182044 ? Sl 20:31 0:46 /usr/lib/firefox/plugin- container /usr/lib/flashplugin-installer/libflashplayer.so -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 4560 true plugin xxx+ 5748 0.0 0.0 21312 1020 pts/11 S+ 21:36 0:00 grep --color=auto firefox xxx@xxx:/usr/bin$ xxx@xxx:/usr/bin$ sudo ltrace -p 4560

[sudo] xxx 的密码:

--- SIGVTALRM (Virtual timer expired) --- --- SIGVTALRM (Virtual timer expired) --- --- SIGVTALRM (Virtual timer expired) ---。。。。。。
    • 跟踪进程以及其所有创建的所有子进程/线程的调用:可以使用"ltrace -f -t -p <pid>"

xxx@xxx:/usr/bin$ sudo ltrace -f -t -p 4560

[pid 4694] 21:41:26 --- SIGVTALRM (Virtual t imer expired) ---

[pid 4608] 21:41:26 --- SIGVTALRM (Virtual timer expired) --- [pid 4614] 21:41:29 --- SIGVTALRM (Virtual timer expired) --- [pid 4694] 21:41:31 --- SIGVTALRM (Virtual timer expired) ---

[pid 4608] 21:41:31 --- SIGVTALRM (Virtual timer expired) ---

[pid 4614] 21:41:34 --- SIGVTALRM (Virtual timer expired) --- [pid 4694] 21:41:36 --- SIGVTALRM (Virtual timer expired) ---

。。。。。。

后记

使用ltrace常见的场景是在程序调试或者性能分析需要进一步了解程序做了哪些库函数调用,以及调用结果如何时。

推荐阅读:

相关文章