【发布时间】:2014-01-26 16:20:34
【问题描述】:
我在 x86_64 系统上遇到了从 Linux 内核 3.11 到 3.12 的奇怪性能回归。 在 Fedora 20、3.12 上运行 Mark Stock's Radiance benchmark 明显变慢。没有其他任何改变 - 相同的二进制文件,相同的 glibc - 我只是启动了不同的内核版本,并且性能发生了变化。 定时程序 rpict 是 100% CPU 绑定的用户级代码。
在我将此作为错误报告之前,我想找出导致此行为的原因。我对Linux内核了解不多,从3.11到3.12的更改日志也没有给我任何线索。
我在 Intel Haswell (i7-4771) 和 AMD Richland (A8-6600K) 这两个系统上观察到了这种情况。 在 Haswell 系统上,用户时间从 3.11 的 895 秒变为 3.12 的 962 秒。在里奇兰,从 1764 年到 1844 年。这些时间可以在几秒钟内重复。
我用 perf 做了一些分析,发现 IPC 下降的比例与减速的比例相同。在 Haswell 系统上,这似乎是由于更多的错过分支造成的,但为什么预测率会下降呢? Radiance 确实使用了随机数生成器——“更好”的随机性会导致丢失的分支吗?但除了 OMAP4 支持之外,RNG 在 3.12 中似乎不需要更改。
在 AMD 系统上,perf 只是指向更多的空闲后端周期,但原因尚不清楚。
Haswell 系统:
3.11.10 895s user, 3.74% branch-misses, 1.65 insns per cycle
3.12.6 962s user, 4.22% branch-misses, 1.52 insns per cycle
里奇兰系统:
3.11.10 1764s user, 8.23% branch-misses, 0.75 insns per cycle
3.12.6 1844s user, 8.26% branch-misses, 0.72 insns per cycle
我还查看了两个内核的 dmesg 输出的差异,但没有发现任何可能导致 CPU 密集型程序如此缓慢的任何内容。
我尝试将 cpufreq 调节器从默认的 ondemand 切换到 peformance,但没有任何效果。
可执行文件是使用 gcc 4.7.3 编译的,但没有使用 AVX 指令。 libm 似乎仍然使用一些 AVX(例如 __ieee754_pow_fma4),但这些函数只占总执行时间的 0.3%。
附加信息:
- Diff of kernel configs
- diff of the dmesg outputs 在 Haswell 系统上。
- diff of /proc/pid/maps - 3.11 只映射一个堆区域; 3.12 手。
- perf stat output 来自 A8-6600K 系统
- perf stats w/ TLB misses dTLB 统计数据看起来非常不同!
- /usr/bin/time -v output 来自 A8-6600K 系统
有什么想法(除了将内核更改一分为二)?
【问题讨论】:
-
您可以尝试使用几个不同的基准,看看它们与 Radiance 基准的比较。了解运行速度较慢的工作负载中的哪些内容可能会有所帮助。
-
@superdesk 我已经尝试了一些较小的程序(bzip2 和流),但无法检测到任何减速。
-
我还尝试了不同的 cpufreq 调节器,但无济于事。编辑问题以提及这一点。
-
两个内核的
brk()调用次数相同(1096 次调用)。我想我很快就要开始编译内核了…… -
我认为这可能是由于 brk 随机化导致 3.11 上的大页面使用和 3.12 上的不使用。检查 /proc/PID/smaps 的 AnonHugePages 和 /proc/vmstat 的 thp* 值;记录在这里kernel.org/doc/Documentation/vm/transhuge.txt
标签: performance linux-kernel perf radiance