为什么brk()在strace输出中需要几秒钟?

Modified on: Sat, 31 Aug 2019 14:20:02 +0800

在迁移到Ubuntu Hardy,amd64时,我们注意到其中一个应用程序显着减速。它在Debian Sarge i386上运行得非常好。

针对(Apache 1.3)httpd进程运行'strace -r'显示了以下令人不安的部分:

     0.000083 poll([{fd=8, events=POLLIN|POLLERR, revents=POLLIN}], 1, -1) = 1
     0.000026 recvfrom(8, "_323-412D\0\0\0000\0\2\0\0\0\17recueil-cours"..., 32727, 0, NULL, NULL) = 8192
     0.000061 poll([{fd=8, events=POLLIN|POLLERR, revents=POLLIN}], 1, -1) = 1
     0.000026 recvfrom(8, "\0\0\0000\0\2\0\0\0\17recueil-courses\0\0\0\23er2"..., 32767, 0, NULL, NULL) = 2369
     0.117422 brk(0x397a000)            = 0x397a000
     0.140721 brk(0x399b000)            = 0x399b000
     4.457037 brk(0x39bc000)            = 0x39bc000
     0.078792 stat("/opt/semantico/slot/nijhoff/3/sitecode/live/public_home.html", {st_mode=S_IFREG|0644, st_size=2194, ...}) = 0

注意最后一行的brk - 暗示brk(0x399b000)花了4.45秒!

我已经查看了brk的手册页,它指出它用于请求更大的数据段/堆,但我找不到任何理由为什么需要这么长时间。

有人有任何想法吗?

最佳答案

据了解,这个问题主要归咎于我对strace -r输出的误解。

'-r'选项给出了上次系统调用后的时间(以秒为单位),而不是最后一次系统调用执行的时间。

在这种情况下,CPU正在进行一些计算而不是处理brk()。

此处的问题现已解决 - 它是由升级到perl 5.8.9(来自perl 5.8.8)引起的。我们已退出perl升级,并将在稍后调查perl 5.8.9减速的原因。


相关问答

添加新评论