O Linux pode limpar a memória?

10

O Linux possui um mecanismo para "limpar" a memória? por exemplo, testando as áreas de memória e marcação como sujas, se falharem, para que o sistema possa continuar operando "com segurança", mesmo com chips de memória RAM instalados ?!

Waxhead
fonte

Respostas:

2

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.

Cimbali
fonte
1
Isso se aplica apenas se você tiver a memória ECC mais cara.
psusi
Isso se aplica a todas as memórias com ECC. Seja paridade (mas você não pode corrigir), SECDED, o Chipkill mais caro ou qualquer outro mais novo. O DDR1 já poderia implementar o ECC, mas tudo dependeria de qual modelo real você usa. Tradicionalmente, o mercado "doméstico" tem menos necessidade de resiliência, mas os supercomputadores são equipados com eles há mais de 20 anos - os servidores estão no meio.
Cimbali
1
Eu quis dizer que a memória ECC é mais cara (do que não ECC) e, portanto, a maioria das pessoas não a possui.
Pssi
1
Bem, "a maioria das pessoas" é bastante vaga. Se é comum pagar o preço em investimento e energia depende do mercado, como eu disse. Meu laptop Dell médio, agora com 2 anos de idade, está equipado com ele (padrão, não são necessárias opções especiais). Está ficando cada vez mais comum, porque a miniaturização de recursos torna os DIMMs mais sensíveis a várias radiações.
Cimbali
1
Cimbali, que faz "Patrol Scrubbing" (em sistemas com memória ECC) - firmware do BIOS (provavelmente no modo smm, transparente para o kernel do sistema operacional) ou kernel Linux em algum modo de software (que módulo faz a limpeza da patrulha)? A memória ECC não verificou somas ecc; para verificar ecc, os dados devem ser lidos (e o esquema ecc no controlador de memória verificará a soma). Alguma memória é lida frequentemente (por programas normais na CPU), outra pode não ser lida por semanas. Patrol lavagem irá ler toda a memória todos os dias (Intel) ou a cada 1-48 horas para fazer ECC verificação - electronics.stackexchange.com/q/73546#comment911379_73573
osgx
7

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:

  1. Teste a memória com o memtest86 , de preferência teste longo, deixe-o em execução durante a noite, levará muito tempo.

  2. 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).

haimg
fonte
Obrigado pela dica sobre esses parâmetros do kernel. Você acha que pode esclarecer por que essa é uma idéia tão ruim e por que você não pode verificar um pedaço de memória usando os mesmos métodos que o memtest86 (+)? Estou ciente de que testes mais confiáveis ​​requerem mais tempo de CPU (e provavelmente pedaços maiores de memória RAM de uma só vez), mas por que isso teria que ser um impedimento de exibição? O tempo de CPU pode não ser um problema se espalhado por um período suficientemente longo e, além disso, a multi cpu está se tornando cada vez mais popular.
Waxhead
Bem, tecnicamente, se feito por um período de tempo suficientemente longo, isso pode ser possível. Mas o gargalo aqui não é CPU (s), mas barramento de memória e, é claro, você "envenena" o cache de memória de sua CPU. Eu não tinha conhecimento de tal módulo do kernel, ea ideia parece muito frágil para mim (orquestrar escrita teste padrão repetido a uma região arbitrária de memória em um sistema vivo, etc.)
haimg
haimg: question: o VFS gerenciará a paginação dessa memória reservada? Eu acho que não pode, pois não será visível para ele.
Jay D
1
A depuração da memória do @Waxhead geralmente é feita no nível do BIOS usando hardware. Se ativado, você deve encontrar opções para limpeza por patrulha e limpeza por demanda. Se a integridade da memória é importante para você, e com certeza se você estiver usando a memória ECC, vale a pena o pequeno desempenho atingido ao ativar essas opções.
Ian
1
Eu acho que poderia ser interessante incluir uma referência ao módulo badram do kernel aqui. Ele usa o memtest86 como você propõe, mas, em vez de evitar que o kernel use memória ruim, o aloca para o kernel para não usá-lo, garantindo efetivamente que nem o kernel nem seus aplicativos sejam executados nessa memória.
Cimbali
2

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.

Larry Stewart
fonte
Por que você acha que a resposta errada entendeu o problema quando foi marcado como a resposta?
Dave
1
Não obstante a resposta de Dave, Larry está bastante correto, a resposta / não entende a pergunta. A pergunta pergunta se o linux pode fazer uma limpeza de memória, usada, como Larry explica cuidadosamente, para evitar que erros de um único bit detectados e corrigidos pelo ECC h / w se transformem em erros de 2 bits incorrigíveis. A resposta fala sobre como detectar esses erros em primeiro lugar usando um aplicativo de software.
Ian
Eu acho que você não entendeu o propósito aqui. É claro que você está correto em sua descrição sobre a depuração, no entanto, se, por exemplo, você executa um servidor de arquivos (não crítico) em uma ram não ecc e possui ciclos de CPU para poupar, parece uma boa idéia, mais cedo ou mais tarde, poder detectar defeitos memória e sinalize-a como ruim e saiba mais do que desconhecer um chip de memória ruim. Talvez uma redação melhor seja validação / verificação de memória. Talvez não seja tecnicamente limpo, mas ainda assim é uma maneira viável de reduzir os danos causados ​​por uma memória potencialmente ruim.
Waxhead