custo de syscall muito diferente em máquinas semelhantes

1

Eu tenho duas máquinas:

1) 2 x E5-2620 v3 @ 2.40GHz (microcódigo: 0x3c 2018-01-19), 8GB de RAM (CentOS 7 w / 4.11 kernel)

2) 2 x E5-2630 v3 @ 2.40GHz (microcódigo: 0x3c 2018-01-19), 64GB de RAM (Fedora 22 w / 4.11 kernel)

Os kernels são compilados sob encomenda, mas sem modificação. O .config para ambas as compilações é exatamente o mesmo (e também não tem kpti desde que foi introduzido em 4,14 iirc).

Eu escrevi um código como:

beg = rdtsc_beg();
for (i = 0; i < 1000000; ++i)
{
    syscall(512); //ENOSYS
}
end = rdtsc_end();

printf("syscall: %lu cycles\n", (end - beg) / 1000000);

para medir o custo de um syscall. Eu recebo 99 ciclos na máquina 1 e 264 ciclos na máquina 2.

Eu não consigo entender por que existe uma diferença tão grande dada a quase qualquer coisa que eu acho que seja relevante sendo a mesma coisa.

Alguma idéia do que poderia estar causando a diferença ou alguma pista em que eu deveria estar procurando descobrir a causa?

Editar:

Eu mudei o código para:

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);

e compilado estaticamente:

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

O resultado é 5 ciclos na Máquina 1 e 14 ciclos na Máquina 2.

    
por Hedy 28.06.2018 / 23:09

1 resposta

0

sounds like a power/freq scaling issue. The frequency on Machine 1 maxes at 3.2GHz but Machine 2 is throttled at 2.6GHz for the same workload.

Obrigue-os a usar as mesmas configurações de energia. Além de verificar o BIOS, instale tuned em ambos e defina o perfil como latency-performance

Obtenha uma segunda opinião sobre os ciclos executando seu binário com perf stat .

    
por 02.07.2018 / 07:12