Linux peut-il nettoyer la mémoire?


10

Est-ce que Linux a un mécanisme pour "nettoyer" la mémoire? par exemple, tester la mémoire et marquer les zones comme sales en cas de panne afin que le système puisse continuer à fonctionner "en toute sécurité" même avec de mauvaises puces de RAM installées?!

Réponses:


2

La réponse est oui, et cela se fait de manière transparente (à condition que vous ayez de la mémoire ECC pour détecter les erreurs et que votre version du noyau soit au moins 2.6.30 pour continuer à fonctionner en toute sécurité).

Fondamentalement, votre mémoire est vérifiée à chaque lecture du processeur et nettoyée périodiquement *, pour vérifier la cohérence avec les codes de correction d'erreur (ECC). Si une erreur s'est produite, vous obtenez une exception de vérification de la machine, qui est ensuite enregistrée et récupérée par mcelog ( http://www.mcelog.org/ ).

Si votre erreur a pu être corrigée, elle incrémente un compteur de "fuites", ce qui provoque le remplacement transparent d'un module DIMM physique qui échoue trop souvent par un autre. Ainsi, votre page de mémoire est copiée vers un nouvel emplacement, votre adresse de mémoire virtuelle est mise à jour pour pointer vers la nouvelle page et l'ancienne page est marquée par le système d'exploitation comme n'étant plus utilisée.

Cela s'appelle le "soft-offlining" sous Linux (et la suppression de la page mémoire sous Solaris, je ne connais pas les autres OS).

Si votre erreur n'a pas pu être corrigée cependant, ce qui est appelé "hard-offlining" se produit, c'est-à-dire que votre page mémoire est supprimée de la gestion de la mémoire du système d'exploitation normal, et votre application est tuée (NB: par un signal SIGBUS capturable qui vous indique où l'erreur s'est produite, mais c'est assez rare pour ne pas s'en soucier et essayer de l'attraper). Si votre page mémoire est mappée à partir d'un fichier et nettoyée, le système d'exploitation peut également la recharger de manière transparente à un autre emplacement physique au lieu de tuer le processus.

Vous pouvez en savoir plus sur mcelog, il existe de nombreuses options de configuration, vous pouvez déclencher d'autres comportements, des options et d'autres pistes sur ce qu'il faut lire et comment vous assurer que mcelog fonctionne sur votre système.


* Scrubbing, ou "Patrol Scrubbing" consiste à lire la mémoire, à la vérifier par rapport à ECC pour les erreurs et à écraser les mots de mémoire corrigés lorsqu'une erreur est découverte. Le terme nettoyage de patrouille est utilisé par opposition à l'écrasement de données incorrectes sur les erreurs de lecture de la mémoire, ce qui est parfois appelé «nettoyage à la demande». Le nettoyage est une procédure matérielle qui peut être activée, généralement via le BIOS.


1
Cela ne s'applique que si vous avez la mémoire ECC la plus chère.
psusi

Cela s'applique à toutes les mémoires avec ECC. Que ce soit la parité (mais vous ne pouvez pas corriger), SECDED, le Chipkill le plus cher ou tout nouveau. DDR1 pourrait déjà implémenter ECC, mais tout dépendrait du modèle réel que vous utilisez. Le marché «domestique» a traditionnellement moins besoin de résilience, mais les supercalculateurs en sont équipés depuis plus de 20 ans - les serveurs se situent entre les deux.
Cimbali

1
Je voulais dire que la mémoire ECC est plus chère (que non ECC) et donc la plupart des gens ne l'ont pas.
psusi

1
Eh bien "la plupart des gens" est assez vague. Qu'il soit courant de payer le prix de l'investissement et de l'énergie dépend du marché, comme je l'ai dit. Mon ordinateur portable Dell moyen, qui a maintenant 2 ans, en est équipé (standard, aucune option spéciale demandée). Cela devient de plus en plus courant, car la miniaturisation des fonctionnalités rend les modules DIMM plus sensibles à diverses radiations.
Cimbali du

1
Cimbali, qui fait "Patrol Scrubbing" (sur les systèmes avec mémoire ECC) - firmware bios (probablement en mode smm, de manière transparente pour le noyau OS) ou linux kernel dans un mode logiciel (quel module fait le patrol scrubbing)? La mémoire ECC n'a pas vérifié les sommes ECC; pour vérifier ecc, les données doivent être lues (et le schéma ecc dans le contrôleur de mémoire vérifiera la somme). Une partie de la mémoire est lue souvent (par des programmes normaux sur cpu), une autre peut ne pas être lue pendant des semaines. Le nettoyage de la patrouille lira toute la mémoire tous les jours (intel) ou toutes les 1-48 heures pour effectuer la vérification ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

