我有两台机器:
1)2 x E5-2620 v3 @ 2.40GHz(微码:0x3c 2018-01-19),8GB RAM(CentOS 7 带 4.11 内核)
2)2 x E5-2630 v3 @ 2.40GHz(微码:0x3c 2018-01-19),64GB RAM(Fedora 22 带 4.11 内核)
内核是自定义编译的,但除此之外没有任何修改。.config
两个版本的内核完全相同(kpti
自从 4.14 版推出以来,两者一直没有相同之处)。
我写了如下代码:
beg = rdtsc_beg();
for (i = 0; i < 1000000; ++i)
{
syscall(512); //ENOSYS
}
end = rdtsc_end();
printf("syscall: %lu cycles\n", (end - beg) / 1000000);
测量系统调用的成本。我在机器 1 上得到 99 个周期,在机器 2 上得到 264 个周期。
我不明白为什么几乎所有事情都会有如此巨大的差异我认为相关是一样的。
有什么想法可能导致这种差异,或者有什么线索我应该去哪里寻找原因?
编辑:
我把代码改成:
volatile int ret = 0;
beg = rdtsc_beg();
for (i = 0; i < 1000000; ++i)
{
ret++;
}
end = rdtsc_end();
printf("inc: %lu cycles\n", (end - beg) / 1000000);
并静态编译:
400a3f: 0f a2 cpuid
400a41: 0f 31 rdtsc
400a43: 89 d6 mov %edx,%esi
400a45: 89 c7 mov %eax,%edi
400a47: 48 c1 e6 20 shl $0x20,%rsi
400a4b: 89 ff mov %edi,%edi
400a4d: b8 80 96 98 00 mov $0xf4240,%eax
400a52: 48 09 fe or %rdi,%rsi
400a55: 0f 1f 00 nopl (%rax)
400a58: 8b 54 24 0c mov 0xc(%rsp),%edx
400a5c: 83 c2 01 add $0x1,%edx
400a5f: 48 83 e8 01 sub $0x1,%rax
400a63: 89 54 24 0c mov %edx,0xc(%rsp)
400a67: 75 ef jne 400a58 <main+0x28>
400a69: 0f 01 f9 rdtscp
400a6c: 41 89 d0 mov %edx,%r8d
400a6f: 89 c7 mov %eax,%edi
400a71: 0f a2 cpuid
结果是机器 1 上有 5 个循环,而机器 2 上有 14 个循环。
答案1
听起来像是功率/频率缩放问题。机器 1 上的频率最高为 3.2GHz,但对于相同的工作负载,机器 2 的频率被限制在 2.6GHz。
强制它们使用相同的电源设置。除了检查 BIOS 之外,还要tuned
在两者上安装并将配置文件设置为latency-performance
通过运行二进制文件来获取有关循环的第二个意见perf stat
。