Tenho alguns servidores baremetal executando RHEL, que anteriormente tinham alguns problemas com travamentos de java/JVM e, ocasionalmente, algumas mensagens de erro de memória em nível de kernel. Os servidores agora estão quase todos ociosos, pois as cargas de trabalho foram movidas para outro lugar, aguardando a substituição da memória.
Depois de ler a postagem de Aleksey Shipilёv Please test your memory , gostaria de executar o memtester no host para ver se ele detectaria esses problemas sem precisar reinicializar. Normalmente, usaríamos apenas o memtest86+ "normal" na reinicialização, mas pode ser interessante ter alternativas.
Quanto tempo levaria para concluir uma execução do memtester em um servidor da era de 2016 com 3 TB de memória?
Uma execução do memtest86+ levou cerca de 3 dias em um desses hosts (v6.10). Provavelmente ajuda que o memtest seja multithread, como o artigo de Shipolev menciona.
No mesmo servidor, uma execução de
memtester 2700g 3
(versão 4.5.1) ainda estava no primeiro loop de 3 após execução por 21 dias de tempo de relógio de parede. Estava usando 100% de um núcleo constantemente.Este era um R930 com CPU Intel E7-8880 v4 (176 núcleos) e 96x32 GB de RAM DDR4 a 2400 MHz.
Concluindo, reiniciar a máquina e executar o memtest86+ usual continua sendo a melhor chance. As cargas de trabalho precisam ser interrompidas ou movidas para outro lugar para que tais investigações aconteçam.
Não é uma opção testar preventivamente a memória dessa forma, então provavelmente valerá a pena conduzir o teste de memória somente após alguns erros terem sido detectados pelo kernel ou a quantidade de travamentos da JVM for tão grave que as cargas de trabalho tiveram que ser interrompidas ou movidas para outro lugar já. Usar o memtester ainda pode ser útil em alguns casos onde a quantidade de memória a ser testada é limitada e o acesso físico ou uma reinicialização são proibitivamente caros.
Exemplo de log
Não há uma resposta geral possível: isso dependerá da RAM e do controlador de memória da CPU, e há várias ordens de magnitude de diferença que você pode esperar do hardware de servidor disponível atualmente.
Geralmente, testar memória física testando memória virtual do espaço do usuário é... hm, essa é uma má ideia por design. Você gastaria mais tempo estressando a lógica de paginação no seu kernel, a MMU da sua CPU, as múltiplas camadas de coerência de cache em máquinas multi-core (o que uma máquina de 3 TB provavelmente é) do que realmente faria interagindo com RAM física, e se você não for cuidadoso ao fazer isso da maneira que sua CPU é otimizada para acessar a memória (em máquinas x86_64/AVX2 e posteriores,
mm256_stream_*
vs carregamento/armazenamentos clássicos vs...) você obteria outro fator, geralmente na ordem de 5×, na perda de desempenho.Então, você ir em
memtest86+
vez disso (o que realmente coloca este Q/A fora do tópico deste site, você não acha?) foi a jogada certa, mais ou menos (eu não acho que ele realmente saiba do cache e da topologia de coerência da sua máquina, então ele não pode realmente testar em paralelo bem). Mas honestamente: por quê? Até mesmo aquele blog, que assume máquinas muito menores (uma RAM de 128 GB parece ser grande para elas), diz, OK, você começa com RAM ECC. E de jeito nenhum você tem um único nó conectado a 3 TB de RAM que não seja RAM ECC. E se você tem RAM ECC, então você terá um contador de quantos erros ele teve que corrigir. Inversões de bits na RAM são esperadas, e em 3 TB de RAM, você pode ter certeza de que pelo menos uma ocorreu - mas é o trabalho do ECC converter o erro físico de volta para os dados corretos, para que você tenha memória confiável.Mas é claro que, embora o ECC corrija a maioria dos erros, também pode (má sorte) acontecer que os erros sejam tão graves que o resultado pareça dados válidos (ou algo que pode ser mais facilmente "corrigido" para os dados válidos errados do que para os dados corretos). Então, se você sabe qual geração de RAM sua máquina usa e que tipo de ECC ela usa, você pode fazer inferências do contador de erros ECC corrigíveis para a contagem de erros corrigidos incorretamente. Isso é muito melhor no uso prático do que executar uma verificação de memória sintética – que pode ou não ver coisas como efeitos vizinhos (pense em coisas como Rowhammer), enquanto os contadores ECC realmente observam o que dá errado durante o uso. Um pico em erros ECC corrigíveis seria motivo para investigação.
Vindo de uma direção diferente: se você tem memória ECC, você deve ter contadores de erros corrigidos e não corrigidos. No RHEL8 e RHEL9, instale o
rasdaemon
pacote, e entãoras-mc-ctl --error-count
listará as contagens de erros registradas pelo hardware nesta inicialização:Além disso, você pode iniciar o
rasdaemon
serviço na inicialização, e ele colocará os erros detectados em um banco de dados que você pode consultar comras-mc-ctl --errors
. Isso permite que você compare os timestamps de erros de memória conhecidos com os timestamps de travamentos e erros de kernel.Finalmente,
rasdaemon
a configuração do/etc/sysconfig/rasdaemon
permite que você o configure para dizer ao kernel para desligar páginas ruins da memória se elas tiverem muitos Erros Corrigidos em um período de tempo; se você configurar isso e vir muitas páginas offline, você sabe que tem memória defeituosa. Isso também lhe dá uma chance de manter o sistema funcionando com memória falha, reduzindo a capacidade de memória para remover a RAM defeituosa.