系统相关
首页 > 系统相关> > linux – 确定进程花费时间等待的系统调用或子系统

linux – 确定进程花费时间等待的系统调用或子系统

作者:互联网

我正在寻找方法来了解进程或线程花费时间等待的系统调用或哪些子系统,即阻塞和未安排在CPU上运行.

特别是如果我有一些未知的过程,或者我们所知道的过程“很慢”,我希望能够学到以下内容:

>“它将80%的时间花在sys_write()上的fd 13上,这是/ some / file”
>“它花了很多时间等待从网络套接字读取()”
>“它正在epoll_wait()中为fds [4,5,6]上的活动而睡觉,它们是[file / boo],[socket 10.1.1.:42],[notifyfd blah]”

换句话说,当我的程序没有在CPU上运行时它在做什么?

使用perf这是非常难以回答的,因为它似乎没有任何方法可以记录从sys_enter到sys_exit的系统调用的持续时间,或者跟踪事件的持续时间.大概是由于其采样性质.

我知道有一些关于Linux 4.6及更高版本的eBPF的实验性工作,可能会有所帮助,Brendan Gregg的off-cpu work.但是在操作和支持的悲惨世界中,4.6内核是一种罕见的独角兽需要珍惜.

什么是现实世界的选择?

ftrace,systemtap等提供任何见解吗?

解决方法:

您可以使用strace.首先,您可能希望获得每种系统调用成本的高级摘要.您可以通过运行strace -c获取此摘要.例如,一个可能的输出如下:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 90.07    0.000263          26        10           getdents
  3.42    0.000010           0      1572           read
  3.42    0.000010           0       762         1 stat
  3.08    0.000009           0      1574         6 open
  0.00    0.000000           0        11           write
  0.00    0.000000           0      1569           close
  0.00    0.000000           0        48           fstat

%time值是关于整体内核时间,而不是总体执行时间(内核用户).此摘要告诉您最昂贵的系统调用是什么.但是,如果需要确定哪些特定的系统调用实例最昂贵以及哪些参数传递给它们,则可以运行strace -i -T. -i选项显示执行系统调用的指令的指令地址,-T选项显示系统调用所花费的时间.输出可能如下所示:

[00007f97f1b37367] open("myfile", O_RDONLY|O_CLOEXEC) = 3 <0.000020>
[00007f97f1b372f4] fstat(3, {st_mode=S_IFREG|0644, st_size=159776, ...}) = 0 <0.000018>
[00007f97f1b374ba] mmap(NULL, 159776, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f97f1d19000 <0.000019>
[00007f97f1b37467] close(3)             = 0 <0.000018>

第一列显示指令地址,第二列显示带有参数的系统调用,第三列显示返回值,最后一列显示在系统调用中花费的时间.此列表按动态发生的系统调用排序.您可以使用grep或-e选项过滤此输出.指令地址可以帮助您找到源代码中这些系统调用的位置.例如,如果一长串系统调用具有相同的地址,那么很可能在包含系统调用的代码中的某个地方有一个循环.如果您的可执行二进制文件不是PIE,则动态地址与objdump显示的静态地址相同.但即使使用PIE,动态地址的相对顺序也是相同的.我不知道是否有一种简单的方法可以将这些系统调用映射到源代码行.

如果你想找到“它花费80%的时间在fd 13上的sys_write()/ / some / file”之类的东西,那么你需要编写一个脚本,首先提取所有打开调用的返回值和相应的文件名参数然后总结fd参数等于某个值的所有sys_write调用的时间.

标签:linux,blocking,performance,perf,systemtap
来源: https://codeday.me/bug/20190627/1302932.html