По роду деятельности приходится иметь дело с железом, с большим количеством компьютеров разной конфигурации, и, в частности, заниматься их тестированием. Естественно, хочется чтобы этот процесс был автоматизирован на сколько возможно. Для этих целей я использую бездисковую загрузку линукс через PXE, на котором подготовлены к автозапуску соответствующие скрипты с разными тестами, демоны следят за состоянием системы, а мониторинг на сервере показывает результаты и ругается, если что-то не так. В общем-то, всем можно быть довольным, но процесс проверки оперативной памяти никогда мне не нравился. Нативный для линукса memtester, субъктивно, работает слишком долго, прежде чем что-то найдет, да и находит далеко не всегда. Собрать ядро или поиграться с архивами — неплохой способ проверить систему на стабильность, но в глюках не всегда бывает виновата память. А самым действенным способом, в конечном счете, является старый добрый Memtest86. Но с ним необходимо следить за каждым компьютером по отдельности, теряется весь поцесс автоматизации, а когда компьютеров слишком много, то начинает поджимать и время. К сожалению, обделен всякими хитрыми kvm'ами.
Размышляя над этим, я обратил свой взгляд на виртуализацию. Почему бы не попробовать? Хотя бы just for lulz. Память ведь используется таже самая.
Для этих целей в VirtualBox создаем виртуальную машину самой простой конфигурации: без сети, без жестких дисков, только CD-ROM куда подключается образ с MemTest. Создаем с помощью GUI или в консоли:
VBoxManage createvm --name memtest --ostype Linux --register
Подключаем к нашей машине загрузочный образ с Memtest. Я использовал бету пятой версии, скачать можно с официального форума.
VBoxManage storagectl memtest --name "IDE Controller" --add ide
VBoxManage storageattach memtest --storagectl "IDE Controller" --port 0 --device 0 --type dvddrive --medium /home/user/mt500b1.iso
Перед самым запуском вычищаем кеш линукса из памяти:
sudo sync
sudo echo 3 > /proc/sys/vm/drop_caches
Решаем сколько свободной памяти отдадим под проверку, а сколько оставим под нужды операционной системы:
a=`free -m | grep "cache:" | awk {'print $4'}`
b=$(($a*20/100))
free=$(($a - $b))
Если памяти оставить слишком мало, линукс начинает вести себя нестабильно, тем более бездисковая система, где нет свопа.
Пятая версия мемтеста поддерживает многоядерность, воспользуемся этим и отдадим под тест сколько не жалко:
cpus=$((`lscpu | grep "Core(s) per socket:" | awk {'print $4'}`*`lscpu | grep "Thread(s) per core:" | awk {'print $4'}`-1))
if [ $cpus -lt 1 ]; then
cpus=1
fi
Вносим соответствующие изменения в машину:
VBoxManage modifyvm memtest --memory $free --cpus $cpus --ioapic on
И запускаем в фоне в консольном режиме:
VBoxManage startvm memtest --type headless
Выключить виртуальную машину можно командой:
VBoxManage controlvm memtest poweroff
За состоянием теста следим с помощью отладчика VirtualBox:
VBoxManage debugvm memtest info vgatext
Пример вывода в терминал:
--------------------------------------------------------------------------------
Memtest86+ 5.00b1 | Intel(R) Pentium(R) CPU G620 @ 2.60GHz
CLK: 2600 MHz (X64 Mode) | Pass 10% ###
L1 Cache: 64K 39386 MB/s | Test 4% #
L2 Cache: 6144K 50971 MB/s | Test #6 [Moving inversions, random pattern]
L3 Cache: None | Testing: 0K - 32M 32M of 1853M
Memory : 1853M 14939 MB/s | Pattern: e2e5e6e8 R | Time: 0:00:16
------------------------------------------------------------------------------
Core#: 0 | RAM: 0 MHz (DDR3- 0) - BCLK: 650
State: - | Timings: CAS 0-0-0-0 @ 64-bit Mode
Cores: 1 Active / 1 Total (Run: All) | Pass: 0 Errors: 0
------------------------------------------------------------------------------
S. S.
(ESC)exit (c)configuration (SP)scroll_lock (CR)scroll_unlock
--------------------------------------------------------------------------------
Теперь достаточно распарсить вывод в терминал любым удобным способом, чтобы узнать время, количество проходов, найденные ошибки, и другую интересную информацию. И соответственно написать под это дело управляющие скрипты, ради чего все и задумывалось.
Например, у меня при наличии ошибки в лог пишется «снимок» экрана, а на сервер отправляется соответствующее предупреждение:
if [[ `VBoxManage debugvm memtest info vgatext | grep Errors: | awk {'print $13'}` > 0 ]];then
"$path"/sendmess flog "`VBoxManage debugvm memtest info vgatext`"
"$path"/sendmess nonstoperr "[error] Memtest"
sleep 15
fi
Я запустил это дело тестироваться на нескольких компьютерах с не самой качественной памятью, и результат не заставил себя долго ждать:
--------------------------------------------------------------------------------
Memtest86+ 5.00b1 | Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz
CLK: 3383 MHz (X64 Mode) | Pass 7% ##
L1 Cache: 64K 51253 MB/s | Test 77% ##############################
L2 Cache: 6144K 51253 MB/s | Test #5 [Moving inversions, 8 bit pattern]
L3 Cache: None | Testing: 2048M - 3042M 994M of 3042M
Memory : 3042M MB/s | Pattern: 80808080 | Time: 0:00:38
------------------------------------------------------------------------------
Core#: 012 | RAM: 0 MHz (DDR3- 0) - BCLK: 845
State: --- | Timings: CAS 0-0-0-0 @ 64-bit Mode
Cores: 3 Active / 3 Total (Run: All) | Pass: 0 Errors: 2
------------------------------------------------------------------------------
Tst Pass Failing Address Good Bad Err-Bits Count CPU
--- ---- ----------------------- -------- -------- -------- ----- ----
3 0 0004396be2c - 1081.6MB 02020202 02020206 00000004 1 1
3 0 0004396bd3c - 1081.6MB 02020202 0202020a 00000008 2 1
(ESC)exit (c)configuration (SP)scroll_lock (CR)scroll_unlock
--------------------------------------------------------------------------------
Для подтверждения, перезапускаю Memtest в нормальном режиме:
Способ на удивление работает. Поэтому использую его для себя наравне с другими. Таким образом получилось выявить уже много планок памяти с ошибками.
Плюсы:
- Это старый добрый Memtest с радующим глаз интерфейсом.
- Возможность полной автоматизации его работы.
- Имеем соответсвующую эффективность.
Есть конечно и минусы:
- Память не тестируется полностью, а только ее часть.
- Этот способ сам по себе может привести к нестабильной работе системы. Редко, но бывает, к сожалению.
Надеюсь, кто-то найдет статью полезной. Ну, или по крайней мере улыбнется.
Автор: rommas