Какая проблема вообще решается при помощи ECC
Оперативная память должна вернуть процессору те же данные, которые были в нее записаны. На практике отдельный бит иногда может изменить состояние.
Причины разные. Возможен физический дефект DRAM, нестабильность питания, проблемы сигнала, деградация микросхемы, чрезмерный разгон или кратковременное внешнее воздействие. Ошибка может быть постоянной и повторяться в одном участке памяти либо возникнуть один раз и больше себя не проявить.
Если бит изменился в области, которая в этот момент не используется, пользователь ничего не заметит. Ошибка в данных работающей программы способна привести к ее падению. Если повреждена инструкция или структура ядра операционной системы, система может зависнуть или перезагрузиться.
Хуже выглядит тихая ошибка. Компьютер продолжает работать, но неправильное значение используется дальше.
Это может быть один изменившийся пиксель в промежуточном буфере, неверное число в расчете или бит внутри файла перед его записью на накопитель.
SSD, RAID и резервная копия здесь уже не обязательно помогут. Накопитель честно сохранит то, что передал компьютер.
ECC нужна прежде всего для того, чтобы обнаружить подобную ошибку в памяти до того, как неправильное значение незаметно пройдет дальше.
Обычная память не проверяет смысл прочитанных битов
Предположим, процессор записал в память последовательность:
10110110
Через некоторое время один бит изменился:
10100110
Обычная память возвращает вторую последовательность. Сам модуль не знает, что раньше там находилось другое значение.
Программа тоже обычно не знает.
Для нее это просто восемь полученных битов.
В ECC-системе вместе с пользовательскими данными вычисляется дополнительный код. При чтении контроллер снова анализирует комбинацию данных и проверочных битов.
Если результат не совпадает с ожидаемым, система понимает, что данные изменились.
Распространенная схема SECDED расшифровывается как Single Error Correction, Double Error Detection. Она позволяет исправлять одиночную битовую ошибку в защищаемом слове и обнаруживать определенные двойные ошибки.
В документации Linux EDAC этот режим так и обозначен: EDAC_SECDED, то есть коррекция одного ошибочного бита и обнаружение двух.
Это уже принципиальная разница с обычной DRAM. Ошибка перестает быть полностью невидимой.
Как ECC понимает, какой именно бит сломан
Для этого используются проверочные биты, рассчитанные по определенным группам информационных битов.
Упрощенный пример можно представить через код Хэмминга. Проверочные биты расположены так, чтобы каждый информационный бит участвовал в своей комбинации проверок.
Если при чтении несколько проверок одновременно дают ошибку, их результат образует синдром.
По синдрому можно определить позицию неправильного бита.
Контроллер меняет его состояние обратно и отдает процессору уже исправленные данные.
В реальной серверной памяти механизмы могут быть сложнее простого школьного примера с кодом Хэмминга. Существуют расширенные схемы ECC, Chipkill и другие RAS-механизмы.
Но базовая идея остается той же: в памяти хранится дополнительная информация, которая позволяет определить, что исходные данные изменились.

