linux 开发小记 perf strace

strace

strace 是一个调试工具,用于跟踪程序执行期间所发出的系统调用(system calls)和信号(signals)。它可以捕获和显示程序如何与操作系统进行交互,查看程序与内核之间的通信,从而帮助分析程序的行为和性能。

  • 调试系统调用:可以跟踪程序发出的所有系统调用,例如 open(), read(), write(), malloc(), exit() 等,帮助发现潜在的错误或性能瓶颈。
  • 捕获文件操作:查看程序对文件的读写操作,如文件打开、关闭、读取、写入等。
  • 分析库函数调用:在程序调用的库函数背后,strace 可以帮助你看到这些函数的系统调用行为。例如,分析程序在执行文件操作时底层的系统调用。
  • 调试信号处理:strace 还可以跟踪程序如何接收和处理信号,比如 SIGSEGV(段错误)等。

strace语法

strace ./my_program

这会启动 my_program,并且打印出它发出的系统调用和信号。

只追踪特定类型的系统调用:

这会仅显示 open(), read(), 和 write() 系统调用

strace -e trace=open,read,write ./my_program

将输出写入文件:

strace -o output.txt ./my_program

追踪某个进程

strace -p <pid>

这会附加到已经在运行的进程 pid 上,并开始追踪其系统调用。

过滤某个系统调用:

strace -e trace=network ./my_program

只显示与网络相关的系统调用,如 socket(), bind(), send(), recv() 等。

总结

优点:

  • strace 能帮助你查看程序的具体行为,尤其是在调试时,有助于发现无法预见的错误或不明确的系统交互。
  • 可以追踪与操作系统直接交互的部分,对于性能瓶颈或资源泄漏也能提供很多线索。
    限制:
  • 由于 strace 捕获了所有的系统调用,所以可能对程序的执行产生一定的性能影响。尤其在大量系统调用的程序中,性能影响较大。
  • 对于多线程程序,strace 可能无法完全准确地显示线程间的操作,尤其是涉及同步机制的系统调用。

perf—— 性能分析工具

perf 是 Linux 内核提供的性能分析工具,用于收集和分析系统和应用程序的性能数据。它可以帮助开发人员检测程序中的性能瓶颈,包括 CPU 使用率、内存访问模式、I/O 性能等。

常见用途:

  • 性能计数器:perf 可以收集各种性能计数器数据,如 CPU 周期、指令计数、缓存命中率等。
  • 函数级别分析:可以分析程序中各个函数的性能,查看哪些函数最消耗时间,帮助开发人员优化代码。
  • 热点分析:perf 可以用来找出程序中的性能热点(例如哪些函数或代码路径是性能瓶颈)。
  • 系统调用统计:perf 可以分析系统调用的性能,找出系统调用的瓶颈。
常见命令:
  1. 基本性能采样

    perf stat ./my_program
    

    统计 my_program 运行时的各种性能数据,包括 CPU 使用情况、上下文切换、页面错误等。

  2. 函数级性能分析

    perf record -g ./my_program
    perf report
    

    使用 perf record 记录程序的性能数据,并使用 perf report 查看程序的热点(例如哪些函数耗时最多)。

  3. CPU 核心分析

    perf top
    

    通过实时采样,显示当前系统中 CPU 占用最多的函数和代码路径。

  4. 查看特定系统调用的性能

    perf trace
    

    类似于 strace,但是更侧重于性能数据,可以显示系统调用的频率、时长等。

  5. 多进程和多线程分析

    perf record -p <pid> -g
    perf report
    

    分析某个进程或线程的性能,记录其调用栈。

  6. 查看特定性能事件

    perf stat -e cache-misses,cache-references ./my_program
    

    查看缓存缺失事件和缓存引用事件的统计信息。

优点:
  • perf 能够精确地捕获 CPU 性能事件和系统级别的性能问题,并以多种方式展示数据,帮助开发者快速定位性能瓶颈。
  • 支持多种性能分析模式,从简单的统计到复杂的采样,满足不同的分析需求。
  • 对性能分析影响较小(相对 strace 来说)。
限制:
  • 需要一些系统权限来访问某些性能计数器。
  • 对于一些高频事件,perf 可能会在采样时引入一定的开销。
  • 分析结果可能需要一定的经验来解读,尤其是当涉及到复杂的多线程和多进程分析时。

比较和选择

特性straceperf
用途跟踪系统调用和信号性能分析和计数器收集
分析粒度系统调用级别函数级别、CPU 事件、内存访问等
性能影响较大,尤其是在频繁调用时相对较小,采样和计数器不会过度影响程序运行
应用场景调试和错误跟踪,查看系统调用细节性能分析,找出性能瓶颈,优化代码
支持的功能跟踪系统调用、信号、文件操作等性能采样、热点分析、缓存访问、内存管理等
  • 选择 strace:当你需要调试程序的系统调用、跟踪文件和网络操作,或者需要了解程序与操作系统之间的交互时,strace 是一个非常有用的工具。
  • 选择 perf:当你需要深入分析程序的性能,尤其是 CPU 使用、内存访问、I/O 性能等方面时,perf 是一个更强大的工具,可以帮助你精准定位性能瓶颈。

这两个工具可以互补使用,帮助你从不同的角度分析和优化程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hesphoros

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值