Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解释strace输出?_C_Linux_Operating System_System Calls_Strace - Fatal编程技术网

如何解释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

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


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

为了理解这些,您必须熟悉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
等等。