2 pontos por GN⁺ 2023-10-10 | 1 comentários | Compartilhar no WhatsApp
  • O suporte a RAM ECC, que havia desaparecido da tabela de especificações no lançamento do AM5, foi confirmado novamente em um caso funcional com a combinação de Ryzen 7000 “Raphael” e placa-mãe ASRock
  • O teste foi realizado com Ryzen 7950X, ASRock B650E PG Riptide, UEFI 1.28, AGESA 1.0.0.7b e dois módulos v-color ECC UDIMM de 32 GB, e o sistema conseguiu inicializar o Linux após o link training do DDR5
  • A largura de memória de 72 bits e a indicação Multi-bit ECC no dmidecode são pistas úteis, mas como essas informações vêm do SMBIOS da UEFI, não provam sozinhas que o ECC está realmente ativado
  • Consultando diretamente o UMC da AMD via SMN, o bit 30 de UmcCapHi indica o estado de ativação do ECC, e no Linux também foi confirmado pelo ryzen_smu que esse bit está definido nos dois canais de memória
  • Embora não tenha havido injeção real de erros, o log EDAC do kernel Linux é emitido por um caminho que verifica o bit de ativação de ECC no UMC, o que serve como forte evidência de que o ECC está funcionando

Mudanças no suporte a ECC nos desktops Ryzen

  • Os CPUs desktop AMD Ryzen historicamente tinham como um dos pontos fortes o suporte oficial a RAM ECC
    • A maior parte das séries Ryzen 1000 a 5000 podia usar RAM ECC com a placa-mãe adequada, sem necessidade de CPUs workstation mais caros
    • A página de especificações da ASRock B550 Steel Legend é um exemplo de como a compatibilidade com RAM ECC era detalhada por geração de CPU
  • No lançamento do Ryzen 7000 “Raphael” e do Socket AM5, as menções ao suporte a ECC desapareceram
    • Até na página de especificações da ASRock X670E Taichi, uma placa-mãe AM5 de alto custo, não há menção a suporte a ECC no momento da escrita
    • Embora o desempenho após o upgrade para o Ryzen 7950X tenha sido satisfatório, a ausência de ECC na época da compra ficou como uma grande frustração

O teste de ECC no AM5 que começou no fórum da ASRock

  • No tópico do fórum da ASRock, um usuário chamado ApplesOfEpicness compartilhou a experiência de fazer a RAM ECC funcionar no firmware AMD AGESA junto com um engenheiro da AMD
    • Segundo ele, em uma placa-mãe ASRock com UEFI atualizada, foi possível confirmar que erros eram reportados ao sistema operacional ao curto-circuitar pinos de dados e de aterramento
  • Depois disso, o teste usou a ASRock B650E PG Riptide e dois módulos v-color ECC UDIMM de 32 GB
    • A UEFI da placa-mãe foi atualizada para 1.28, e o AGESA para 1.0.0.7b
    • Após a troca da RAM, o sistema inicializou depois de um longo processo de link training do DDR5
  • Nesse sistema, o link training com 64 GB de RAM levou quase 3 minutos
    • Nos desktops Ryzen 7000, isso só é necessário uma vez após troca de RAM ou alteração de timings, e a UEFI armazena o resultado em cache para reutilizá-lo nos boots seguintes

Indicações de ECC no Linux e suas limitações

  • No Linux, sudo dmidecode -t memory mostra valores relacionados a ECC
    • Error Correction Type: Multi-bit ECC
    • Total Width: 72 bits
    • Data Width: 64 bits
  • A largura total de 72 bits é um sinal chamativo
    • Em RAM sem ECC, o valor aparece como 64 bits
    • RAM ECC de 64 bits tem 8 bits adicionais para dados de paridade
  • O EDAC do kernel Linux também apareceu como ativo
    • EDAC MC: Ver: 3.0.0
    • EDAC MC0: Giving out device to module amd64_edac
    • EDAC amd64: F19h_M60h detected

