Ответы:
Ответ - да, и это сделано прозрачно (при условии, что у вас есть память ECC для обнаружения ошибок, и ваша версия ядра должна быть не ниже 2.6.30 для безопасной работы).
По сути, ваша память проверяется при каждом чтении из процессора и периодически очищается *, чтобы проверить соответствие кодам исправления ошибок (ECC). Если произошла ошибка, вы получаете исключение проверки машины, которое затем регистрируется и захватывается mcelog ( http://www.mcelog.org/ ).
Если ваша ошибка была исправима, он увеличивает счетчик «утечка памяти», что приводит к тому, что физический модуль DIMM, который слишком часто не удается, прозрачно заменяется другим. Таким образом, ваша страница памяти копируется в новое место, адрес вашей виртуальной памяти обновляется, чтобы указывать на новую страницу, а старая страница помечается ОС, чтобы она больше не использовалась.
Это называется «мягким отключением» в Linux (и удаление страниц памяти в Solaris, я не знаю о других ОС).
Однако, если ваша ошибка не исправима, происходит так называемое «жесткое отключение», то есть ваша страница памяти удаляется из обычного управления памятью операционной системы, а ваше приложение убивается (примечание: какой-то перехватываемый сигнал SIGBUS, который сообщает вам, где ошибка произошла, но это достаточно редко, чтобы не заботиться и попытаться ее поймать). Если ваша страница памяти сопоставлена из файла и очищена, ОС также может прозрачно перезагрузить ее в другом физическом месте, вместо того, чтобы убивать процесс.
Вы можете прочитать больше о mcelog, есть много опций конфигурации, вы можете получить другие варианты поведения, опции и другие указания о том, что читать и как убедиться, что mcelog работает в вашей системе.
* Очистка, или «Патрульная очистка» состоит в чтении памяти, проверке ее на наличие ошибок в ECC и перезаписи исправленными словами памяти при обнаружении ошибки. Термин «патрульная очистка» используется в противоположность перезаписи неверных данных об ошибках чтения памяти, что иногда называется «очисткой по требованию». Очистка - это аппаратная процедура, которую можно включить, обычно через BIOS.
Это на самом деле плохая идея. Память не может быть надежно проверена быстрым сканированием. Вот почему программное обеспечение, такое как memtest86, использует несколько проходов с различными битовыми шаблонами для проверки памяти. Решение:
Проверьте память с помощью memtest86 , желательно долгое тестирование, оставьте его работать на ночь, это займет много времени.
Если обнаружена плохая память, используйте memmap
параметр ядра, чтобы заставить ядро не использовать эту память:
memmap = пп [КМГ] $ сс [КМГ] [KNL, ACPI] Отметить определенную память как зарезервированную. Область памяти, которая будет использоваться, от ss до ss + nn. Пример: исключить память из 0x18690000-0x1869ffff memmap = 64K $ 0x18690000 или же memmap = 0x10000 $ 0x18690000
Кроме того, вы можете использовать память ECC, которая будет исправлять 1-битные ошибки и автоматически обнаруживать 2-битные ошибки в вашей памяти (и вы получите сообщения журнала от ядра о неисправимых проблемах памяти, если они возникнут)
Пост и ответ неправильно понимают проблему. Очистка памяти предназначена для предотвращения превращения исправляемых однобитовых ошибок в неисправимые двойные ошибки. Скруббер просто вся физическая память (форсирующая кеш, чтобы это пропустить) иногда. Если есть какие-либо однобитовые ошибки, они будут исправлены (и исправление должно перезаписать правильное значение, используя сравнение и обмен), таким образом, очистив ошибку.
В противном случае, если в слове, в котором уже есть одна ошибка, возникает вторая ошибка, все слово будет неисправимым, и ОС придется сделать что-то радикальное.
Очистка важна, потому что без нее память, которая читается, но не записывается (как кодовые страницы), может со временем накапливать ошибки.
Если у вас есть память ECC, вы можете поближе взглянуть на https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Я нашел "sdram_scrub_rate" особенно интересным.)
(Если эта ссылка в какой-то момент разорвется (в действительности это не должно произойти), я бы предложил загрузить соответствующую документацию по Linux и найти «scrub».)