这些strace系统调用是什么意思?

35

我需要对一个应用程序进行性能分析,我使用了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的man页面,但仍然不太自信。如果您有其他建议让我阅读,那将是非常好的。 我有一些关于操作系统的背景知识,并且理解什么是系统调用、内存、虚拟内存、调度等等。

3
strace主要是用于调试工具而非分析工具。你是否真正需要的是像gprof这样的东西? - Duck
1
我同意。由于'strace'仅会显示系统调用,因此您能做的最好的事情是查看系统调用之间的大时间差,并尝试弄清楚程序在这些调用之间所做的可能花费了很长时间的操作。这不是一种好的分析方法。相反,请使用'callgrind'('valgrind'的一部分)并使用'kcachegrind'分析结果。或者使用gprof、sysprof、oprofile或类似工具。 - David Schwartz
1
你应该阅读这里执行的系统调用的手册页。运行 man lseekman openman mmap 等等。 - nos
2个回答

30
为了理解这些,您需要熟悉POSIX系统调用。它们是用户空间程序与内核交互的接口。
"lseek"、"write"、"close"、"mmap"、"munmap"和"fstat"都是系统调用,并在linux手册的第2部分中有文档记录。
简单来说,"lseek"将提供的文件描述符的内部指针移动到由第二个参数指定的位置上的字节,从"SEEK_SET"(开头)、"SEEK_CUR"(当前位置)或"SEEK_END"(结尾)开始。任何连续的"read"和"write"调用都将从此位置开始执行。请注意,不是所有类型的描述符都实现了"lseek" - 它对于磁盘上的文件有意义,但对于套接字或管道则没有意义。
"write"将提供的缓冲区复制到内核空间,并返回实际写入的字节数。根据描述符的类型,内核可能会将数据写入磁盘或通过网络发送。这通常是一项昂贵的操作,因为它涉及将该缓冲区传输到内核。
"close"关闭提供的描述符,并释放与其关联的任何内核资源。请注意,每个进程都有一个同时打开描述符数量的限制,因此有时需要关闭描述符以避免达到此限制。

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

munmap释放已经通过mmap映射的内存。

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


谢谢您的快速回复。您所说的Linux手册是指man页面还是另一份文档? - Ketan Maheshwari
1
是的,man手册。例如,man 2 writeman 2 mmap - Blagovest Buyukliev
好的,我看了一下这些。但是它们只是解释了这些调用所做的事情。我怎么知道相对于整体性能来说这些调用的重要性呢? - Ketan Maheshwari
2
@ketanпјљйЂљиї‡еђ‘straceдј йЂ’-rйЂ‰йЎ№ - ninjalj
等号右边的数字是什么意思? - 425nesp

3
对于每个命令,都有一个手册页面,您可以通过输入man和C函数名称(例如man lseek(还要检查apropos))来阅读它。它们还描述了传递的参数。
以下是简短的摘要:
  • lseek - 重新定位文件描述符的读/写文件偏移量
  • write - 从缓冲区向文件描述符写入数据
  • close - 从每个进程对象引用表中删除描述符
  • mmap - 分配内存,或将文件或设备映射到内存中
  • munmap - 删除指定地址范围的映射
  • fstat - 获取指向路径的文件状态
请注意,解释单个/随机系统调用在性能方面不具有意义。要测试这些系统调用的性能显着性,您应该使用-c参数,该参数可以计算每个系统调用的时间、调用次数和错误,并报告摘要。然后您可以了解更多需要花费最长时间的系统调用。
有关输出和strace参数的更多信息,请参见man strace
另请参见:如何将shell中的strace解析为纯文本?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接