ECC исправляет ошибку до того, как ее увидит программа
Это важное отличие от проверки файловой системы.
Допустим, приложение читает число из RAM. Один бит уже изменился.
С обычной памятью программа получает неправильное значение.
ECC-контроллер при корректируемой ошибке сначала восстанавливает исходный бит и только потом передает данные процессору.
Приложение может вообще не узнать, что что-то произошло.
При этом аппаратная платформа способна записать событие в журнал.
В Linux подсистема EDAC разделяет исправленные и неисправимые ошибки. В актуальной документации ядра Linux они обозначаются как corrected и uncorrected memory errors.
Это позволяет администратору увидеть проблему раньше, чем неисправность памяти начнет приводить к падениям системы.
Если на одном DIMM постоянно растет число corrected errors, сам факт их успешного исправления не является поводом оставить модуль навсегда. Повторяющиеся ошибки могут указывать на проблемную память, слот, канал или другую часть платформы.
ECC не делает память безошибочной
Формулировка "память с коррекцией ошибок" иногда создает неправильное ожидание.
ECC не запрещает битам изменяться.
Она пытается обнаружить и в определенных пределах исправить последствия.
Для типичной SECDED-защиты одиночная ошибка исправляется, двойная обнаруживается, но уже не исправляется этой схемой.
Более сложное повреждение может оказаться за пределами возможностей конкретного ECC-кода.
Поэтому ECC нельзя воспринимать как гарантию того, что неисправный модуль разрешено продолжать использовать бесконечно.
Если память регулярно создает корректируемые ошибки, защита фактически сообщает о развивающейся аппаратной проблеме.
Почему серверы используют ECC десятилетиями
На одном домашнем компьютере вероятность встретить ошибку за конкретный вечер может быть небольшой.
В дата-центре работают тысячи или десятки тысяч DIMM одновременно и круглосуточно.
Редкое событие перестает быть редким, когда число компонентов и время работы растут.
Одно из самых известных полевых исследований DRAM провела Google. Авторы анализировали память большого парка серверов в течение 2,5 года и получили данные за миллионы DIMM-дней.
В работе DRAM Errors in the Wild более 8% исследованных DIMM сталкивались с ошибками в течение года. Исследование опубликовано еще в 2009 году и относится к серверным системам того периода, поэтому переносить цифру 8% на современный домашний DDR5 нельзя.
Интересен другой результат.
В исследованном парке значительную роль играли постоянные аппаратные ошибки, а не исключительно случайные однократные переключения битов.
Это хорошо объясняет серверную логику ECC. Система получает возможность увидеть ухудшающийся DIMM до того, как он начнет незаметно портить рабочие данные.
Откуда взялся миф про космические лучи
При разговоре об ECC почти неизбежно появляется история о частице из космоса, которая попала в микросхему и переключила бит.
Такие soft errors действительно физически возможны. Ионизирующее излучение является одним из известных источников одиночных событий в полупроводниках.
Но сводить все ошибки памяти к космическим лучам неправильно.
Реальная DRAM ломается по множеству причин.
Исследование Google как раз показало, что в изученных производственных системах значительная часть ошибок была связана с постоянными аппаратными проблемами.
Для владельца домашнего компьютера точная причина каждого изменившегося бита не так важна.
ECC ценна тем, что способна обнаружить факт изменения независимо от того, чем оно было вызвано.
Почему с появлением DDR5 началась путаница
DDR5 действительно содержит ECC.
Но это не тот же механизм, который обычно имеют в виду под ECC RAM.
В спецификацию DDR5 вошла функция On-die ECC, или ODECC.
Она находится внутри самой микросхемы DRAM.
Micron описывает принцип следующим образом: для блока из 128 бит внутри DDR5 формируется дополнительный 8-битный код. При внутреннем чтении микросхема способна исправить одиночную ошибку еще до передачи данных наружу.
Подробное описание этого механизма есть в материале Micron о DDR5.
Зачем это понадобилось?
По мере увеличения плотности памяти и усложнения производства поддерживать требуемый уровень надежности отдельных ячеек становится труднее. Встроенная коррекция позволяет самой DRAM компенсировать часть внутренних дефектов.
Но граница защиты заканчивается внутри микросхемы.
On-die ECC защищает кристалл, а не весь путь до процессора
Это главное различие.
Представим путь данных:
ячейка DRAM -> внутренняя логика микросхемы -> выводы DRAM -> печатная плата DIMM -> разъем -> дорожки материнской платы -> контроллер памяти процессора.
On-die ECC работает на первом участке.
Она защищает внутренний массив памяти.
Когда корректные данные покинули DRAM-чип, ODECC уже выполнила свою задачу.
Если проблема возникла позже при передаче по каналу памяти, встроенный код конкретной микросхемы не исправляет ее как полноценная системная ECC.
Поэтому обычный DDR5 UDIMM с надписью Non-ECC остается Non-ECC на уровне всей системы, хотя каждая его микросхема использует On-die ECC внутри.
Производители материнских плат иногда прямо прописывают это в характеристиках. Например, ASUS для ряда AM5-плат отдельно указывает поддержку ECC и Non-ECC UDIMM, после чего уточняет, что именно Non-ECC DDR5 имеет функцию On-die ECC.
Два термина находятся рядом именно потому, что обозначают разные уровни защиты.
Если у любой DDR5 есть On-die ECC, почему модуль все равно называется Non-ECC
Потому что при классификации системной памяти под ECC обычно понимается защита данных на интерфейсе между памятью и контроллером.
У настоящего ECC-модуля имеются дополнительные проверочные данные, доступные системному контроллеру памяти.
Контроллер процессора участвует в создании и проверке ECC-кода.
Если обнаружена корректируемая ошибка, она исправляется на системном уровне и может быть зарегистрирована.
У обычного DDR5 Non-ECC UDIMM внутренний ODECC скрыт внутри DRAM.
Контроллер процессора не получает из него полноценный механизм защиты канала памяти.
Поэтому фраза "у DDR5 ECC уже встроена" технически верна только с уточнением уровня.
Для ответа на вопрос "нужна ли мне ECC RAM" она вводит в заблуждение.

