我们注意到我们的一个应用程序在迁移到 Ubuntu Hardy amd64 时显着放缓。它在 Debian Sarge i386 上运行良好。
对(Apache 1.3)httpd 进程运行“strace -r”显示了以下令人不安的部分:
0.000083 轮询([{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 轮询([{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 的手册页,它指出它被用于请求更大的数据段/堆,但我找不到任何需要这么长时间的原因。
有人有什么想法吗?
brk() 是 malloc 扩展其可用内存池的方式。这意味着内核可能正在交换或玩内存外壳游戏以找到足够大的新内存段来交回,因此性能是......不可预测的。也就是说,您可能希望查看一些内存使用可调参数(sysctl -a | grep ^vm 应该为您提供一个很好的起点)来更改您的内存分配策略。
事实证明,这个问题主要是由于我对 strace -r 的输出的误解。
'-r' 选项给出自上次系统调用以来的时间(以秒为单位),而不是上次系统调用执行的时间。
在这种情况下,CPU 忙于执行一些计算,而不是处理 brk()。
这里的问题现在已经解决了——它是由升级到 perl 5.8.9(从 perl 5.8.8)引起的。我们已退出 perl 升级,稍后将调查 perl 5.8.9 速度下降的原因。