Respostas:
A resposta é sim e é feita de forma transparente (desde que você tenha memória ECC para detectar erros e sua versão do kernel seja pelo menos 2.6.30 para continuar operando com segurança).
Basicamente, sua memória é verificada a cada leitura do processador e lavada periodicamente *, para verificar a consistência com os ECC (Códigos de correção de erros). Se ocorreu um erro, você obtém uma exceção de verificação de máquina, que é registrada e capturada pelo mcelog ( http://www.mcelog.org/ ).
Se o seu erro foi corrigido, ele incrementa um contador de "depósito com vazamento", o que faz com que um DIMM físico que falha com muita freqüência seja substituído de forma transparente por outro. Assim, sua página de memória é copiada para um novo local, seu endereço de memória virtual é atualizado para apontar para a nova página e a página antiga é marcada pelo sistema operacional como não sendo mais usada.
Isso é chamado de "delimitação suave" no Linux (e desativação da página de memória no Solaris, não conheço outros sistemas operacionais).
Se o seu erro não foi corrigível, o que é chamado de "delimitação definitiva" acontece, ou seja, sua página de memória é removida do gerenciamento normal de memória do sistema operacional e seu aplicativo é morto (NB: por algum sinal capturável do SIGBUS que informa onde o erro ocorreu, mas é raro o suficiente não se importar e tentar pegá-lo). Se sua página de memória é mapeada a partir de um arquivo e limpa, o sistema operacional também pode recarregá-la de forma transparente em outro local físico, em vez de interromper o processo.
Você pode ler mais sobre o mcelog, existem muitas opções de configuração, outros comportamentos a serem acionados, opções e outras orientações sobre o que ler e como garantir que o mcelog esteja em execução no seu sistema.
* A limpeza ou "Patrol Scrubbing" consiste na leitura da memória, na verificação do ECC quanto a erros e na substituição das palavras de memória corrigidas quando um erro é descoberto. O termo limpeza de patrulha é usado para substituir dados incorretos sobre erros nas leituras de memória, que às vezes é chamado de "Limpeza por Demanda". A limpeza é um procedimento de hardware que pode ser ativado, geralmente através do BIOS.
Esta é realmente uma má ideia. A memória não pode ser testada com segurança em uma varredura rápida. É por isso que softwares como o memtest86 usam várias passagens com diferentes padrões de bits para testar a memória. Solução:
Teste a memória com o memtest86 , de preferência teste longo, deixe-o em execução durante a noite, levará muito tempo.
Se uma memória ruim for detectada, use o memmap
parâmetro kernel para forçar o kernel a não usar essa memória:
memmap = nn [KMG] $ ss [KMG] [KNL, ACPI] Marque a memória específica como reservada. Região da memória a ser usada, de ss para ss + nn. Exemplo: Excluir memória de 0x18690000-0x1869ffff memmap = 64K $ 0x18690000 ou memmap = 0x10000 $ 0x18690000
Além disso, você pode usar a memória ECC, que corrigirá erros de 1 bit e detectará erros de 2 bits na memória automaticamente (e você receberá mensagens de log do kernel sobre problemas de memória incorrigíveis, caso ocorram).
A postagem e a resposta interpretam mal o problema. A depuração da memória visa impedir que erros corrigíveis de bit único se transformem em erros duplos não corrigíveis. O purificador apenas toda a memória física (forçando a falta de cache) ocasionalmente. Se houver algum erro de bit único, eles serão corrigidos (e a correção deve reescrever o valor correto usando uma comparação e troca), eliminando o erro.
Caso contrário, se ocorrer um segundo erro em uma palavra que já tenha um erro, a palavra inteira ficará incorreta e o sistema operacional precisará fazer algo drástico.
A limpeza é importante porque, sem ela, a memória lida, mas não gravada (como páginas de código) pode acumular erros ao longo do tempo.
Se você possui memória ECC, consulte https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Achei "sdram_scrub_rate" especialmente interessante.)
(Se esse link quebrar em algum momento (realmente não deveria)), sugiro que baixe a documentação apropriada do Linux e pesquise "scrub".)