33

我需要分析我正在使用 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 的手册页,但仍然不是很自信。如果您有任何其他建议让我阅读,那就太好了。

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

4

2 回答 2

28

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

lseek, write, close, mmap,munmapfstat都是系统调用,并记录在 linux 手册的第 2 节中。

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

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

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

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

munmap释放mmap'ped 内存。

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

于 2011-06-13T18:26:47.527 回答
3

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

以下是简短的摘要:

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

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

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

另请参阅:如何将 shell 中的 strace 解析为纯文本?

于 2016-04-11T20:19:54.633 回答