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

Mik*_*ney 5 linux ubuntu debugging kernel

当迁移到 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 的手册页,其中指出它用于请求更大的数据段/堆,但我找不到任何需要这么长时间的原因。

有人有任何想法吗?

pjz*_*pjz 8

brk() 是 malloc 扩展其可用内存池的方式。这意味着内核可以交换或玩内存外壳游戏以找到足够大的新内存段来交还,因此性能......不可预测。也就是说,您可能想查看一些内存使用可调参数(sysctl -a | grep ^vm 应该给您一个开始寻找的好地方)来更改您的内存分配策略。


Mik*_*ney 8

事实证明,这个问题主要归结于我对 strace -r 输出的误解。

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

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

此处的问题现已解决 - 它是由升级到 perl 5.8.9(从 perl 5.8.8)引起的。我们已经退出了 perl 升级,稍后将调查 perl 5.8.9 变慢的原因。