介绍
我有两组机器, A组和B组 ,显然具有相同的硬件/软件configuration,但性能有显着差异。 集合B中的机器比集合A中的机器速度高达x4 。但是, 如果我重新启动集合A中的一台机器 ,莫名其妙地开始按预期执行,就像集合B中的机器一样。我找不到这种行为的解释。
硬件configuration
S2600KP平台 E5-2630v3物理核心,2.4GHz基频,3.2GHz Turbo频率。 8x8GB RAM DDR4 DDR4,2133Mhz,每个通道一个模块 所有硬件组件在型号/部件号中都是相同的。
设置和软件
BIOS版本和BIOS设置是相同的,例如启用HT , Turbo Boost启用。 详情请参阅链接。
这些机器运行与内核2.6.32-504相同的64 bits版本的Red Hat 6 。
问题
两台机器都是闲置的,但无论我尝试运行的负载如何,在性能方面我都会得到不同的结果。 为了简单起见,我将运行核心0上的所有基准。结果在所有内核(两个处理器)上都是可重现的。
设置A.
[root@SET_A ~]# uptime 11:48:40 up 51 days, 19:34, 2 users, load average: 0.00, 0.00, 0.00 [root@SET_A ~]# taskset -c 0 sh -c 'time echo "scale=5000; a(1)*4" | bc -l > /dev/null' real 0m43.751s user 0m43.742s sys 0m0.005s
设置B.
[root@SET_B ~]# uptime 11:50:00 up 15 days, 19:43, 1 user, load average: 0.00, 0.00, 0.00 [root@SET_B ~]# taskset -c 0 sh -c 'time echo "scale=5000; a(1)*4" | bc -l > /dev/null' real 0m18.648s user 0m18.646s sys 0m0.004s
意见
在基准的整个持续时间内, turbostats报告核心0处于C0 Consumption状态以及在启用加速频率的情况下的P0 Performance状态。
设置A.
[root@SET_A ~]# turbostat -i 5 pk cor CPU %c0 GHz TSC SMI %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W RAM_W PKG_% RAM_% 3.15 3.18 2.39 0 3.26 0.00 93.59 0.00 40 46 49.77 0.00 0.00 0.00 46.45 22.41 0.00 0.00 0 0 0 99.99 3.19 2.39 0 0.01 0.00 0.00 0.00 40 46 0.00 0.00 0.00 0.00 29.29 12.75 0.00 0.00
设置B.
[root@SET_B ~]# turbostat -i 5 pk cor CPU %c0 GHz TSC SMI %c1 %c3 %c6 %c7 CTMP PTMP %pc2 %pc3 %pc6 %pc7 Pkg_W RAM_W PKG_% RAM_% 3.14 3.18 2.39 0 3.27 0.00 93.59 0.00 38 40 49.81 0.00 0.00 0.00 46.12 21.49 0.00 0.00 0 0 0 99.99 3.19 2.39 0 0.01 0.00 0.00 0.00 38 40 0.00 0.00 0.00 0.00 32.27 13.51 0.00 0.00
简化的基准
为了尽可能简化基准testing(没有FP,尽可能less的内存访问),我写了下面的32位代码。
.text .global _start _start: movl $0x0, %ecx oloop: cmp $0x2, %ecx je end inc %ecx movl $0xFFFFFFFF,%eax movl $0x0, %ebx loop: cmp %eax, %ebx je oloop inc %ebx jmp loop end: mov $1, %eax int $0x80 .data value: .long 0
它只是将寄存器从0递增到0xFFFFFFFF两次,没有别的。
设置A.
[root@SET_A ~]# md5sum simple.out 30fb3a645a8a0088ff303cf34cadea37 simple.out [root@SET_A ~]# time taskset -c 0 ./simple.out real 0m10.801s user 0m10.804s sys 0m0.001s
设置B.
[root@SET_B ~]# md5sum simple.out 30fb3a645a8a0088ff303cf34cadea37 simple.out [root@SET_B ~]# time taskset -c 0 ./simple.out real 0m2.722s user 0m2.724s sys 0m0.000s
x4的差异来增加一个寄存器。
更多的观察与简化的基准
在基准testing期间,两台机器上的中断次数是相同的, ~1100 intr/s (用mpstat报告)。 这些主要是CPU0上的本地定时器中断,因此中断源基本没有区别。
设置A.
[root@SET_A ~]# mpstat -P ALL -I SUM 1 01:00:35 PM CPU intr/s 01:00:36 PM all 1117.00
设置B.
[root@SET_B ~]# mpstat -P ALL -I SUM 1 01:04:50 PM CPU intr/s 01:04:51 PM all 1112.00
对于P-States和C-States持有同上。
性能分析
设置A.
Performance counter stats for 'taskset -c 0 ./simple.out': 41,383,515 instructions:k # 0.00 insns per cycle [71.42%] 34,360,528,207 instructions:u # 1.00 insns per cycle [71.42%] 63,675 cache-references [71.42%] 6,365 cache-misses # 9.996 % of all cache refs [71.43%] 34,439,207,904 cycles # 0.000 GHz [71.44%] 34,400,748,829 instructions # 1.00 insns per cycle [71.44%] 17,186,890,732 branches [71.44%] 143 page-faults 0 migrations 1,117 context-switches 10.905973410 seconds time elapsed
设置B.
Performance counter stats for 'taskset -c 0 ./simple.out': 11,112,919 instructions:k # 0.00 insns per cycle [71.41%] 34,351,189,050 instructions:u # 3.99 insns per cycle [71.44%] 32,765 cache-references [71.46%] 3,266 cache-misses # 9.968 % of all cache refs [71.47%] 8,600,461,054 cycles # 0.000 GHz [71.46%] 34,378,806,261 instructions # 4.00 insns per cycle [71.41%] 17,192,017,836 branches [71.37%] 143 faults 2 migrations 281 context-switches 2.740606064 seconds time elapsed
意见
sys_exit以外,没有涉及任何系统调用。 显然,集合A的上下文切换的数量更高。 ~10M )也有很小的差异。 这可能是由于上述原因造成的? 导致重新计划的说明被认为是用户空间。 或中断上下文中的指令? 0.06% ,但是L3 cache references的数量是双倍的。 这是预期的吗? 快速检查cachingconfiguration会导致相同的结果。 caching正确启用( CR0: 0x80050033 ,CD为0)和MTRRconfiguration是相同的。 最后的问题
有没有一个明显的原因可以解释这种性能差异?
为什么Set A中的机器每循环运行1次,而Set B中的机器每循环运行4次,考虑到硬件/软件configuration是相同的?
为什么重新启动机器似乎可以解决这个问题? 正如介绍中所解释的那样,如果我在集合A中重启一台机器,它将按照预期开始执行。
这里的原因或者太微不足道,我错过了它,或者太复杂,无法解释。 我希望这是前者,任何帮助/提示/build议表示赞赏。
当然,如果有人能够给出一个答案,可以立即解决你的问题,那将是非常好的。 但是我担心,没有明显的答案。 但是可能还有一些攻击这个问题的方向还没有尝试:
在这个假设下,你的一些机器有时会performance出行为,而其他人从来没有这样做过,可以得出微妙的硬件问题(零星的,通过系统诊断手段无法察觉)。 相反的假设是,这可能发生在你的任何机器上。
如果效果也显示在“良好”的机器上,那么安装(HD内容)或硬盘必须有细微的差异。
如果这个效果从来不会在“好”的机器上显示出来,那么“微妙的硬件问题”理论就会被证实。
把好的机器放在坏的地方,看看会发生什么。
步骤1应该帮助find这些细微差别,确定哪些机器工作,哪些不工作。 第三步是find解释。