Оперативная память хранит бит как заряд на крошечном конденсаторе. Заряд утекает сам по себе, поэтому контроллер регулярно перечитывает строки и записывает их обратно — это регенерация. В промежутке между двумя такими циклами ячейка уязвима: хватает небольшого внешнего воздействия, чтобы заряд ушёл за порог различения и ноль прочитался как единица. Обычная память подобное событие не замечает в принципе. Она отдаёт процессору искажённое слово, и дальше судьба системы зависит от того, куда это слово попало: в пиксель картинки, в счётчик цикла или в указатель структуры ядра.

Что именно ловит контроллер

Классическая схема добавляет к каждым восьми байтам данных ещё один байт проверочных разрядов. Проверочные биты вычисляются при записи по линейному коду и записываются вместе с данными. При чтении контроллер пересчитывает их заново и сравнивает с сохранёнными. Разница — синдром — не просто говорит «что-то не так»: по её значению однозначно определяется номер испорченного разряда, и контроллер инвертирует его перед тем, как отдать слово процессору. Одиночная ошибка исправляется прозрачно, программа о ней не узнаёт.

Двойная ошибка в том же слове даёт синдром, который ни одному разряду не соответствует. Исправить её схема не может, но обнаружить обязана — и обнаруживает. Дальше поведение задаётся платформой: как правило, машина останавливается или изолирует затронутый процесс, потому что молча продолжать работу с заведомо испорченными данными хуже, чем упасть. Отсюда и краткое описание схемы: одиночную исправляем, двойную ловим.

Есть и более сильные режимы, где проверочные разряды распределены так, чтобы пережить отказ целой микросхемы в модуле. Плата за это — дополнительные ограничения на конфигурацию и на то, какими группами память можно устанавливать.

Откуда берутся сбои

Причины делятся на два класса. Первый — случайные, «мягкие» сбои: частица космического происхождения или альфа-частица от следов радиоактивных примесей в корпусе микросхемы теряет энергию в кремнии и создаёт достаточно носителей заряда, чтобы перевернуть ячейку. Сама ячейка при этом исправна, повторная запись возвращает её в нормальное состояние. Вероятность такого события на один модуль мала, но она умножается на объём памяти и на время непрерывной работы. У машины с десятками гигабайт, работающей месяцами без перезагрузки, набегает заметное число событий.

Второй класс — деградация: ячейка с ослабленным удержанием заряда, микротрещина в контакте, подвод питания на грани допуска, паразитное влияние соседних строк при интенсивном обращении. Такие ошибки повторяются на одних и тех же адресах и со временем учащаются. Именно поэтому счётчик исправленных ошибок ценен сам по себе: он показывает деградацию до того, как она превратится в неисправимый отказ.

Чем приходится платить

Первое — дополнительная микросхема на модуле. Она занимает место на плате, потребляет питание и стоит денег, а полезной ёмкости не добавляет. Второе — расширенная шина данных между контроллером и модулями: платформа должна физически иметь эти линии, поэтому обычные настольные платы и процессоры такую память либо не поддерживают вовсе, либо принимают модуль, игнорируя коррекцию.

Третье — задержка. Вычисление синдрома и возможная правка разряда добавляют такты на пути чтения. На фоне общей латентности подсистемы памяти прибавка невелика, но она есть и заметна в задачах, чувствительных к задержке одиночного обращения. Четвёртое — фоновая проверка: чтобы одиночные ошибки не накапливались до двойных, контроллер периодически перечитывает всю память и переписывает исправленные строки. Эта работа отъедает часть пропускной способности.

И наконец, сама остановка при неисправимой ошибке — тоже цена. Система, которая раньше молча работала с испорченными данными, теперь честно падает. Для рабочей станции это выглядит как ухудшение, для узла, обслуживающего базу данных, — как единственно правильное поведение. Подбор модулей под конкретную платформу и её ограничения по числу разъёмов и рангов удобно разбирать вместе с остальными узлами в разделе серверная память с коррекцией.

Где это действительно нужно

Определяющий фактор — не мощность машины, а цена тихого искажения. Если результат вычисления проверяется человеком или пересчитывается заново, одиночный перевёрнутый бит обойдётся дёшево. Если данные из памяти уходят на диск и становятся источником истины на годы, ошибка закрепляется навсегда и позже проявится как непонятное повреждение записи, которое невозможно связать с причиной.

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