On-die ECC нельзя отключить и использовать как серверную ECC
ODECC является частью самой организации DDR5 DRAM.
Пользователь не получает набор дополнительных ECC-битов, который можно каким-то образом передать операционной системе.
BIOS тоже не превращает обычный Non-ECC DDR5 в ECC UDIMM одной настройкой.
Если нужна системная ECC, ее должны одновременно поддерживать несколько компонентов:
процессор и его контроллер памяти;
материнская плата и разводка;
BIOS/UEFI;
сам ECC DIMM.
Иногда дополнительно важна поддержка со стороны прошивки и операционной системы для корректной регистрации событий.
Если одно звено отсутствует, наличие ECC-функции в остальных компонентах не гарантирует ее работу.
Почему наличие поддержки ECC у процессора еще ничего не гарантирует
Хороший современный пример дает AM5.
AMD в официальных характеристиках Ryzen 9 9900X указывает:
ECC Support: Yes (Requires mobo support).
То есть сам процессор способен работать с ECC, но необходима подходящая материнская плата.
И здесь начинается самое интересное.
У ASUS ROG Crosshair X870E Hero в спецификациях заявлены ECC и Non-ECC Unbuffered DIMM.
У Gigabyte X870E Eagle WiFi7 в официальной спецификации указаны только Non-ECC Unbuffered DIMM.
Оба продукта относятся к X870E.
Оба работают с Ryzen.
Но возможности памяти различаются.
Поэтому фраза "на AM5 ECC поддерживается" недостаточна для покупки компонентов.
Проверять нужно конкретную комбинацию CPU и платы.

