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.
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:
Testez la mémoire avec memtest86 , de préférence un test long, laissez-le fonctionner pendant la nuit, cela prendra beaucoup de temps.
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: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)
la source
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.
la source
Si vous avez de la mémoire ECC, vous voudrez peut-être regarder de plus près https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (J'ai trouvé "sdram_scrub_rate" particulièrement intéressant.)
(Si ce lien se brise à un moment donné (il ne devrait vraiment pas le faire), je suggère de télécharger la documentation Linux appropriée et de rechercher "scrub".)
la source