我有两台机器:
1) 2 x E5-2620 v3 @ 2.40GHz(微码:0x3c 2018-01-19),8GB RAM(CentOS 7 w/4.11 内核)
2) 2 x E5-2630 v3 @ 2.40GHz(微码:0x3c 2018-01-19),64GB RAM(Fedora 22 w/4.11 内核)
内核是自定义编译的,但没有任何修改。两个版本的.config
版本完全相同(kpti
自从 4.14 iirc 引入以来,两者都没有)。
我写了如下代码:
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 个周期。
强制他们使用相同的电源设置。除了检查 BIOS 之外,
tuned
在两者上都安装并将配置文件设置为latency-performance
通过运行二进制文件来获得关于周期的第二意见
perf stat
。