C'est en fait une mauvaise idée. La mémoire ne peut pas être testée de manière fiable en un balayage rapide. C'est pourquoi un logiciel comme memtest86 utilise plusieurs passes avec différents bits pour tester la mémoire. Solution:

  1. Testez la mémoire avec memtest86 , de préférence un test long, laissez-le fonctionner pendant la nuit, cela prendra beaucoup de temps.

  2. Si une mauvaise mémoire est détectée, utilisez le memmap paramètre kernel pour forcer le noyau à ne pas utiliser cette mémoire:

   memmap = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Marquer une mémoire spécifique comme réservée.
            Région de mémoire à utiliser, de ss à ss + nn.
            Exemple: exclure la mémoire de 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     ou
                     memmap = 0x10000 $ 0x18690000

De plus, vous pouvez utiliser la mémoire ECC qui corrigera les erreurs 1 bit et détectera automatiquement les erreurs 2 bits dans votre mémoire (et vous obtiendrez des messages de journal du noyau sur les problèmes de mémoire non corrigibles s'ils se produisent)


Merci pour l'astuce sur ces paramètres du noyau. Pensez-vous que vous pouvez clarifier pourquoi c'est une si mauvaise idée et pourquoi vous ne pouvez pas vérifier un morceau de mémoire en utilisant les mêmes méthodes que memtest86 (+)? Je suis conscient que des tests plus fiables nécessitent plus de temps CPU (et probablement de plus gros morceaux de RAM en une seule fois également), mais pourquoi cela devrait-il être un bouchon de show? Le temps processeur peut ne pas poser de problème s'il est étalé sur une période suffisamment longue et que le processeur multiple devient de plus en plus courant.
Waxhead

Eh bien techniquement, si cela se fait sur une période suffisamment longue, cela peut être possible. Mais le goulot d'étranglement ici n'est pas le (s) CPU (s), mais le bus mémoire, et bien sûr vous "empoisonnez" le cache mémoire de votre CPU. Je ne connaissais pas un tel module du noyau, et l'idée me semble très fragile (orchestrer l'écriture répétée de motifs dans une région de mémoire arbitraire sur un système en direct, etc.)
haimg

haimg: question: le VFS va-t-il gérer la pagination pour cette mémoire réservée? je pense qu'il ne peut pas car il ne lui sera pas visible.
Jay D

1
Le nettoyage de la mémoire @Waxhead est généralement effectué au niveau du BIOS à l'aide de matériel. Si activé, vous devriez trouver des options pour le nettoyage de patrouille et le nettoyage à la demande. Si l'intégrité de la mémoire est importante pour vous, ce qui est sûrement le cas si vous utilisez de la mémoire ECC, le faible gain de performances obtenu en activant ces options en vaut la peine.
Ian

1
Je pense qu'il pourrait être intéressant d'inclure une référence au module du noyau badram ici. Il utilise memtest86 comme vous le proposez, mais au lieu d'empêcher le noyau d'utiliser une mauvaise mémoire, il l'alloue au noyau pour ne pas l'utiliser, garantissant efficacement que ni le noyau ni vos applications ne s'exécutent dans cette mémoire.
Cimbali

2

Le message et la réponse comprennent mal le problème. Le nettoyage de la mémoire est destiné à empêcher les erreurs de bit unique corrigibles de se transformer en erreurs doubles non corrigibles. Le scrubber ne fait qu'occasionnellement toute la mémoire physique (forçant le cache à manquer). S'il y a des erreurs sur un seul bit, elles seront corrigées (et la correction doit réécrire la valeur correcte à l'aide d'une comparaison et d'un échange), supprimant ainsi l'erreur.

Sinon, si une deuxième erreur se produit dans un mot qui a déjà une erreur, le mot entier ne sera pas corrigible et le système d'exploitation devra faire quelque chose de radical.

Le nettoyage est important car sans lui, la mémoire qui est lue mais non écrite (comme les pages de codes) peut accumuler des erreurs au fil du temps.


Pourquoi pensez-vous que la réponse a mal compris le problème alors qu'il a été marqué comme réponse?
Dave

1
Nonobstant la réponse de Dave, Larry a tout à fait raison, la réponse / ne comprend pas la question. La question demande si Linux peut effectuer un nettoyage de la mémoire, utilisé, comme l'explique soigneusement Larry, pour empêcher les erreurs de bit unique détectées et corrigées par ECC h / w de se transformer en erreurs de 2 bits non corrigibles. La réponse explique comment détecter ces erreurs en premier lieu à l'aide d'une application logicielle.
Ian

Je pense que vous comprenez mal le but ici. Vous avez bien sûr raison dans votre description sur le nettoyage, cependant si vous exécutez par exemple un serveur de fichiers (non critique) sur un ram non-ecc et que vous avez des cycles CPU pour le ménager, cela semble être une bonne idée de pouvoir détecter tôt ou tard corrompu mémoire et le signaler comme mauvais et le savoir que d'ignorer une mauvaise puce de mémoire. Une meilleure formulation serait peut-être la validation / vérification de la mémoire. Peut-être pas un nettoyage technique, mais un moyen viable de réduire les dommages causés par une mémoire potentiellement mauvaise.
Waxhead

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.