Por que só o dmidecode não basta

  • dmidecode é uma ferramenta que exibe de forma legível as tabelas DMI ou SMBIOS do computador
    • Essas tabelas contêm informações como componentes de hardware, números de série e revisão da BIOS
    • Isso evita ter de sondar diretamente o hardware, mas as informações exibidas podem não ser confiáveis
  • O SMBIOS define estruturas de dados e formas de acesso para ler informações de gerenciamento criadas pela BIOS
    • Isso permite que o sistema operacional não precise sondar diretamente os dispositivos
  • As informações de ECC vistas no dmidecode vêm da UEFI, não do processador
    • Alguns dados, como velocidade da memória, podem vir do controlador de memória
    • Já as informações de ECC vêm da UEFI, então elas mostram que a memória é compatível com ECC, mas não garantem que o ECC esteja de fato ativado
  • Em última instância, quem decide se o ECC está ativado é o controlador de memória do sistema

Como consultar diretamente o UMC da AMD

  • Os processadores AMD expõem um barramento chamado System Management Network, ou SMN
    • Esse barramento pode ser usado para consultar e configurar o AMD Unified Memory Controller, ou UMC
  • Pela documentação do UMC da AMD no illumos, é possível consultar o registrador UmcCapHi para verificar se o ECC está ativado
    • Essas informações não fazem parte da referência pública AMD Processor Programming Reference, mas podem ser identificadas no código-fonte aberto dos kernels Linux e illumos
  • O acesso direto ao SMN é arriscado
    • Especialmente comandos de escrita podem danificar seriamente o computador
    • Não se deve realizar operações de escrita no SMN
  • No illumos, os dois canais de memória do Ryzen 7000 são consultados separadamente
    • Endereço do canal 0: 0x50df4
    • Endereço do canal 1: 0x150df4
    • O valor retornado foi 0x40000030 em ambos os canais
  • O ponto principal é o bit 30
    • Se esse bit estiver definido, o ECC está ativado no controlador de memória

Consultando o SMN no Linux com ryzen_smu

  • No Linux, também é possível acessar o barramento SMN com o driver ryzen_smu
    • Nesse sistema, foi necessário aplicar um patch para instalação
  • O driver fornece o arquivo /sys/kernel/ryzen_smu_drv/smn
    • Para consultar, é preciso escrever um endereço de 4 bytes em formato little-endian e ler o resultado de 4 bytes também em little-endian
  • O resultado da consulta aos dois canais com um script em Python foi o seguinte
    • 0x00050df4: 0x40000000
    • 0x00150df4: 0x40000000
  • No valor retornado, o 4 no primeiro nibble significa que o bit 30 está definido, e o controlador de memória está reportando o ECC como ativado
  • No Windows, ferramentas como SMUDebugTool talvez permitam consultas semelhantes, mas o funcionamento dessa ferramenta não é garantido

Injeção real de erros e confiabilidade do EDAC

  • A forma mais confiável de validar o funcionamento do ECC é injetar erros reais
    • ApplesOfEpicness fez um curto entre pinos de dados e de aterramento da placa-mãe
    • Outro método é forçar overclock da RAM até um ponto instável
  • Neste teste, não foram feitos curto físico em pinos nem overclock repetido da RAM
    • O fato de o link training do DDR5 levar vários minutos a cada tentativa também torna o teste de overclock mais trabalhoso
    • Até o momento, não foram observados erros naturais
  • O caminho das mensagens do EDAC no kernel Linux está ligado ao bit de ativação de ECC do UMC da AMD
    • O log Giving out device to module vem de edac_mc_add_mc_with_groups
    • Essa função é chamada pelo caminho init_one_instance
    • init_one_instance só é chamado quando pvt->ops->ecc_enabled é verdadeiro
    • No Ryzen 7000, ou seja, Zen 4, a family é 0x19, e nesse caso é usado umc_ops com umc_ecc_enabled
  • umc_ecc_enabled verifica o bit UMC_ECC_ENABLED em umc_cap_hi
    • UMC_ECC_ENABLED é o bit 30
    • Nos processadores AMD, a mensagem EDAC MC0: Giving out device to module amd64_edac é um indicador confiável de que o UMC reportou o ECC como ativado

Conclusão

  • Mesmo nos CPUs desktop Ryzen 7000, pelo menos em combinação com placas-mãe ASRock, é relativamente fácil fazer a RAM ECC funcionar
  • As informações baseadas em SMBIOS do dmidecode não bastam sozinhas, mas observar em conjunto o bit 30 do UMC e o caminho do EDAC no Linux permite confirmar de forma mais direta que o ECC está ativado

