如何解释strace输出?
我需要分析我正在使用strace的应用程序的性能。然而,我真的不知道如何解释strace发出的各种系统调用。以下是其中几个例子:如何解释strace输出?,c,linux,operating-system,system-calls,strace,C,Linux,Operating System,System Calls,Strace,我需要分析我正在使用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, PR
(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的手册页,但仍然不是很自信。如果你能给我其他的建议,那就太好了
我有一些操作系统的背景知识,了解什么是系统调用、内存、虚拟内存、调度等等。为了理解这些,您必须熟悉POSIX系统调用。它们是用户空间程序用来与内核交互的接口
lseek
、write
、close
、mmap
、munmap
和fstat
都是linux手册的第2节中描述的内容
简而言之,lseek
将提供的文件描述符的内部指针移动到第二个参数所指位置的字节,从SEEK\u SET
(开始)、SEEK\u CUR
(当前位置)或SEEK\u END
(结束)开始。对同一描述符的任何连续read
和write
调用都将从此位置开始其操作。请注意,lseek
并不是对所有类型的描述符都实现的——它对磁盘上的文件有意义,但对套接字或管道没有意义
write
将提供的缓冲区复制到kernelspace,并返回实际写入的字节数。根据描述符的类型,内核可以将数据写入磁盘或通过网络发送。这通常是一个代价高昂的操作,因为它需要将此缓冲区传输到内核
close
关闭提供的描述符,并释放内核中与其相关的所有资源。请注意,每个进程对同时打开的描述符的数量都有限制,因此有时需要关闭描述符以避免达到此限制
mmap
是一个复杂的系统调用,用于多种用途,包括共享内存。不过,一般的用法是为进程分配更多内存。malloc
和calloc
库函数通常在内部使用它
munmap
释放mmap
的内存
fstat
返回文件系统保存的关于文件大小、上次修改、权限等的各种信息。对于每个命令,都有一个手册页,您可以通过键入man
和C函数的名称来阅读,例如man lseek
(同时检查apropos
)。它们还具有传递参数的描述
以下是简短的总结:
-重新定位文件描述符的读/写文件偏移量lseek
-从缓冲区写入文件描述符写入
-从每个进程对象引用表中删除描述符close
-分配内存,或将文件或设备映射到内存中mmap
-删除指定地址范围的映射munmap
-获取路径指向的文件状态fstat
-c
参数,该参数可以计算每个系统调用的时间、调用和错误,并报告摘要。然后你可以阅读更多关于这些花费时间最长的东西
要了解有关输出和strace
参数的更多信息,请选中
另请参见:感谢您的快速回复。linux手册是指手册页还是单独的文档?是的,手册页。例如,
man2write
或man2mmap
。好的,我看了一下这些。然而,他们只是解释这些电话的作用。我如何知道这些调用相对于整体性能的相对重要性?@ketan:通过将-r
选项传递到strace
strace,strace更像是一个调试工具,而不是一个分析器。你真的在找像gprof这样的东西吗?我同意。由于“strace”只显示系统调用,因此您所能做的最好的事情就是查看系统调用之间的巨大时间间隔,并尝试找出程序在花了这么长时间的调用之间做了什么。这不是一个很好的分析方法。相反,使用“callgrind”(valgrind的一部分)并使用“kcachegrind”分析结果。或者使用gprof、sysprof、oprofile等。您应该阅读此处预执行的系统调用的手册页。运行manlseek
,manopen
,manmmap
等等。