![为什么 strace 输出中的 brk() 要花费几秒钟?](https://linux22.com/image/483204/%E4%B8%BA%E4%BB%80%E4%B9%88%20strace%20%E8%BE%93%E5%87%BA%E4%B8%AD%E7%9A%84%20brk()%20%E8%A6%81%E8%8A%B1%E8%B4%B9%E5%87%A0%E7%A7%92%E9%92%9F%EF%BC%9F.png)
我们注意到,在迁移到 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 的手册页,其中指出它用于请求更大的数据段/堆,但我找不到它会花费这么长时间的任何原因。
有人有什么想法吗?
答案1
brk() 是 malloc 扩展其可用内存池的方式。这意味着内核可能会交换或玩内存骗局来找到足够大的新内存段来交还,因此性能是……不可预测的。也就是说,您可能需要查看一些内存使用可调参数(sysctl -a | grep ^vm 应该会为您提供一个很好的起点)以更改您的内存分配策略。
答案2
事实证明,这个问题主要是由于我对 strace -r 的输出的误解造成的。
‘-r’选项给出时间(以秒为单位)自从最后一个系统调用,而不是最后一个系统调用执行所花费的时间。
在这种情况下,CPU 正在忙着执行一些计算,而不是处理 brk()。
此处的问题现已解决 - 这是由升级到 perl 5.8.9(从 perl 5.8.8)引起的。我们已退出 perl 升级,稍后将调查 perl 5.8.9 速度变慢的原因。