1 comentários

 
GN⁺ 2023-10-10
Opiniões do Hacker News
  • Preciso fazer upgrade do processador e tenho bastante interesse em uma configuração com RAM ECC
    Vi uma discussão no /r/AMD entre duas pessoas sobre processadores ou placas-mãe AMD realmente oferecerem suporte a ECC, mas não sei quem está certo: https://www.reddit.com/r/Amd/comments/lzxqod/list_of_am4_mot...
    Fico curioso se este texto confirma que a combinação AMD+ASRock é realmente RAM ECC

    • Ao comprar uma placa-mãe, é preciso verificar se as especificações mencionam explicitamente suporte a ECC
      Normalmente, na seção “Memory”, aparece algo como “ECC & Non-ECC, Unbuffered Memory”
      É preciso tomar cuidado porque a expressão “On-die ECC” é um recurso que também existe em memórias Non-ECC e não tem relação com o ECC mencionado aqui
      É necessário comprar ECC DDR5 UDIMM, e não comprar por engano ECC DDR5 RDIMM, que não é compatível com placas-mãe AM5
      ECC DDR5 UDIMM pode ter largura de 80 bits ou 72 bits; só não pode ser a de 64 bits das Non-ECC DDR5 UDIMM
      Quando verifiquei antes, a ASUS era quem tinha mais placas AM5 com suporte a ECC, e eu gostava mais da PRIME X670E-PRO WIFI por ter boa expansibilidade PCIe além do slot de GPU
    • Em ECC, “suporte” pode ter vários níveis
      O nível 0 é não oferecer suporte nenhum, a ponto de o sistema não dar boot se você espetar RAM ECC; o 1 é aceitar a memória, mas não usar a função ECC; o 2 é ter o circuito, mas sem o fabricante da placa-mãe validar a detecção e correção de erros; o 3 é ter a função ECC e ela ser validada pelo fabricante
      Em uma placa de nível servidor, como Supermicro, dá para esperar o nível 3
      Quando aparece “ECC supported” em um processador AMD, é difícil saber qual é o nível, mas, no caso da Intel, se a CPU/chipset diz que oferece suporte a ECC, dá para considerar que oferece suporte de fato
    • Não sei quanto à ASRock, mas nas placas ASUS X570 o ECC definitivamente funciona
      Usei de propósito um DIMM ECC defeituoso e consegui gerar, em pouco tempo, erros corrigíveis e erros incorrigíveis
      Como todos os outros componentes estão presentes, parece improvável que a ASRock não tenha feito o cabeamento, mas, se o kernel diz que há ECC, eu consideraria correto
      Caso contrário, basta devolver a placa como defeituosa e usar outro fabricante
    • Uso ECC em placas ASRock X570 e B550, e a ASRock já permite ECC sem buffer há bastante tempo
      Só é uma pena não haver placa X670E mini-ITX/mATX. Isso só a ASUS tem
    • Uso uma combinação ASRock X570 PG 4S + Ryzen 5 2600 + Kingston 32GB 2666 ECC, e a lista de suporte de CPU/memória dessa placa também diz que o ECC funciona nessa configuração
      O dmidecode informa largura de dados de 128 bits, não 72 bits, mas também informa correção de múltiplos bits, não apenas de bit único
      Em UDIMM de placas Intel, por exemplo Supermicro+Xeon, eu estava acostumado com 72 bits, mas essa informação parece depender mais da forma como o controlador de memória e a placa-mãe reportam do que do suporte real do hardware
      Ainda assim, o EDAC funciona, o driver correto é registrado, e às vezes recebo avisos no EDAC/RAS de que erros corrigíveis foram de fato corrigidos; então, para mim, isso resolve a questão
  • Fugindo um pouco do assunto, mas o suporte a ECC que funciona também na plataforma AM4 antiga e em núcleos Zen3 APU aparece assim, e no meu sistema ele definitivamente existe
    É uma combinação ASRock B550M-ITX/ac com AMD Ryzen 5 PRO 5650G, e antes, quando eu usava um Ryzen 5 3600 com GPU dedicada, funcionava do mesmo jeito
    No GNU/Linux moderno, para detectar e registrar atividade de ECC, é preciso ativar o serviço rasdaemon
    Esse serviço interpreta MCE e outros erros relacionados a hardware e os armazena em um banco de dados; a saída consultada acima também é resultado disso

    • Com essa frequência de erros, dá para sentir que é difícil confiar nas informações produzidas por um computador sem ECC
      Mas, pensando melhor, a frequência é bem alta, então o módulo de memória pode estar com defeito. Especialmente porque é sempre o mesmo módulo e o mesmo endereço
    • APUs ficam explicitamente fora do suporte a ECC, exceto as SKUs PRO
      https://www.asus.com/global/support/FAQ/1045186/
    • Instalei RAM ECC em um sistema Gigabyte B550I, e o dmidecode mostra largura de 72 bits; dmesg | grep -i EDAC também mostra muitas informações que parecem indicar que o ECC está ativado
      Mas a saída desse comando fica vazia e só aparecem “No Memory errors”, “No PCIe AER errors”, “No Extlog errors”, “No MCE errors”
      Fico me perguntando se preciso ativar algo para que os erros sejam registrados, ou se fui enganado pelo dmidecode e pelo dmesg
    • Fico curioso para saber quais módulos de memória você usa
  • Bom texto. Uso ECC RAM também na minha placa Threadripper
    Uma das coisas que a equipe de operações do Blekko descobriu em placas Intel foi que era preciso dizer explicitamente à placa para reportar erros corrigíveis de fato
    O padrão era emitir um machine check se houvesse um erro irrecuperável e, fora isso, simplesmente seguir em frente
    Pelo que me lembro, em cerca de 1600 sistemas com 192 GB, víamos erros corrigíveis aproximadamente uma vez por semana
    Em 6 anos não me lembro de nenhum erro irrecuperável, então foi bem bom

    • Tivemos ainda mais sorte. Nossos sistemas reportavam erros corrigíveis sem que precisássemos pedir separadamente
      Tínhamos uma quantidade parecida de máquinas e, em média, uma quantidade de RAM semelhante, e também havia erros irrecuperáveis de vez em quando. Provavelmente uma ou duas vezes por ano, então criamos uma política
      Observávamos para ver se tinha acontecido só uma vez; se não falhasse de novo logo, considerávamos ok, e se falhasse de novo logo, trocávamos a RAM
      Placas de servidor melhores às vezes indicam por LED qual módulo de RAM deve ser trocado
      Para erros corrigíveis, não trocávamos até a contagem ficar bem alta, e havia sistemas com um ou dois erros por dia que continuaram rodando bem por muito tempo
      Por outro lado, também havia sistemas que ficavam muito tempo com 0 ocorrências e, depois de alguns dias com poucas ocorrências, saltavam para números grandes
      Um sistema chegou a milhares por hora, a ponto de ficar inutilizável por causa do custo de tratar exceções de machine check, mas o intervalo de relatório era de 1 hora, então não sabíamos a causa até o relatório seguinte
  • Atualmente uso um Ryzen 3700X e uma placa-mãe ASUS TUF Gaming X570, e preciso de mais desempenho single-core e velocidade de NVMe/disco
    Já uso GPU dupla, 2 M.2 NVMe e 6 SATA
    Estou considerando um upgrade no fim do ano; por causa das pistas PCIe, cheguei a pensar brevemente em Threadripper, mas ainda não há Zen4 Threadripper e o preço provavelmente será muito alto
    As opções são subir para um Ryzen 5900X e manter o resto, ou gastar mais e ir para um Ryzen AM5 com uma placa-mãe nova
    Também olhei Intel, mas ao ver que para em 20 pistas PCIe, estou inclinado a descartar
    Quero adicionar um adaptador de 10 Gb para mover alguns discos rígidos para fora, então preciso de mais pistas PCIe
    O desempenho multicore do 3700X é suficiente, e se eu comprar uma placa-mãe nova, quero pelo menos 2 NVMe em espelho e 6 ou mais portas SATA por velocidade

    • Já usei dois NVMe em espelhamento, mas há muitos cuidados para obter o máximo desempenho
      Não sei como é do lado da AMD, mas placas Intel normalmente têm só um slot M.2 ligado diretamente à CPU, e os outros três passam pelo chipset, então acabam compartilhando gargalo também com a placa Ethernet de 10 Gb
      No fim, foi muito mais rápido comprar uma placa com suporte a PCIe 5.0 e um único SSD suficientemente grande, e tanto o IOPS total quanto a taxa de transferência ficaram maiores que no arranjo RAID 0 anterior
    • Fico curioso em que tipo de carga de trabalho a velocidade do NVMe vira gargalo
    • Uso um 5900X e sinto que teria sido melhor esperar e comprar um 5800X3D
    • Se precisar de mais, é melhor ir para um 5950X, que custa cerca de 4/3 do preço e tem o dobro de núcleos, ou considerar uma CPU com 3D cache por causa do UPS do Factorio
      O 5900X não é um upgrade tão grande assim
  • Como caso de referência, a Hetzner oferece servidores com CPUs Ryzen 7000 e ECC RAM há alguns meses
    https://www.hetzner.com/dedicated-rootserver/matrix-ax
    O AX52 oferece ECC RAM como upgrade opcional, e o AX102 vem com ECC por padrão
    Não acho provável que eles estivessem oferecendo ECC que não funciona de verdade

    • Pelo que sei, a Hetzner fabrica ou encomenda suas próprias placas-mãe
      Então eles devem conseguir garantir suporte a ECC de ponta a ponta
  • Gostaria que os legisladores acordassem e tornassem ECC obrigatório
    É preocupante que a maior parte da computação seja feita em sistemas Non-ECC vulneráveis
    É uma forma bem ruim de segmentação artificial de mercado

    • Pelo visto você não viu aquelas audiências em que parlamentares chamavam pessoas como o Zuck e perguntavam como se usa um celular
      Como esperar que gente assim legisle sobre ECC?
    • Dizer que sistemas Non-ECC são vulneráveis é difícil quando eles funcionam perfeitamente bem 99,9999% do tempo
    • Ouço com frequência que máquinas Non-ECC são totalmente vulneráveis e, pelos cálculos, parece que inversões de bits deveriam estar acontecendo o tempo todo
      Mas meu sistema Intel, com 64 GB de RAM Non-ECC, roda meio dia todos os dias e hiberna à noite; uso 3D CAD, Photoshop, VS Code cheio de extensões e contêineres Docker no WSL2, e quase não vejo erros
      Também não há travamentos nem tela azul
      Fico curioso sobre o que exatamente se deve esperar de um erro de inversão de bit. Se inversões de um único bit acontecessem com tanta frequência numa situação em que quase todos os 64 GB de RAM estão em uso, imagino que apareceriam de alguma forma
  • Não tenho coragem de curto-circuitar pinos fisicamente, nem paciência para fazer overclock da RAM devagar esperando vários minutos pelo treinamento do link DDR5 a cada vez
    Então me contento com o controlador de memória reportando que o ECC está ativado
    Mas que tal jogar ar quente de um secador de cabelo na RAM? Já vi essa técnica ser usada no passado para gerar erros

    • Usar um isqueiro de churrasco a propano de perto deve funcionar. Esses objetos geram uma quantidade absurda de interferência eletromagnética
      https://hackaday.com/2022/01/29/blast-chips-with-this-bbq-li...
      https://hackaday.com/tag/emfi/
    • De forma mais realista, dá para ajustar parte do overclock de memória em tempo real em um sistema em execução, sem precisar de treinamento do link
      Não é recomendado para uso real, mas pode servir para encontrar os limites da memória ou criar erros
    • Será que dá para confirmar se um sistema tem RAM ECC com um teste Rowhammer?
      No meu sistema com I7-4770K sem overclock, os erros aparecem, mas uma placa antiga da geração Supermicro X10 parece não detectar erros mesmo rodando um teste Rowhammer indefinidamente
      Porém, se sistemas modernos forem projetados para não serem vulneráveis a ataques Rowhammer, esse método pode não funcionar
      A RAM do Raspberry Pi 4B e do CM4 é conhecida por usar RAM ECC, mas não é o mesmo ECC de que estamos falando aqui
      Trata-se de ECC on-die, voltado a melhorar o rendimento dos chips, e os erros ECC são corrigidos sem serem reportados pelo hardware
      Imagino que erros ECC incorrigíveis simplesmente sejam lidos como dados incorretos
      Fico curioso se módulos de RAM modernos também usam chips com ECC on-die
    • Será que não daria simplesmente para aproximar um celular do DIMM e induzir erros? Parece fácil de testar
    • Criar a possibilidade de ter que ressoldar um BGA em uma PCBA de I/O de alta velocidade que deve rodar por 10 anos parece mais arriscado do que curto-circuitar um par de pinos protegido por diodos
      O treinamento do link pode ser desativado no BIOS, permitindo encontrar rapidamente uma configuração de largura de banda no limite
      O resultado talvez não seja muito repetível, mas isso não importa
  • Algumas, talvez todas, as placas-mãe ASUS AM5 têm suporte oficial a ECC
    Acabei de verificar, e isso aparece tanto no manual da placa quanto no manual do BIOS do modelo em questão
    Uma das configurações relacionadas no BIOS tem Auto como padrão, mas, contra a intuição, nesse estado ela fica desativada, então é preciso alterá-la
    O reporte de ECC desses processadores entrou no Linux 6.5, então usuários do Debian Stable precisam esperar chegar aos Backports ou sair do caminho padrão
    https://www.phoronix.com/news/AMD-EDAC-Ryzen-7000-Series

    • Eu realmente detesto configurações Auto no BIOS
      Se desse para ver o valor realmente aplicado, até seria melhor, mas em nove de cada dez vezes isso não fica claro
  • Há rumores de que versões antigas do AGESA tinham um bug que impedia o chipset de reconhecer e usar corretamente RAM ECC
    Mesmo quando aquele chipset deveria oferecer suporte
    Para a placa-mãe que você estiver considerando, é preciso conferir se existe atualização de firmware com pelo menos AGESA 1.0.0.5 patch C
    https://www.reddit.com/r/truenas/comments/10lqofy/
    AGESA é parte do firmware de sistemas AMD e inicializa componentes centrais do sistema: https://en.wikipedia.org/wiki/AGESA

    • Pelo thread no fórum da ASRock, parece ser isso mesmo
      Atualizei para AGESA 1.0.0.7b antes de instalar RAM ECC
  • Eu não sabia que a série Ryzen 7000 não declarava oficialmente suporte a ECC

    • Depois de publicar isto, descobri que existem placas-mãe AM5 com suporte oficial a ECC
      Por exemplo, a linha ASRock Rack oferece suporte: https://www.asrockrack.com/general/productdetail.asp?Model=1...
      Esta placa-mãe da ASUS também afirma ter suporte a ECC: https://www.asus.com/us/motherboards-components/motherboards...
      Nenhuma das duas existia quando comprei minha primeira placa-mãe AM5. Foi logo após o lançamento, e os números de desempenho eram tão bons que comprei cedo
    • Isso é uma interpretação equivocada do que o autor disse
      Todas as CPUs Ryzen 7000 atualmente à venda têm suporte oficial a ECC, mas também é necessário suporte da placa-mãe
      Esse tipo de suporte condicional a ECC sempre existiu nos CPUs AMD de consumo, remontando ao Athlon 64, mas acho que é a primeira vez que vejo isso declarado nos materiais de marketing da AMD para a série Ryzen 7000
      O que o autor quis dizer é que a menção ao suporte a ECC desapareceu da documentação da placa-mãe ASRock
      Como a ASRock vinha declarando suporte a ECC em placas-mãe Ryzen anteriores, foi uma mudança notável
      Exemplo da página de especificações do Ryzen 5 7600: https://www.amd.com/en/product/12756#:~:text=ECC%20Support,R...)
    • Antes deste ano, isso era bem ambíguo e não era mencionado de forma clara
      Além disso, há confusão com o ECC on-chip usado por todos os DDR5
      DDR5 precisa de ECC on-chip para corrigir erros que ocorrem durante a operação normal, mas isso não é ECC que proteja também os dados transmitidos para a CPU pelo barramento de memória