Estou fazendo um benchmarking da minha máquina (CPU Intel i5-10210U de 4 núcleos) usando diferentes configurações de RAM possíveis usando o stick original de 8 GB/2667 MHz e outro stick de 16 GB/3200 MHz que eu canibalizei de uma máquina diferente (ambos os sticks são DDR4, 64 bits de largura).
Para quantificar até que ponto a incompatibilidade do pente de RAM prejudica o desempenho, testei cada um dos seguintes cenários.
- A. Slot 1: 8 GB Slot 2: Vazio
- B. Slot 1: 16 GB Slot 2: Vazio
- C. Slot 1: 8 GB Slot 2: 16 GB
O curioso é que os cenários A e B resultam em uma velocidade geral de 2667 MHz (que é o mínimo dos dois), mas o cenário C mostra uma degradação ainda maior, além desse mínimo, com base em uma inxi
saída dmidecode
(mostrada para o cenário C abaixo).
$ sudo inxi -mxxx | grep -i "mt/s"
Device-1: ChannelA-DIMM0 size: 8 GiB speed: spec: 2667 MT/s
actual: 2400 MT/s type: DDR4 detail: synchronous bus-width: 64 bits
Device-2: ChannelB-DIMM0 size: 16 GiB speed: spec: 3200 MT/s
actual: 2400 MT/s type: DDR4 detail: synchronous bus-width: 64 bits
$ sudo dmidecode | grep -i "mt/s"
Speed: 2667 MT/s
Configured Memory Speed: 2400 MT/s
Speed: 3200 MT/s
Configured Memory Speed: 2400 MT/s
Novamente, tanto no Cenário A quanto no B, as Velocidades "reais" e "Configuradas" chegaram a 2667MHz, e eu posso entender o porquê disso. Mas...
Por que o caso combinado teria um desempenho ainda pior do que o mais fraco dos dois bastões?
Ainda mais estranho, eu comparei o desempenho da memória usando o sysbench, o que resultou em velocidades mais rápidas para o Cenário C do que em A ou B — o que é contrário ao que deveríamos esperar de um sistema em sua configuração mais lenta.
Especificamente, seguindo as orientações deste tutorial , configurei os pentes de RAM para cada cenário e executei o seguinte comando, usando valores relevantes para o tamanho total da memória, tanto nas operações de gravação quanto de leitura.
$ sysbench memory --memory-block-size=512M --memory-total-size={memory size} --memory-oper={write/read} run
Isso resultou nas seguintes velocidades de transferência para cada cenário:
cenário | tamanho (GB) | ler (MiB/s) | escrever (MiB/s) |
---|---|---|---|
UM | 8 | 14,5 | 7,5 |
B | 16 | 14,5 | 8,5 |
C | 8+16 | 15 | 13 |
Então, sob essa lente (que me parece a mais prática), o cenário C é o mais performático. Estou pensando se isso significa:
- Posso desconsiderar as métricas mostradas por
dmidecode
/inxi
e confiar apenas no benchmark? - Ou minha configuração de benchmark está ruim?
- Ou toda essa premissa está fundamentalmente errada?
O que está acontecendo?
Considere o conceito de menor denominador comum (LCD, não "display de cristal líquido"). Ao adicionar frações, digamos 1/3 e 1/4, elas devem ser convertidas em doze avos muito menores para somá-las: 7/12.
Por analogia, se houver duas engrenagens, uma com três dentes, engrenadas com outra com quatro, elas serão sincronizadas apenas uma vez a cada 12 revoluções.
Se houver um cartão de memória que pode sincronizar em múltiplos de 3 nanossegundos (ns) e outro somente em múltiplos de 4 ns, então o controlador só poderá gravar em ambos uma vez a cada 12 ns.
Sim, isso é uma simplificação exagerada, mas basicamente, o controlador deve lidar com dois conjuntos diferentes de temporizações .