У Intel ситуация тоже зависит от платформы, а не от одной надписи Core
В современных настольных процессорах Intel поддержка ECC тоже встречается за пределами Xeon.
Например, Intel указывает ECC Memory Supported: Yes для Core Ultra 9 285K.
Но из этого не следует, что можно поставить ECC UDIMM в любую игровую плату и получить работающую коррекцию.
В платформе Arrow Lake системная ECC связана с соответствующей конфигурацией платы и чипсета.
Актуальный workstation-чипсет Intel W880 официально поддерживает ECC.
Для массовых игровых плат на Z-серии конфигурация может быть другой.
Поэтому при сборке системы снова приходится проверять сразу процессор, чипсет, спецификацию конкретной материнской платы и QVL памяти.
Покупка ECC DIMM до такой проверки легко заканчивается тем, что система либо не запускается, либо модуль работает без ожидаемой функции коррекции.
ECC UDIMM и RDIMM нельзя считать взаимозаменяемыми
Слово ECC описывает механизм защиты, но не тип электрической организации модуля.
В домашних и рабочих станциях может использоваться ECC UDIMM, то есть unbuffered ECC memory.
В серверах распространены RDIMM, Registered DIMM.
RDIMM содержит регистр, который буферизует определенные сигналы между контроллером и памятью. Это позволяет строить системы с большим числом модулей и значительно большим объемом RAM.
Есть и LRDIMM с другой схемой буферизации.
Обычная настольная плата, которая поддерживает ECC UDIMM, обычно не становится совместимой с RDIMM.
И наоборот, серверная или Threadripper Pro платформа может быть рассчитана на Registered ECC память.
Поэтому запрос "купить DDR5 ECC" неполон.
Нужно знать, какой тип DIMM принимает конкретная плата.
Почему у серверного модуля часто больше микросхем
У традиционного ECC DIMM часть микросхем хранит дополнительные проверочные данные.
Из-за этого на старых модулях часто можно визуально увидеть девять чипов там, где у похожей обычной планки расположено восемь.
Но считать микросхемы сегодня не лучший способ определения типа памяти.
Организация DDR5 сложнее, плотность чипов различается, существуют модули с несколькими ranks, RDIMM с регистром и варианты компоновки с обеих сторон платы.
Гораздо надежнее прочитать маркировку и спецификацию конкретного part number.
Надпись ECC UDIMM или ECC RDIMM говорит больше, чем число черных корпусов на печатной плате.
ECC и Registered означают разные вещи
Еще одна старая путаница.
Registered memory не является синонимом ECC.
Registered относится к буферизации команд и адресных сигналов.
ECC относится к обнаружению и коррекции ошибок данных.
На практике серверные RDIMM почти всегда связаны с ECC, поэтому два свойства стали восприниматься как одно.
Но технически это разные механизмы.
Для обычного AM5-компьютера, который поддерживает ECC UDIMM, покупать серверный RDIMM только потому, что на нем написано ECC, нельзя.
Он электрически относится к другому типу модуля.
Что происходит, когда ECC исправила ошибку
Программа получает правильные данные и продолжает работу.
На уровне операционной системы событие может быть зарегистрировано как Correctable Error.
Linux EDAC умеет вести учет таких событий.
На серверных платформах дополнительно работают механизмы RAS, журналы BMC, Machine Check Architecture и средства мониторинга производителя.
Это дает администратору важную информацию.
Одна единичная corrected error за годы эксплуатации и сотни гигабайт памяти имеет одно значение.
Сотни ошибок на одном DIMM за короткое время означают совсем другое.
ECC поэтому работает одновременно как защита данных и как диагностический датчик.
Обычная память при аналогичной развивающейся неисправности может впервые сообщить о себе уже падением программы или поврежденным файлом.
А что происходит с неисправимой ошибкой
Зависит от архитектуры и места возникновения.
Если ECC определила повреждение, которое не может исправить, система по крайней мере знает, что данным доверять нельзя.
Дальше возможен Machine Check, запись в системный журнал, остановка процесса, исключение поврежденной страницы памяти или аварийная остановка всей системы.
На первый взгляд это хуже: компьютер упал.
Но для критичных данных остановка часто лучше тихого продолжения работы с неправильным значением.
Сервер базы данных, который завершил операцию с ошибкой и оставил запись в журнале, проще диагностировать, чем сервер, который незаметно записал в базу испорченные числа.
ECC защищает файлы от bit rot или нет
Не напрямую.
ECC RAM отвечает только за данные, пока они находятся в оперативной памяти и проходят через защищаемый тракт памяти.
После записи файла на SSD или HDD начинают действовать другие механизмы.
У накопителя есть собственная ECC.
Файловая система может использовать контрольные суммы.
RAID может хранить избыточность.
Резервная копия создает дополнительный экземпляр данных.
Эти уровни нельзя заменять друг другом.
ECC RAM не восстановит файл, который несколько лет назад повредился на диске.
ZFS с контрольными суммами не исправит значение, которое уже было неправильным в RAM до вычисления этой контрольной суммы.
Надежная система строится из нескольких уровней защиты.

