Может ли Linux очистить память?


10

Есть ли в Linux механизм «очистки» памяти? например, проверить память и пометить области как загрязненные, если они выйдут из строя, чтобы система могла продолжать работать «безопасно» даже с установленными плохими чипами оперативной памяти ?!

Ответы:


2

Ответ - да, и это сделано прозрачно (при условии, что у вас есть память ECC для обнаружения ошибок, и ваша версия ядра должна быть не ниже 2.6.30 для безопасной работы).

По сути, ваша память проверяется при каждом чтении из процессора и периодически очищается *, чтобы проверить соответствие кодам исправления ошибок (ECC). Если произошла ошибка, вы получаете исключение проверки машины, которое затем регистрируется и захватывается mcelog ( http://www.mcelog.org/ ).

Если ваша ошибка была исправима, он увеличивает счетчик «утечка памяти», что приводит к тому, что физический модуль DIMM, который слишком часто не удается, прозрачно заменяется другим. Таким образом, ваша страница памяти копируется в новое место, адрес вашей виртуальной памяти обновляется, чтобы указывать на новую страницу, а старая страница помечается ОС, чтобы она больше не использовалась.

Это называется «мягким отключением» в Linux (и удаление страниц памяти в Solaris, я не знаю о других ОС).

Однако, если ваша ошибка не исправима, происходит так называемое «жесткое отключение», то есть ваша страница памяти удаляется из обычного управления памятью операционной системы, а ваше приложение убивается (примечание: какой-то перехватываемый сигнал SIGBUS, который сообщает вам, где ошибка произошла, но это достаточно редко, чтобы не заботиться и попытаться ее поймать). Если ваша страница памяти сопоставлена ​​из файла и очищена, ОС также может прозрачно перезагрузить ее в другом физическом месте, вместо того, чтобы убивать процесс.

Вы можете прочитать больше о mcelog, есть много опций конфигурации, вы можете получить другие варианты поведения, опции и другие указания о том, что читать и как убедиться, что mcelog работает в вашей системе.


* Очистка, или «Патрульная очистка» состоит в чтении памяти, проверке ее на наличие ошибок в ECC и перезаписи исправленными словами памяти при обнаружении ошибки. Термин «патрульная очистка» используется в противоположность перезаписи неверных данных об ошибках чтения памяти, что иногда называется «очисткой по требованию». Очистка - это аппаратная процедура, которую можно включить, обычно через BIOS.


1
Это применимо, только если у вас более дорогая память ECC.
psusi

Это относится ко всем воспоминаниям с ECC. Будь то паритет (но тогда вы не можете исправить), SECDED, более дорогой Chipkill или любые новые. DDR1 уже может реализовывать ECC, но все будет зависеть от того, какую именно модель вы используете. «Домашний» рынок традиционно меньше нуждается в отказоустойчивости, но суперкомпьютеры оснащаются ими более 20 лет - серверы между ними.
Цимбали

1
Я имел в виду, что память ECC дороже (чем не ECC), поэтому у большинства людей ее нет.
psusi

1
Ну, "большинство людей" довольно расплывчато. Как я уже сказал, распространено ли платить цену за инвестиции и власть, зависит от рынка. Мой средний ноутбук Dell, которому сейчас 2 года, оснащен им (стандартно, никаких дополнительных опций не требуется). Это становится все более распространенным, потому что миниатюризация функций делает модули DIMM более чувствительными к различным излучениям.
Cimbali

1
Cimbali, кто выполняет "Patrol Scrubbing" (в системах с памятью ECC) - прошивку BIOS (возможно, в режиме smm, прозрачно для ядра ОС) или ядро ​​linux в каком-либо программном режиме (какой модуль выполняет очистку патруля)? Память ECC не проверяла суммы ecc; чтобы проверить ecc, данные должны быть прочитаны (и схема ecc в контроллере памяти проверит сумму). Некоторая память читается часто (обычными программами на процессоре), другая может не читаться неделями. Патрульная очистка будет считывать всю память каждый день (intel) или каждые 1-48 часов для проверки ecc - electronics.stackexchange.com/q/73546#comment911379_73573
osgx

7

Это на самом деле плохая идея. Память не может быть надежно проверена быстрым сканированием. Вот почему программное обеспечение, такое как memtest86, использует несколько проходов с различными битовыми шаблонами для проверки памяти. Решение:

  1. Проверьте память с помощью memtest86 , желательно долгое тестирование, оставьте его работать на ночь, это займет много времени.

  2. Если обнаружена плохая память, используйте memmap параметр ядра, чтобы заставить ядро ​​не использовать эту память:

   memmap = пп [КМГ] $ сс [КМГ]
            [KNL, ACPI] Отметить определенную память как зарезервированную.
            Область памяти, которая будет использоваться, от ss до ss + nn.
            Пример: исключить память из 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     или же
                     memmap = 0x10000 $ 0x18690000

Кроме того, вы можете использовать память ECC, которая будет исправлять 1-битные ошибки и автоматически обнаруживать 2-битные ошибки в вашей памяти (и вы получите сообщения журнала от ядра о неисправимых проблемах памяти, если они возникнут)


Спасибо за подсказку по этим параметрам ядра. Как вы думаете, не могли бы вы пояснить, почему это такая плохая идея и почему вы не можете проверить кусок памяти, используя те же методы, что и memtest86 (+)? Я знаю, что для более надежного тестирования требуется больше процессорного времени (и, возможно, также больше оперативной памяти за один раз), но почему это должно быть пробкой? Процессорное время не может быть проблемой, если оно распространяется на достаточно длительный период, и, кроме того, многопроцессорность становится все более популярной.
Waxhead

Технически, если это делается в течение достаточно длительного периода времени, это может быть возможно. Но узким местом здесь является не процессор (ы), а шина памяти, и, конечно, вы «отравляете» кэш памяти вашего процессора. Я не знал бы о таком модуле ядра, и идея мне кажется очень хрупкой (организация повторяющейся записи паттернов в произвольную область памяти в живой системе и т. Д.)
haimg

haimg: question: будет ли VFS управлять подкачкой для этой зарезервированной памяти? я думаю, что это не может, поскольку это не будет видно для него.
Джей Д

1
@ Waxhead Очистка памяти обычно выполняется на уровне BIOS с использованием аппаратного обеспечения. Если включено, вы должны найти опции для очистки патруля и требовать очистки. Если для вас важна целостность памяти, что, безусловно, так и есть, если вы используете память ECC, тогда небольшой выигрыш в производительности, полученный при включении этих параметров, имеет смысл.
Ян

1
Я думаю, что было бы интересно включить сюда ссылку на модуль ядра badram . Он использует memtest86, как вы предлагаете, но вместо того, чтобы удерживать ядро ​​от использования плохой памяти, он выделяет его ядру, чтобы оно не использовалось, эффективно гарантируя, что ни ядро, ни ваши приложения не будут работать в этой памяти.
Цимбали

2

Пост и ответ неправильно понимают проблему. Очистка памяти предназначена для предотвращения превращения исправляемых однобитовых ошибок в неисправимые двойные ошибки. Скруббер просто вся физическая память (форсирующая кеш, чтобы это пропустить) иногда. Если есть какие-либо однобитовые ошибки, они будут исправлены (и исправление должно перезаписать правильное значение, используя сравнение и обмен), таким образом, очистив ошибку.

В противном случае, если в слове, в котором уже есть одна ошибка, возникает вторая ошибка, все слово будет неисправимым, и ОС придется сделать что-то радикальное.

Очистка важна, потому что без нее память, которая читается, но не записывается (как кодовые страницы), может со временем накапливать ошибки.


Как вы думаете, почему мисс ответ понял проблему, когда он был помечен как ответ?
Дейв

1
Несмотря на ответ Дейва, Ларри совершенно прав, ответ / неправильно понимает вопрос. Вопрос состоит в том, может ли linux выполнить очистку памяти, используемую, как тщательно объясняет Ларри, для предотвращения того, чтобы ошибки, обнаруженные и исправленные ECC h / w, превращались в неисправимые 2-битные ошибки. Ответ говорит о том, как обнаружить эти ошибки в первую очередь с помощью программного приложения.
Ян

Я думаю, что вы не поняли цель здесь. Вы, конечно, правы в своем описании о очистке, однако, если вы, например, запускаете (некритический) файловый сервер на не-ecc ram и имеете циклы ЦП, чтобы сэкономить, это хорошая идея, чтобы рано или поздно иметь возможность обнаруживать поврежденные памяти и пометить его как плохой и знать об этом, чем не знать о плохой микросхеме памяти. Возможно, лучшей формулировкой будет проверка / подтверждение памяти. Возможно, это не техническая очистка, но все же жизнеспособный способ уменьшить ущерб, нанесенный потенциально плохой памятью.
Waxhead

1

Если у вас есть память ECC, вы можете поближе взглянуть на https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac . (Я нашел "sdram_scrub_rate" особенно интересным.)

(Если эта ссылка в какой-то момент разорвется (в действительности это не должно произойти), я бы предложил загрузить соответствующую документацию по Linux и найти «scrub».)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.