Память с кодом исправления ошибок ( память ECC ) — это тип компьютерного хранилища данных , который использует код исправления ошибок [a] (ECC) для обнаружения и исправления n-битных повреждений данных , которые возникают в памяти.
Обычно память ECC поддерживает систему памяти, невосприимчивую к однобитовым ошибкам: данные, считываемые из каждого слова , всегда совпадают с данными, записанными в него, даже если один из фактически сохраненных битов был переключен в неправильное состояние. Большая часть памяти без ECC не может обнаруживать ошибки, хотя некоторая память без ECC с поддержкой четности позволяет обнаруживать, но не исправлять их.
Память ECC используется в большинстве компьютеров, где повреждение данных недопустимо, например, в приложениях промышленного управления, критически важных базах данных и кэшах инфраструктурной памяти.
Коды исправления ошибок защищают от необнаруженного повреждения данных и используются в компьютерах, где такое повреждение недопустимо, например, в научных и финансовых вычислительных приложениях или в базах данных и файловых серверах . ECC также может сократить количество сбоев в многопользовательских серверных приложениях и системах максимальной доступности.
Электрические или магнитные помехи внутри компьютерной системы могут привести к тому, что один бит динамической памяти с произвольным доступом (DRAM) спонтанно перейдет в противоположное состояние. Первоначально считалось, что это происходит в основном из-за альфа-частиц, испускаемых загрязняющими веществами в упаковочном материале чипа, но исследования показали, что большинство одноразовых программных ошибок в чипах DRAM происходит в результате фонового излучения , в основном нейтронов от вторичных космических лучей , которые могут изменить содержимое одной или нескольких ячеек памяти или помешать работе схем, используемых для чтения или записи в них. [2] Следовательно, частота ошибок быстро увеличивается с ростом высоты; например, по сравнению с уровнем моря, скорость потока нейтронов в 3,5 раза выше на высоте 1,5 км и в 300 раз выше на высоте 10–12 км (высота полета коммерческих самолетов). [3] В результате системы, работающие на больших высотах, требуют специальных мер по обеспечению надежности.
Например, космический аппарат Кассини-Гюйгенс , запущенный в 1997 году, содержал два идентичных бортовых самописца, каждый с 2,5 гигабитами памяти в виде массивов коммерческих чипов DRAM. Благодаря встроенной функциональности EDAC инженерная телеметрия космического аппарата сообщала о количестве (исправимых) однобитовых ошибок на слово и (неисправимых) двухбитовых ошибок на слово. В течение первых 2,5 лет полета космический аппарат сообщал о почти постоянной частоте однобитовых ошибок около 280 ошибок в день. Однако 6 ноября 1997 года, в течение первого месяца в космосе, количество ошибок увеличилось более чем в четыре раза за один день. Это было связано с событием солнечной частицы , которое было обнаружено спутником GOES 9. [ 4]
Были некоторые опасения, что по мере дальнейшего увеличения плотности DRAM, и, таким образом, уменьшения компонентов на чипах, в то время как рабочие напряжения продолжают падать, чипы DRAM будут чаще подвергаться воздействию такого излучения, поскольку частицы с более низкой энергией смогут изменять состояние ячейки памяти. [3] С другой стороны, меньшие ячейки создают меньшие цели, и переход к таким технологиям, как SOI, может сделать отдельные ячейки менее восприимчивыми и, таким образом, противодействовать или даже обратить вспять эту тенденцию. Недавние исследования [5] показывают, что сбои в работе из-за одиночных событий, вызванные космической радиацией, резко снижаются с геометрией процесса, и предыдущие опасения по поводу увеличения частоты ошибок в битовых ячейках необоснованны.
Работы, опубликованные в период с 2007 по 2009 год, показали значительно различающиеся показатели ошибок с разницей более чем в 7 порядков, от 10−10 ошибок /бит·ч (примерно одна ошибка бита в час на гигабайт памяти) до 10−17 ошибок /бит·ч (примерно одна ошибка бита в тысячелетие на гигабайт памяти). [5] [6] [7] Масштабное исследование, основанное на очень большом количестве серверов Google, было представлено на конференции SIGMETRICS/Performance '09. [6] Фактический уровень ошибок был на несколько порядков выше, чем в предыдущих мелкомасштабных или лабораторных исследованиях, и составил от 25 000 (2,5 × 10 −11 ошибок/бит·ч) до 70 000 (7,0 × 10 −11 ошибок/бит·ч, или 1 битовая ошибка на гигабайт оперативной памяти на 1,8 часа) ошибок на миллиард часов работы устройства на мегабит. Более 8% модулей памяти DIMM были затронуты ошибками в год.
Последствия ошибки памяти зависят от системы. В системах без ECC ошибка может привести либо к сбою, либо к повреждению данных; на крупных производственных площадках ошибки памяти являются одной из наиболее распространенных аппаратных причин сбоев машин. [6] Ошибки памяти могут вызывать уязвимости безопасности. [6] Ошибка памяти может не иметь последствий, если она немного изменяется, что не вызывает наблюдаемого сбоя и не влияет на данные, используемые в вычислениях или сохраненные. Исследование моделирования 2010 года показало, что для веб-браузера только небольшая часть ошибок памяти вызывала повреждение данных, хотя, поскольку многие ошибки памяти являются прерывистыми и коррелированными, последствия ошибок памяти были больше, чем можно было бы ожидать для независимых программных ошибок. [8]
Некоторые тесты приходят к выводу, что изоляция ячеек памяти DRAM может быть обойдена непреднамеренными побочными эффектами специально созданных доступов к соседним ячейкам. Таким образом, доступ к данным, хранящимся в DRAM, приводит к утечке зарядов ячеек памяти и их электрическому взаимодействию в результате высокой плотности ячеек в современной памяти, изменяя содержимое соседних строк памяти, которые на самом деле не были адресованы при первоначальном доступе к памяти. Этот эффект известен как молоток строк , и он также использовался в некоторых эксплойтах компьютерной безопасности с повышением привилегий . [9] [10]
Пример ошибки в одном бите, которая будет проигнорирована системой без проверки ошибок, остановит машину с проверкой четности или будет незаметно исправлена ECC: один бит застрял на 1 из-за неисправного чипа или был изменен на 1 из-за фонового или космического излучения; загружается электронная таблица, хранящая числа в формате ASCII, и символ «8» (десятичное значение 56 в кодировке ASCII) сохраняется в байте, содержащем застрявший бит в его самой низкой битовой позиции; затем в электронную таблицу вносятся изменения, и она сохраняется. В результате «8» (двоичное число 0011 100 0 ) молча превратилось в «9» (0011 100 1 ).
Было разработано несколько подходов для борьбы с нежелательными инвертированиями битов, включая программирование с учетом иммунитета, оперативную память с контролем четности и память ECC .
Эту проблему можно смягчить, используя модули DRAM, которые включают дополнительные биты памяти и контроллеры памяти, которые используют эти биты. Эти дополнительные биты используются для записи четности или для использования кода коррекции ошибок (ECC). Четность позволяет обнаруживать все однобитовые ошибки (фактически, любое нечетное количество неправильных битов). Наиболее распространенный код коррекции ошибок, код Хэмминга с исправлением одиночных ошибок и обнаружением двойных ошибок (SECDED) , позволяет исправлять однобитовые ошибки и (в обычной конфигурации с дополнительным битом четности) обнаруживать двухбитовые ошибки. Chipkill ECC — более эффективная версия, которая также исправляет множественные битовые ошибки, включая потерю всего чипа памяти.
Сеймур Крей однажды сказал: « Четность нужна фермерам » , когда его спросили, почему он убрал ее из CDC 6600. [11] Позже он включил четность в CDC 7600 , что заставило экспертов заметить, что «очевидно, многие фермеры покупают компьютеры». Оригинальный IBM PC и все ПК до начала 1990-х годов использовали проверку четности. [12] Более поздние в основном этого не делали.
Контроллер памяти с поддержкой ECC обычно может [a] обнаруживать и исправлять ошибки одного бита на слово [b] (единица передачи данных по шине ) и обнаруживать (но не исправлять) ошибки двух бит на слово. BIOS в некоторых компьютерах, при сопоставлении с операционными системами, такими как некоторые версии Linux , BSD и Windows ( Windows 2000 и более поздние [13] ), позволяет подсчитывать обнаруженные и исправленные ошибки памяти, отчасти для того, чтобы помочь идентифицировать неисправные модули памяти до того, как проблема станет катастрофической.
Некоторые чипы DRAM включают в себя «внутренние» схемы коррекции ошибок на кристалле, которые позволяют системам с контроллерами памяти без ECC по-прежнему получать большую часть преимуществ памяти ECC. [14] [15] В некоторых системах аналогичный эффект может быть достигнут путем использования модулей памяти EOS .
Обнаружение и исправление ошибок зависит от ожидания типов ошибок, которые происходят. Неявно предполагается, что сбой каждого бита в слове памяти независим, что приводит к маловероятности двух одновременных ошибок. Это было раньше, когда чипы памяти были однобитными, что было типично в первой половине 1980-х годов; более поздние разработки переместили много битов в один чип. Эта слабость устраняется различными технологиями, включая Chipkill от IBM , Extended ECC от Sun Microsystems , Chipspare от Hewlett-Packard и Single Device Data Correction (SDDC) от Intel .
Память DRAM может обеспечить повышенную защиту от программных ошибок , полагаясь на коды исправления ошибок. Такая память с исправлением ошибок , известная как память с защитой ECC или EDAC , особенно желательна для приложений с высокой отказоустойчивостью, таких как серверы, а также для приложений дальнего космоса из-за повышенной радиации . Некоторые системы также « очищают » память, периодически считывая все адреса и записывая исправленные версии, если необходимо удалить программные ошибки.
Перемежение позволяет распределить эффект одного космического луча, потенциально нарушая несколько физически соседних битов в нескольких словах, связывая соседние биты с разными словами. Пока единичное событие сбоя (SEU) не превышает порог ошибки (например, единичная ошибка) в любом конкретном слове между доступами, его можно исправить (например, с помощью кода исправления однобитовых ошибок), и можно поддерживать эффективно свободную от ошибок систему памяти. [16]
Контроллеры памяти с исправлением ошибок традиционно используют коды Хэмминга , хотя некоторые используют тройную модульную избыточность (TMR). Последний вариант предпочтительнее, поскольку его аппаратное обеспечение быстрее, чем у схемы исправления ошибок Хэмминга. [16] Космические спутниковые системы часто используют TMR, [17] [18] [19] хотя спутниковая оперативная память обычно использует исправление ошибок Хэмминга. [20]
Многие ранние реализации памяти ECC маскируют исправимые ошибки, действуя «как будто» ошибка никогда не происходила, и сообщают только о неисправимых ошибках. Современные реализации регистрируют как исправимые ошибки (CE), так и неисправимые ошибки (UE). Некоторые люди заранее заменяют модули памяти, которые показывают высокий уровень ошибок, чтобы снизить вероятность неисправимых ошибок. [21]
Многие системы памяти ECC используют «внешнюю» схему EDAC между ЦП и памятью. Несколько систем с памятью ECC используют как внутренние, так и внешние системы EDAC; внешняя система EDAC должна быть разработана для исправления определенных ошибок, которые внутренняя система EDAC не может исправить. [14] Современные настольные и серверные ЦП интегрируют схему EDAC в ЦП, [22] даже до перехода к интегрированным в ЦП контроллерам памяти, которые связаны с архитектурой NUMA . Интеграция ЦП обеспечивает систему EDAC с нулевым штрафом во время безошибочной работы.
По состоянию на 2009 год наиболее распространенные коды исправления ошибок используют коды Хэмминга или Сяо, которые обеспечивают исправление однобитовых ошибок и обнаружение двухбитовых ошибок (SEC-DED). Для защиты памяти были предложены и другие коды исправления ошибок — коды исправления двухбитовых ошибок и обнаружения трехбитовых ошибок (DEC-TED), коды исправления однобитовых ошибок и обнаружения двухбитовых ошибок (SNC-DND), коды исправления ошибок Рида–Соломона и т. д. Однако на практике многобитовая коррекция обычно реализуется путем чередования нескольких кодов SEC-DED. [23] [24]
Ранние исследования пытались минимизировать площадь и задержку накладных расходов схем ECC. Хэмминг впервые продемонстрировал, что коды SEC-DED возможны с одной конкретной проверочной матрицей. Сяо показал, что альтернативная матрица с нечетными весовыми столбцами обеспечивает возможность SEC-DED с меньшей аппаратной площадью и более короткой задержкой, чем традиционные коды Хэмминга SEC-DED. Более поздние исследования также пытаются минимизировать мощность в дополнение к минимизации площади и задержки. [25] [26] [27]
Многие процессоры используют коды исправления ошибок в кэше на кристалле , включая процессоры Intel Itanium , Xeon , Core и Pentium (начиная с микроархитектуры P6 ) [28] [29] , AMD Athlon , Opteron , все процессоры на базе Zen [ 30] и Zen+ [31] ( EPYC , EPYC Embedded, Ryzen и Ryzen Threadripper ), а также DEC Alpha 21264. [23] [32]
По состоянию на 2006 год [обновлять]EDC/ECC и ECC/ECC являются двумя наиболее распространенными методами защиты кэша от ошибок, используемыми в коммерческих микропроцессорах. Метод EDC/ECC использует код обнаружения ошибок (EDC) в кэше уровня 1. При обнаружении ошибки данные восстанавливаются из кэша уровня 2, защищенного ECC. Метод ECC/ECC использует кэш уровня 1, защищенный ECC, и кэш уровня 2, защищенный ECC. [33] Процессоры, использующие метод EDC/ECC, всегда выполняют сквозную запись всех STORE в кэш уровня 2, так что при обнаружении ошибки во время чтения из кэша данных уровня 1 копию этих данных можно восстановить из кэша уровня 2.
Регистрируемая или буферизованная память — это не то же самое, что ECC; эти технологии выполняют разные функции. Обычно память, используемая в серверах, бывает как регистрируемой, чтобы можно было использовать много модулей памяти без электрических проблем, так и ECC, для целостности данных. Память, используемая в настольных компьютерах, обычно не является ни той, ни другой, в целях экономии. Однако доступна небуферизованная (нерегистрируемая) память ECC [34] , и некоторые несерверные материнские платы поддерживают функциональность ECC таких модулей при использовании с ЦП, который поддерживает ECC. [35] Регистрируемая память не работает надежно на материнских платах без буферизационной схемы, и наоборот.
В конечном итоге приходится искать компромисс между защитой от непредвиденной потери данных и более высокой стоимостью.
Память ECC обычно имеет более высокую цену по сравнению с памятью без ECC из-за дополнительного оборудования, необходимого для производства модулей памяти ECC, а также из-за меньших объемов производства памяти ECC и соответствующего системного оборудования. Материнские платы, чипсеты и процессоры, которые поддерживают ECC, также могут быть более дорогими.
Поддержка ECC различается у разных производителей материнских плат, поэтому память ECC может просто не распознаваться материнской платой, несовместимой с ECC. Большинство материнских плат и процессоров для менее критических приложений не предназначены для поддержки ECC. Некоторые платы и процессоры с поддержкой ECC способны поддерживать небуферизованную (незарегистрированную) ECC, но также будут работать с памятью без ECC; системная прошивка включает функциональность ECC, если установлена память ECC.
ECC может снизить производительность памяти примерно на 2–3 процента в некоторых системах, в зависимости от приложения и реализации, из-за дополнительного времени, необходимого контроллерам памяти ECC для выполнения проверки ошибок. [36] Однако современные системы интегрируют тестирование ECC в ЦП, не создавая дополнительных задержек при доступе к памяти, пока не будут обнаружены ошибки. [22] [37] [38] Это не относится к внутриполосному ECC , который хранит таблицы, используемые для защиты, в зарезервированной области основной системной памяти, [39] [40] поддерживаемому Intel для Chromebook , который показал небольшое влияние на просмотр веб-страниц и задачи производительности, но вызвал до 25% снижение производительности игр и редактирования видео . [41]
Память с поддержкой ECC может привести к дополнительному энергопотреблению из-за схемы коррекции ошибок.
{{cite book}}
: |journal=
проигнорировано ( помощь )