我需要分析我正在使用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的手册,但仍然不是很自信。如果您有任何其他指示供我阅读,那就太棒了。
我有一些关于操作系统的背景知识,并了解系统调用,内存,虚拟内存,调度等等。
答案 0 :(得分:21)
为了理解这些,您必须熟悉POSIX系统调用。它们是用户空间程序用来与内核交互的接口。
lseek
,write
,close
,mmap
,munmap
和fstat
均为system calls,并在linux手册中的2个。
简单地说,lseek
将提供的文件描述符的内部指针移动到第二个参数指向的位置的字节,从SEEK_SET
(开头)开始,SEEK_CUR
(当前位置)或SEEK_END
(结束)。对同一描述符的任何连续read
和write
调用都将从此位置开始执行操作。请注意,lseek
并未针对所有类型的描述符实现 - 它对磁盘上的文件有意义,但对套接字或管道没有意义。
write
将提供的缓冲区复制到kernelspace并返回实际写入的字节数。根据描述符的类型,内核可以将数据写入磁盘或通过网络发送。这通常是一项代价高昂的操作,因为它涉及将此缓冲区传输到内核。
close
关闭提供的描述符,并释放内核中与其相关的任何资源。请注意,每个进程都有对同时打开的描述符数量的限制,因此有时需要关闭描述符以达不到此限制。
mmap
是一个复杂的系统调用,用于多种用途,包括共享内存。然而,一般用法是为进程分配更多内存。 malloc
和calloc
库函数通常在内部使用它。
munmap
释放mmap
'ped内存。
fstat
返回文件系统保存的有关文件大小,上次修改,权限等的各种信息。
答案 1 :(得分:3)
对于每个命令都有一个手册页,您可以通过键入man
和C函数的名称来阅读它,例如: man lseek
(也请查看apropos
)。他们还有传递参数的描述。
以下是简短摘要:
lseek
- 重新定位文件描述符的读/写文件偏移量write
- 从缓冲区写入文件描述符close
- 从每进程对象引用表中删除描述符mmap
- 分配内存,或将文件或设备映射到内存munmap
- 删除指定地址范围的映射fstat
- 获取路径请注意,解释单/随机系统在性能方面不会有意义。要测试这些系统调用的性能重要性,您应该使用-c
参数来计算每个系统调用的时间,调用和错误,并报告摘要。然后你可以阅读更多关于这些花费最长时间的内容。
要详细了解输出和strace
参数,请查看man strace
。