Есть ли в Linux механизм "очистки" памяти? Например, проверить память и пометить области как загрязненные, если они выйдут из строя, чтобы система могла продолжать работать "безопасно" даже с установленными плохими чипами оперативной памяти ?!
4 ответа
Это на самом деле плохая идея. Память не может быть надежно проверена быстрым сканированием. Вот почему программное обеспечение, такое как memtest86, использует многократные проходы с различными битовыми шаблонами для проверки памяти. Решение:
Проверьте память с помощью memtest86, желательно длительный тест, оставьте его работать на ночь, это займет много времени.
Если обнаружена плохая память, используйте параметр ядра
memmap
чтобы заставить ядро не использовать эту память:
memmap=nn[KMG]$ss[KMG] [KNL,ACPI] Mark specific memory as reserved. Region of memory to be used, from ss to ss+nn. Example: Exclude memory from 0x18690000-0x1869ffff memmap=64K$0x18690000 or memmap=0x10000$0x18690000
Кроме того, вы можете использовать память ECC, которая будет исправлять 1-битные ошибки и автоматически обнаруживать 2-битные ошибки в вашей памяти (и вы получите сообщения журнала от ядра о неисправимых проблемах памяти, если они возникнут)
Пост и ответ неправильно понимают проблему. Очистка памяти предназначена для предотвращения превращения исправляемых однобитовых ошибок в неисправимые двойные ошибки. Скруббер просто вся физическая память (форсирующая кеш, чтобы это пропустить) иногда. Если есть какие-либо однобитовые ошибки, они будут исправлены (и исправление должно перезаписать правильное значение с использованием сравнения и замены), тем самым очистив ошибку.
В противном случае, если в слове, в котором уже есть одна ошибка, возникает вторая ошибка, все слово будет неисправимым, и ОС придется сделать что-то радикальное.
Очистка важна, потому что без нее память, которая читается, но не записывается (например, кодовые страницы), может со временем накапливать ошибки.
Ответ - да, и это сделано прозрачно (при условии, что у вас есть память ECC для обнаружения ошибок, и ваша версия ядра должна быть не ниже 2.6.30 для безопасной работы).
По сути, ваша память проверяется при каждом чтении из процессора и периодически очищается *, чтобы проверить соответствие кодам исправления ошибок (ECC). Если произошла ошибка, вы получаете исключение проверки компьютера, которое затем регистрируется и захватывается mcelog (http://www.mcelog.org/).
Если ваша ошибка была исправима, он увеличивает счетчик "утечка памяти", что приводит к тому, что физический модуль DIMM, который слишком часто выходит из строя, прозрачно заменяется другим. Таким образом, ваша страница памяти копируется в новое место, адрес вашей виртуальной памяти обновляется, чтобы указывать на новую страницу, а старая страница помечается ОС, чтобы она больше не использовалась.
Это называется "мягким отключением" в Linux (и удаление страниц памяти в Solaris, я не знаю о других ОС).
Однако, если ваша ошибка не исправима, происходит так называемое «жесткое отключение», то есть ваша страница памяти удаляется из обычного управления памятью операционной системы, а ваше приложение убивается (NB: из-за некоторого перехватываемого сигнала SIGBUS, который сообщает вам, где ошибка произошла, но это достаточно редко, чтобы не заботиться и попытаться ее поймать). Если ваша страница памяти сопоставлена из файла и очищена, ОС также может прозрачно перезагрузить ее в другом физическом месте, вместо того, чтобы убивать процесс.
Вы можете прочитать больше о mcelog, есть много опций конфигурации, вы можете получить другие варианты поведения, опции и другие указания о том, что читать и как убедиться, что mcelog работает в вашей системе.
* Очистка, или "Patrol Scrubbing" состоит в чтении памяти, проверке ее на наличие ошибок в ECC и перезаписи исправленными словами памяти при обнаружении ошибки. Термин "патрульная очистка" используется в противоположность перезаписи неверных данных об ошибках чтения памяти, которые иногда называют "очисткой по требованию". Очистка - это аппаратная процедура, которую можно включить, как правило, через BIOS.
Если у вас есть память ECC, вы можете поближе познакомиться с https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac. (Я нашел "sdram_scrub_rate" особенно интересным.)
(Если в какой-то момент эта ссылка разорвется (в действительности это не должно произойти), я бы предложил загрузить соответствующую документацию по Linux и выполнить поиск "scrub".)