Чи може 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 років - сервери знаходяться між ними.
Cimbali

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

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

1
Чімбалі, хто робить "Patrol Scrubbing" (у системах з пам'яттю ECC) - програмне забезпечення біографії (можливо, в 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 = nn [KMG] $ ss [KMG]
            [KNL, ACPI] Позначити конкретну пам'ять як зарезервовану.
            Область пам'яті, яка буде використовуватися, від ss до ss + nn.
            Приклад: Виключіть пам'ять із 0x18690000-0x1869ffff
                     memmap = 64K $ 0x18690000
                     або
                     memmap = 0x10000 $ 0x18690000

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


Дякуємо за пораду щодо цих параметрів ядра. Як ви думаєте, ви можете пояснити, чому це така погана ідея, і чому ви не можете перевірити шматок пам'яті, використовуючи ті самі методи, що і memtest86 (+)? Я знаю, що для більш надійного тестування потрібно більше часу процесора (і, ймовірно, більший об'єм оперативної пам'яті за один раз), але чому це повинно бути шоу-пробкою? Час процесора може не скласти проблем, якщо розподіл протягом досить тривалого періоду і, крім того, мультипроцесорний процес стає все більш і більш мейнстрімом.
Waxhead

Добре технічно, якщо це зробити протягом досить тривалого періоду часу, це можливо. Але вузьким місцем тут є не процесори, а шина пам'яті, і звичайно ви "отруюєте" кеш пам'яті вашого процесора. Я не знав про такий модуль ядра, і ця ідея виглядає дуже крихкою для мене (оркестрування повторного запису шаблону до довільної області пам'яті в живій системі тощо)
haimg

haimg: питання: чи буде VFS керувати пейджингом для цієї зарезервованої пам'яті? я думаю, що не може, оскільки це не буде видно.
Jay D

1
@Waxhead Очищення пам'яті зазвичай проводиться на рівні BIOS за допомогою апаратних засобів. Якщо це ввімкнено, вам слід знайти варіанти очищення патруля та вимагати скрабування. Якщо для вас важлива цілісність пам’яті, яка, безумовно, є, якщо ви використовуєте пам’ять ECC, тоді невеликий хіт продуктивності, отриманий завдяки включенню цих параметрів, вартий варто.
Ян

1
Я думаю, що може бути цікаво включити сюди посилання на модуль ядра badram . Він використовує memtest86, як ви пропонуєте, але замість того, щоб утримувати ядро ​​від використання поганої пам'яті, він виділяє його для ядра не використовувати, фактично гарантуючи, що ні ядро, ні ваші програми не працюють в цій пам'яті.
Cimbali

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 і знайти "скраб".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.