[英]How to interpret strace output?
我需要分析我正在使用 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 的手册页,但仍然不是很自信。 如果您有任何其他建议让我阅读,那就太好了。
我有一些操作系统的背景知识,并且了解系统调用、memory、虚拟 memory、调度等是什么。
为了理解这些,你必须熟悉 POSIX 系统调用。 它们是用户空间程序用来与 kernel 交互的接口。
lseek
、 write
、 close
、 mmap
、 munmap
和fstat
都是系统调用,并记录在 linux 手册的第 2 节中。
简而言之, lseek
将提供的文件描述符的内部指针移动到第二个参数指向的 position 字节,从SEEK_SET
(开始)、 SEEK_CUR
(当前位置)或SEEK_END
(结束)开始。 对同一描述符的任何连续read
和write
调用都将从该 position 开始其操作。 请注意, lseek
并非针对所有类型的描述符都实现 - 它对磁盘上的文件有意义,但不适用于套接字或 pipe。
write
将提供的缓冲区复制到内核空间并返回实际写入的字节数。 根据描述符的种类,kernel 可以将数据写入磁盘或通过网络发送。 这通常是一项昂贵的操作,因为它涉及将此缓冲区传输到 kernel。
close
关闭提供的描述符,并释放 kernel 中与其相关的任何资源。 请注意,每个进程对同时打开的描述符的数量都有限制,因此有时需要关闭描述符才能达到此限制。
mmap
是一个复杂的系统调用,用于多种用途,包括共享 memory。 然而,一般用法是为进程分配更多的 memory。 malloc
和calloc
库函数通常在内部使用它。
munmap
释放mmap
'ped memory。
fstat
返回文件系统保存的有关文件的各种信息 - 大小、上次修改时间、权限等。
对于每个命令,都有一个手册页,您可以通过键入man
和 C function 的名称来阅读它,例如man lseek
(也检查apropos
)。 他们也有传递参数的描述。
以下是简短的摘要:
lseek
- 重新定位文件描述符的读/写文件偏移量write
- 从缓冲区写入文件描述符close
- 从每个进程 object 参考表中删除一个描述符mmap
- 将 memory 或 map 文件或设备分配到 memorymunmap
- 删除指定地址范围的映射fstat
- 获取路径指向的文件状态请注意,解释单个/随机系统对性能而言没有意义。 要测试这些系统调用的性能重要性,您应该使用-c
参数,该参数可以计算每个系统调用的时间、调用和错误并报告摘要。 然后你可以阅读更多关于这些花费时间最长的内容。
要了解有关 output 和strace
参数的更多信息,请查看man strace
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.