【问题标题】:How to interpret strace output?如何解释 strace 输出?
【发布时间】:2011-09-14 03:20:34
【问题描述】:

我需要分析我正在使用 strace 的应用程序的性能。但是,我真的不知道如何解释 strace 发出的各种系统调用。其中一些示例如下:

(A) lseek(3, 1600, SEEK_SET)                = 1600
(B) write(3, "G_DATA    300        0          "..., 800) = 800
(C) close(3)                                = 0
(D) mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b600b179000
(E) munmap(0x2b600b179000, 4096)            = 0
(F) fstat(3, {st_mode=S_IFREG|0644, st_size=1600, ...}) = 0

如果有人能用简单的英语简要解释从 (A) 到 (F) 的这些行在 I/O、传输的数据、对性能的重要性等方面的真正含义,我将不胜感激。

我浏览了 strace 的手册页,但仍然不是很自信。如果您有任何其他建议让我阅读,那就太好了。

我有一些操作系统方面的背景知识,并且了解系统调用、内存、虚拟内存、调度等是什么。

【问题讨论】:

  • strace 更像是调试工具而不是分析器。你真的在寻找像 gprof 这样的东西吗?
  • 我同意。因为'strace'只会显示系统调用,你能做的最好的就是看到系统调用之间有很大的时间间隔,并试图找出程序在这些调用之间做了什么,这些调用花了这么长时间。这不是一个很好的剖析方式。相反,使用“callgrind”(“valgrind”的一部分)并使用“kcachegrind”分析结果。或者使用 gprof、sysprof、oprofile 等。
  • 您应该阅读此处执行的系统调用的联机帮助页。运行man lseekman openman mmap等等。

标签: c linux operating-system system-calls strace


【解决方案1】:

为了理解这些,您必须熟悉 POSIX 系统调用。它们是用户空间程序用来与内核交互的接口。

lseekwriteclosemmapmunmapfstat 都是 system calls,并记录在 linux 手册的第 2 节中。

简单地说,lseek 将提供的文件描述符的内部指针移动到第二个参数指向的位置的字节,从SEEK_SET(开头)、SEEK_CUR(当前位置)或SEEK_END开始(结束)。对同一描述符的任何连续的readwrite 调用将从这个位置开始它们的动作。请注意,lseek 并非针对所有类型的描述符都实现 - 它对磁盘上的文件有意义,但不适用于套接字或管道。

write 将提供的缓冲区复制到内核空间并返回实际写入的字节数。根据描述符的种类,内核可以将数据写入磁盘或通过网络发送。这通常是一项代价高昂的操作,因为它涉及将此缓冲区传输到内核。

close 关闭提供的描述符,并释放内核中与它相关的任何资源。请注意,每个进程对同时打开的描述符数量都有限制,因此有时需要关闭描述符才能达到此限制。

mmap 是一个复杂的系统调用,用于许多用途,包括共享内存。然而,一般用法是为进程分配更多内存。 malloccalloc 库函数通常在内部使用它。

munmap 释放 mmap'ped 内存。

fstat 返回文件系统保存的有关文件的各种信息 - 大小、上次修改时间、权限等。

【讨论】:

  • 感谢您的快速回复。通过 linux 手册,您是指手册页还是单独的文档?
  • 是的,手册页。例如,man 2 writeman 2 mmap
  • 好的,我看看这些。但是,他们只是解释了调用的作用。我如何知道这些调用对整体性能的相对重要性?
  • @ketan:通过将-r 选项传递给strace
【解决方案2】:

对于每个命令都有一个手册页,您可以通过键入man 和 C 函数的名称来阅读它,例如man lseek(另请查看apropos)。他们也有传递参数的描述。

以下是简短摘要:

  • lseek - 重新定位文件描述符的读/写文件偏移量
  • write - 从缓冲区写入文件描述符
  • close - 从每个进程的对象引用表中删除一个描述符
  • mmap - 分配内存,或将文件或设备映射到内存中
  • munmap - 删除指定地址范围的映射
  • fstat - 获取路径指向的文件状态

请注意,解释单个/随机 syscals 在性能方面没有意义。要测试这些系统调用的性能重要性,您应该使用-c 参数,该参数可以计算每个系统调用的时间、调用和错误并报告摘要。然后你可以阅读更多关于这些耗时最长的内容。

要了解有关输出和strace 参数的更多信息,请查看man strace

另见:How to parse strace in shell into plain text?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2015-11-11
    • 2016-08-18
    相关资源
    最近更新 更多