В Windows уже имеется встроенное средство проверки памяти mdsched, однако, не везде у нас на машинах установлена ОС Windows и не всегда эта утилита позволяет обнаружить ошибку.
mdsched — средство диагностики памяти в Windows
Были случаи, что mdsched ошибку не находил, в отличие от сторонних утилит. В результате вы можете потратить дни на поиск драйверов или переустановку Windows, в то время как реальная причина — физический брак планки RAM, который пропустила встроенная утилита.
Если у вас есть подозрение на сбой оперативной памяти, а mdsched ошибку не показывает, то есть смысл подтвердить или опровергнуть диагноз альтернативной утилитой.
Memtest86+ — это автономный тестер памяти для компьютеров с архитектурой x86 и x86-64. Он обеспечивает более тщательную проверку оперативной памяти, чем тесты памяти, встроенные в BIOS. Memtest86+ может быть загружен и запущен либо непосредственно через BIOS ПК (в режиме Legacy или UEFI), либо через промежуточный загрузчик, поддерживающий 16-битный, 32-битный, 64-битный Linux-протокол или протокол загрузки EFI Handover. Инструмент должен работать на любом процессоре x86 класса Pentium или новее, с 32-битной или 64-битной архитектурой.
https://github.com/memtest86plus/memtest86plus/releases
Для чего тестировать RAM?
Устранение нестабильности ПК
Ошибки памяти — одна из самых распространенных причин вылетов, зависаний и нестабильной работы. Если вы столкнулись с такими проблемами на своем компьютере, тщательная проверка оперативной памяти — вероятно, первое, что нужно сделать. Memtest86+ использует различные алгоритмы для надежного обнаружения неисправностей. Программа покажет вам, исправна ваша оперативная память или нет.
Обеспечение начальной стабильности
Прежде чем начать использовать новый ПК, вводить в эксплуатацию новый сервер или после разгона процессора или оперативной памяти, часто бывает разумно убедиться в отсутствии проблем с памятью. Устранение неполадок в дальнейшем может быть неприятным, затратным и отнимающим много времени.
О Memtest86+
При запуске и во время выполнения тестов Memtest86+ реагирует на следующие клавиши:
- F1 — вход в меню конфигурации
- F2 — переключение использования нескольких ядер процессора (SMP)
- Пробел — переключение блокировки прокрутки (остановка/запуск прокрутки сообщений об ошибках)
- Enter — прокрутка одного сообщения (только когда включена блокировка прокрутки)
- Escape — выход из теста и перезагрузка компьютера
Обратите внимание, что тестирование приостанавливается, когда включена блокировка прокрутки и область прокрутки заполнена.
Меню конфигурации позволяет пользователю:
выбрать, какие тесты запускать (по умолчанию: все тесты)
- ограничить диапазон адресов, на котором выполняются тесты (по умолчанию: вся память)
- выбрать режим последовательности работы ЦП (по умолчанию: параллельный)
- parallel — каждое ядро процессора работает параллельно над частью тестируемой области памяти
- sequential — каждое ядро процессора работает по очереди над всей тестируемой областью памяти
- round robin — одно ядро процессора работает над всей тестируемой областью памяти, при этом для каждого теста выбирается новое ядро (по круговому принципу)
- выбрать режим отчета об ошибках (по умолчанию: индивидуальные ошибки)
только количество ошибок
- сводка ошибок
- индивидуальные ошибки
- шаблоны BadRAM
- Linux memmap
- bad pages
- выбрать, какие из доступных ядер ЦП используются (только при запуске)
- максимум можно выбрать 256 ядер ЦП из-за ограничений памяти и дисплея
- загрузочный процессор (BSP) не может быть отменен
- включить или отключить отображение температуры (только при запуске)
- включить или отключить трассировку загрузки для отладки (только при запуске)
- перейти к следующему тесту (во время выполнения тестов)
Во всех случаях цифровые клавиши могут использоваться как альтернатива функциональным клавишам (1 = F1, 2 = F2, ... 0 = F10).
Подход к тестированию
Существует много хороших подходов к тестированию памяти. Однако многие тесты просто записывают в память некие шаблоны, не имея особого представления об архитектуре памяти или о том, как лучше всего обнаруживать ошибки. Такой подход хорошо работает для выявления явных (жестких) отказов памяти, но мало помогает для поиска перемежающихся (временных) ошибок. Тесты памяти, встроенные в BIOS, бесполезны для обнаружения перемежающихся ошибок.
Чипы памяти состоят из большого массива плотно упакованных ячеек памяти, по одной на каждый бит данных. Подавляющее большинство перемежающихся отказов является результатом взаимодействия между этими ячейками памяти. Часто запись в одну ячейку памяти может привести к тому, что одна из соседних ячеек будет записана теми же данными. Эффективный тест памяти должен пытаться выявить такое состояние. Поэтому идеальная стратегия тестирования памяти выглядела бы следующим образом:
- записать ноль в ячейку;
- записать единицы во все соседние ячейки один или несколько раз;
- проверить, что в первой ячейке по-прежнему ноль.
Должно быть очевидно, что эта стратегия требует точного знания того, как ячейки памяти расположены на кристалле. Кроме того, существует бесконечное множество возможных вариантов компоновки кристаллов для разных типов чипов и разных производителей, что делает эту стратегию непрактичной. Однако существуют тестовые алгоритмы, которые могут приблизиться к этой идеальной стратегии.
Memtest86+ использует два алгоритма, которые обеспечивают разумное приближение к описанной выше идеальной стратегии тестирования. Первая из этих стратегий называется «движущиеся инверсии» (moving inversions). Тесты с движущимися инверсиями работают следующим образом:
- Заполнить память шаблоном (паттерном).
- Начиная с младшего адреса:
2.1. проверить, что шаблон не изменился;
2.2. записать инверсию (дополнение) шаблона;
2.3. увеличить адрес;
2.4. повторять шаги 2.1–2.3. - Начиная со старшего адреса:
3.1. проверить, что шаблон не изменился;
3.2. записать инверсию шаблона;
3.3. уменьшить адрес;
3.4. повторять шаги 3.1–3.3.
Этот алгоритм является хорошим приближением к идеальному тесту памяти, но у него есть некоторые ограничения. Большинство современных чипов с высокой плотностью хранения работают с данными шириной от 4 до 16 бит. В чипах шириной более одного бита невозможно выборочно считать или записать только один бит. Это означает, что мы не можем гарантировать, что все соседние ячейки были проверены на взаимодействие. В этом случае лучшее, что мы можем сделать, — использовать некоторые шаблоны, чтобы гарантировать, что все соседние ячейки были по крайней мере записаны со всеми возможными комбинациями нулей и единиц.
Также можно заметить, что кэширование, буферизация и внеочередное выполнение команд будут мешать алгоритму движущихся инверсий и делать его менее эффективным. Кэширование можно отключить, но буферизацию памяти в новых высокопроизводительных чипах отключить невозможно. Чтобы устранить это ограничение, был создан новый алгоритм под названием Modulo-20. Этот алгоритм не подвержен влиянию кэширования или буферизации. Алгоритм работает следующим образом:
Для начальных смещений от 0 до 19 выполнить:
- Записать шаблон в каждую 20-ю ячейку.
- Записать инверсию шаблона во все остальные ячейки.
- Повторить шаг 2 один или несколько раз.
- Проверить каждую 20-ю ячейку на наличие шаблона.
Этот алгоритм обеспечивает почти тот же уровень проверки смежных ячеек, что и движущиеся инверсии, но на него не влияют кэширование и буферизация. Поскольку отдельные проходы записи (шаги 1, 2) и проход чтения (шаг 4) выполняются для всей памяти, мы можем быть уверены, что все буферы и кэш были сброшены между проходами. Выбор 20 в качестве шага (страйда) был несколько произвольным. Бо́льшие шаги могут быть более эффективными, но потребуют больше времени на выполнение. Выбор 20 показался разумным компромиссом между скоростью и тщательностью.
Тесты
Тест 0: Тест адресации, «walking ones», без кэша
В каждой области памяти по очереди проверяет все биты адреса, используя шаблон адресации «walking ones» (один бит «1», остальные «0»). Ошибки из этого теста не учитываются в шаблонах BadRAM, областях memmap и bad-страницах.
Тест 1: Тест адресации, собственный адрес в окне
В каждой области памяти по очереди записывает в каждый адрес его собственный адрес, а затем проверяет каждый адрес на соответствие. Этот тест выполняется последовательно на каждом доступном ядре ЦП, независимо от выбранного пользователем режима последовательности работы ядер.
Тест 2: Тест адресации, собственный адрес + окно
Во всех областях памяти записывает в каждый адрес его собственный виртуальный адрес плюс номер окна (для 32-битных образов) или собственный физический адрес (для 64-битных образов), а затем проверяет каждый адрес на соответствие. Это позволяет обнаружить ошибки в старших битах адреса, которые были бы пропущены при поочередном тестировании каждого окна. Тест выполняется последовательно на каждом доступном ядре ЦП, независимо от выбранного пользователем режима.
Тест 3: Движущиеся инверсии, все единицы и все нули
В каждой области памяти по очереди и для каждого шаблона по очереди использует алгоритм движущихся инверсий с шаблонами из всех единиц и всех нулей.
Тест 4: Движущиеся инверсии, 8-битный шаблон
В каждой области памяти по очереди и для каждого шаблона по очереди использует алгоритм движущихся инверсий с 8-битными шаблонами «walking ones» и «walking zeros».
Тест 5: Движущиеся инверсии, случайный шаблон
В каждой области памяти по очереди и для каждого шаблона по очереди использует алгоритм движущихся инверсий с шаблонами из случайного числа и его инверсии. Случайное число меняется при каждом проходе, поэтому многократные проходы повышают эффективность.
Тест 6: Движущиеся инверсии, 32/64-битный шаблон
В каждой области памяти по очереди и для каждого шаблона по очереди использует алгоритм движущихся инверсий с 32-битными (в 32-битных сборках) или 64-битными (в 64-битных сборках) шаблонами «walking ones» и «walking zeros». В отличие от предыдущих тестов, шаблон циклически сдвигается на 1 бит на каждом последующем адресе.
Тест 7: Блочное перемещение, 64 перемещения
Этот тест нагружает память с помощью инструкций блочного перемещения (movs) и основан на тесте burnBX Роберта Редельмайера. В каждой области памяти по очереди память инициализируется сдвигающимися шаблонами, которые инвертируются каждые 8 байт. Затем блоки памяти перемещаются с помощью инструкции movs. После завершения перемещений проверяются шаблоны данных. Поскольку данные проверяются только после завершения перемещений, невозможно определить, где именно произошла ошибка. Сообщаемые адреса указывают только то место, где был найден неверный шаблон. Следовательно, ошибки из этого теста не учитываются в шаблонах BadRAM, областях memmap и bad-страницах.
Тест 8: Последовательность случайных чисел
В каждой области памяти по очереди записывает в каждый адрес случайное число, затем проверяет каждый адрес на соответствие и записывает инверсию исходных данных, затем снова проверяет каждый адрес на соответствие.
Тест 9: Modulo 20, случайный шаблон
В каждой области памяти по очереди и для каждого шаблона по очереди использует алгоритм Modulo-20 с шаблонами из случайного числа и его инверсии. Случайное число меняется при каждом проходе, поэтому многократные проходы повышают эффективность.
Тест 10: Тест выцветания битов, 2 шаблона
Во всех областях памяти и для каждого шаблона по очереди инициализирует каждую ячейку памяти шаблоном, затем делает паузу на некоторое время, после чего проверяет каждую ячейку памяти на соответствие. Тест выполняется с шаблонами из всех нулей и всех единиц.


