Стресс тест процессора linux. Программы для тестирования Linux. Список пользователей системы хранится в файле

  • 25.01.2022

Иногда возникает необходимость выполнить частичную или полную загрузку микропроцессора на персональном компьютере или сервере. Это может понадобиться для стресс-тест системы, для проверки стабильности работы, оценки эффективности системы охлаждения и измерения потребляемой компьютером или сервером мощности под нагрузкой.

В статье приведены конструкции из простых и всегда доступных консольных команд в GNU Linux, которыми можно нагрузить одно или все ядра процессора. Также рассмотрим компактный но очень мощный пакет для стресс-тестов под Линукс, который можно установить одной командой. Все подробно и с примерами!

Утилизация мощности двух ядер CPU (40%+70%)

Опытный пользователь операционной системы (ОС) GNU Linux не раз сталкивался со случаями когда простая команда с небольшой ошибкой могла загрузить микропроцессор под самую завязку. Этим мы и воспользуемся, только у нас будет все продумано и с конкретной целью.

Сперва рассмотри достаточно интересную связку из двух отдельных команд, соединенных через конвейер (символ "|", перенаправление ввода-вывода).

Dd if=/dev/urandom | bzip2 -9 > /dev/null

Ее суть: читаем случайные данные из файла "/dev/urandom" используя утилитку "dd", через конвейер "|" перебрасываем эти считанные данные программе-архиватору "bzip2", указываем максимальный уровень сжатия (9) и выводим данный в "черную дыру", то есть в никуда - для этого есть специальный файл "/dev/null".

Таким образом, пока команда запущена (прервать ее можно нажав CTRL+C), архиватор будет сжимать непрерывный поток случайных данных и пересылать результат в вечно пустой файл. На физические диски и файловые системы ничего не пишется, а процессору есть немало работы.

Данная связка из команд загрузит два ядра CPU (Central Processor Unit) таким образом:

  • "dd if/dev/urandom" - загрузит одно ядро примерно на 40%;
  • "bzip2 -9" - загрузит второе ядро примерно на 70%.

Для чтобы загрузить дополнительные ядра микропроцессора нужно открыть дополнительные окна терминала и запустить несколько клонов данной команды.

Наблюдаем за нагрузкой отдельных ядер CPU

Для удобного наблюдения за нагрузкой на каждое из ядер микропроцессора можно использовать программу "System Monitor", которая входит в состав рабочего окружения KDE. Программа с похожим функционалом и таким же названием есть и в среде GNOME.

Рис. 1. Мониторим загрузку двух ядер CPU в GNU Linux используя System Monitor из KDE.

На рисунке результат загрузки двух ядер связкой из двух команд которая были рассмотрена выше. Одно ядро - оранжевй график (70%), другое ядро - желтый график (40%).

С такой же задачей, только в консоли, отлично справляется утилита "htop", которая должна быть знакома почти каждому системному администратору. Если у вас она не установлена то исправить ситуацию можно командой:

Sudo apt-get install htop

Для запуска этого консольного монитора ресурсов используем одноименную команду:

Ниже приведен пример работы этого консольного монитора ресурсов, загружены два ядра все той же связкой из команд dd и bzip2.

Рис. 2. Мониторинг нагрузки двух ядер CPU в GNU Linux используя HTOP.

Что же означают в HTOP красные и зеленые отметки в прогресс-барах для ядер CPU? - все проще простого:

  • зеленый цвет - количество ресурсов процессора, выделенные под процессы с нормальным приоритетом;
  • красный цвет - ресурсы CPU, выделяемые процессам с приоритетом ядра.

О том как узнать частоту установленного микропроцессора(ров), режимы работы ядер и другую полезную информацию я писал в одной их предыдущих статей о CPU в GNU Linux .

Утилизация 100% мощности одного или нескольких ядер CPU

Для этой цели можно использовать команды, которые обрабатывают непрерывный поток данных на очень высокой скорости, без периодических колебаний нагрузки как в случае с bzip.

Скажем микропроцессору "yes"...только очень много раз!

Yes > /dev/null

С виду простая и безобидная команда, а нагрузит она одно ядро CPU примерно на 100% и без скачков. Суть этой конструкции проста: выводим слово "yes" бесконечное количество раз и перенаправляем вывод в "черную дыру" - /dev/null.

Рис. 3. Нагружаем одно ядро CPU на 100% командой yes в GNU Linux.

Другие связки из простых команд для загрузки ЦПУ

Пример с командой "yes" - это наиболее простой и доступный способ нагрузить одно или несколько ядер центрального процессора.

Кроме того, можно поэкспериментировать и с другими командами и программами, которые по умолчанию доступны почти в каждом дистрибутиве GNU Linux.

Суть построения подобных связок из команд следующая:

  1. Что-то откуда-то беспрерывно считываем и перенаправляем в /dev/null;
  2. Выполняем бесконечный анализ данных какой-то программой или утилитой.

Следующая связка позволяет загрузить одно ядро под самый потолок:

Cat /dev/zero > /dev/null

Рис. 4. Нагружаем одно ядро CPU по максимуму на 100% командой cat в GNU Linux.

Суть команды: при помощи команды "cat" выполняем вывод бесконечного потока дынных из псевдо-устройства "/dev/zero" (генерирует нули, 000) в пустоту "/dev/null";

Как видим процесс у нас выполняется с высоким приоритетом (приоритет ядра ОС) и требует для выполнения всю вычислительную мощность одного процессорного ядра.

Для считывания данных из файла псевдо-устройства можно использовать программу "dd".

Dd if=/dev/urandom of=/dev/null

Суть команды: с помощью программы "dd" (if - input file, of - output file) читаем поток случайных данных из /dev/urandom и отправляем их в "никуда" - /dev/null.

Результат мониторинга загрузки ядер в HTOP получим такой же как и на рисунке 4.

А теперь загрузим процессор подсчетом контрольной суммы бесконечного файла с нулями:

Sha1sum /dev/zero

В htop мы сможем видеть то же то и на рисунке 3, правда плотность загрузки будет более стабильной.

Грузим CPU просчитывая MD5-сумму бесконечного потока случайных данных:

Md5sum /dev/urandom

График загрузки будет идентичен тому что на рисунке 4, микропроцессор загружен процессом, который работает на уровне ядра ОС, очень высокий приоритет.

Грузим процессор на 100% используя pbzip2

В начале статьи был представлен пример с bzip2, которая поотдельности может нагрузит одно ядро микропроцессора. Существует также мультипоточная реализация данного архиватора - pbzip2.

Установить pbzip2 можно командой:

Apt-get install pbzip2

Для нагрузки всех доступных ресурсов процессора достаточно запустить следующую команду:

Cat /dev/zero | pbzip2 -c > /dev/null

Вместо источника потока "/dev/zero" можно использовать "/dev/urandom" или же собрать еще более простую конструкцию:

Yes | pbzip2 -c > /dev/null

Stress - пакет комплексных нагрузочных тестов ПК

О применении утилиты "stress" в GNU Linux я уже писал в статье о самостоятельном ремонте ПК . Там она использовалась в связке с другими программами для получения такого себе нагрузочного стресс-набора на подобии AIDA64 под Windows.

Этой программой можно нагрузить сразу все доступные ядра CPU или же указать конкретно сколько ядер должны трудиться в поте лица. Для установки пакета "stress" достаточно выполнить команду:

Sudo apt-get install stress

Итак, запускаем программу с указанием загрузить 4 ядра микропроцессора:

Stress --cpu 4

Результаты производительности приведены ниже.

Рис. 5. Нагружаем все ядра CPU по максимуму на 100% командой stress в GNU Linux.

Рис. 6. Смотрим результат работы программы stress в htop.

В заключение

Как видим, нагрузить отдельное ядро процессора или же несколько ядер без установки специального программного обеспечения в GNU Linux - задача достаточно простая. Каждый может выбрать себе связку команд, которую легко запомнить и использовать, к тому же зная принцип работы строить подобные связки самостоятельно можно буквально на лету.

Тем не менее, установив программу "stress" можно решить задачу комплексно и с дополнительными возможностями. Также для нагрузки и тестов можно использовать такой пакет программ как "phoronix-test-suite", но это уже отдельная история...

Мониторинг осуществляется с помощью комплекта программ lm-sensors .


aptitude install lm-sensors

Снимать показания датчиков можно командой:


sensors

В реальном времени мониторинг температуры осуществляется следующей командой:


watch sensors

В выводе команды содержится информация о напряжении, скорости вращения вентилятора, температуре процессора (каждого ядра в отдельности), температуре жёстких дисков. Важным показателем является максимально зафиксированное значение температуры (поле high в показаниях температуры ядра). Мониторить только температуру процессора можно командой:


while {true} do date; sensors | grep Core; echo "======"; sleep 1s; done

Также существуют различные графические утилиты для отображения показаний lm-sensors . Для GNOME удобно использовать апплет GNOME Sensors Applet .

Стресс-тестирование процессора

Пакет cpuburn

Проверка работоспособности драйверов видеокарты

Проверим наличие 3D-ускорения:


glxinfo | grep OpenGL

Вывод должен быть таким:


OpenGL vendor string: Tungsten Graphics, Inc OpenGL renderer string: Mesa DRI Intel(R) G33 GEM 20100330 DEVELOPMENT OpenGL version string: 1.4 Mesa 7.10-devel OpenGL extensions:

Проверим поддержку 3D-ускорения средствами видеокарты:


glxinfo | grep direct

Если поддержка 3D реализована, вывод будет таким:


direct rendering: Yes

Проверим скорость работы 3D:


glxgears

Появится окно с простой 3D-анимацией. В консоль при этом будет каждые 5 секунд выводиться информация о скорости рендеринга. Нормальные значения FPS для настроенного драйвера должны быть в среднем выше 1000 (если включена вертикальная синхронизация, то значение FPS будет ограничено частотой синхронизации).

Ещё один тест OpenGL:


/usr/lib/xscreensaver/glblur -fps

Появится окно скринсейвера, в котором будет отображаться значение FPS.

В случае каких-либо проблем, можно переустановить видеодрайвер (для встроенных видеокарт Intel нужно переустановить пакет xserver-xorg-video-intel ). Настройки драйвера осуществляются программой driconf . Также для контроля работы видеокарты Intel можно установить пакет intel-gpu-tools (в пакет входит утилита intel_gpu_top, позволяющая в реальном времени мониторить загрузку видеопроцессора).

Тестирование производительности системы

Пакет phoronix-test-suite

Тестирование производительности осуществляется программой phoronix-test-suite . Она представляет собой программную оболочку, позволяющую в автоматическом режиме скачивать и запускать различные программы тестирования, собирать и хранить данные о результатах тестов.

Установим программу:


aptitude install phoronix-test-suite

Просмотреть список всех доступных тестов с их кратким описанием можно следующей командой:


phoronix-test-suite list-tests

Тесты запускаются командой:


phoronix-test-suite benchmark ИМЯ_ТЕСТА

  • Процессор :

    • c-ray - многопоточный математический тест. Высокая нагрузка на процессор. Результат на C2D 2.0: 387.55 секунд.

    • build-linux-kernel - сборка ядра Linux. Долгий тест. Равномерно нагружает процессор и память (использует gcc).

    • scimark2 - мощный однопоточный тест (интенсивные научные вычисления). Показывает производительность одного ядра в гигафлопсах.

    • ffmpeg - кодирование видео (тестовые файлы занимают 130MB). На C2D 2.0: 25.99 секунд.


  • Память :

    • ramspeed - тест памяти. Средняя нагрузка на процессор. Результаты DDR2-800 2Gb (copy,int) : 2280.10 MB/s.

    • stream - показывает скорость памяти в различных операциях.


  • Жёсткий диск :

    • iozone - тест жёсткого диска. Показывает скорость чтения и записи для блоков различной длины. Результат WD 80Gb (W,4K,512M): 52.42 MB/s.


  • Графика :

    • gtkperf - тестирование различных элементов графического интерфейса GNOME.

    • unigine-tropics - красивый 3D-бенчмарк, необходимы настроенные драйвера с поддержкой 3D-ускорения.


Для длительного разнопланового тестирования рекомендуется build-linux-kernel . Для короткого стресс-тестирования c-ray (наряду с программой

Прогнал я тест Linpack и задумался: а не пора ли мне поменять термопасту на своём ноутбуке?

Да, по результатам нескольких тестов подряд (не буду захломлять статью картинками) видно, что процессор уходит в троттлинг (пропуск тактов и сброс частоты при нагреве), но вот, как быстро он начинает это делать?

Стресстест процессора в терминале Linux

Задавшись этим вопросом и поискав в интернете утилиты, я понял, что основная проблема в решении поставленной мной задачи - одновременный запуск, как минимум пары утилит и разбегающиеся глаза в двух окнах... И я пришёл к выводу, что мне больше подходит консольный вариант, нежели разноцветные окна открытых программ.

Начал я с sysbench:

sudo apt install sysbench

sysbench --num-threads=4 --test=cpu --cpu-max-prime=100000 run

  • --num-threads=4 - это количество потоков, у меня двухъядерный четырёхпотоковый Intel® Core™ i7-640M, поэтому 4;
  • --cpu-max-prime=100000 - это максимальное количество выполненных операций, я выставил в 100000, т.к. по умолчанию - 10000, слишком быстро завершают тест.

Потом я перешёл на Linpack. Так как процессор у меня от Intel и я имею некоторую долю лени (лень - двигатель прогресса), то я взял, скачал и распаковал готовый Intel-овский Linpack , предварительно создав в домашнем каталоге директорию linpack:

mkdir ./linpack
cd ./linpack
wget http://registrationcenter-download.intel.com/akdlm/irc_nas/9752/l_mklb_p_2018.3.011.tgz
tar -xvzf ./l_mklb_p_2018.3.011.tgz

Для AMD процессоров такой вариант я бы не стал пробовать, так как компилятор от Intel вставляет закладки, проверяющие процессор и если он не Intel...ну, подумаешь сотню-другую лишних инструкций процессор выполнит и заведомо проиграет в производительности. Для AMD лучше собрать Linpack из исходников, например, из этих . В данной статье сборку из исходников рассматривать не буду - читайте README в source code.

Вернёмся к Intel-овскому Linpack-у. Там много чего лишнего и мне не нужного, а то, что нужно рассмотрю относительно версии 2018.3.011. Сразу же перейду в нужную директорию, чтоб потом не набирать длинные команды:

cd ./l_mklb_p_2018.3.011/benchmarks_2018/linux/mkl/benchmarks/linpack

Так как по умолчанию Intel-овский Linpack заточен под тестирование серверных Xeon-ов, создадим свой файл, который будет использоваться в качестве входных опций - просто уменьшим количество тестов, иначе устанем "пару-тройку дней" ждать завершения теста. У меня Linux Mint LMDE 3, поэтому я использую текстовый редактор xed, да и нравится он мне бОльшим функционалом, особенно, когда из-под root-а его запускать - он цвет на красный меняет. И так, создаём в этой же директории, в которую перешли, файл, например, my_test:

И в созданный файл копируем следующее содержимое:

Shared-memory version of Intel(R) Distribution for LINPACK* Benchmark. *Other names and brands may be claimed as the property of others.
Sample data file lininput_xeon64.
5 # number of tests
1000 2000 5000 10000 20000 # problem sizes
1000 2000 5008 10000 20000 # leading dimensions
4 2 2 2 1 # times to run a test
4 4 4 4 4 # alignment values (in KBytes)

Ну, и собственно запуск Linpack с созданным файлом:

./xlinpack_xeon64 -i ./my_test

./xlinpack_xeon64 ./my_test

Можно ещё заюзать stress-ng или stress, но поставленной мной задачи это всё-равно не решает. Вывода температуры, частот и времени от начала старта эти утилиты мне не показывают.

Температуру может показать sensors - подробнее про установку этой утилиты . И эта утилита понадобится в дальнейшем рассмотрении моего вопроса. Линукс - велик и могуч: одна и та же задача может решаться по-разному. За Си мне лень было браться и я написал недостающую мне часть на BASH, ибо строк получилось не так уж и много. Без установленной sensors мой скрипт работать не будет. Фиксацию троттлинга естесственно не стал писать - его и так будет видно по сбросу частоты и температуре. Вот сам скрипт:

#!/bin/bash
out=0 # переменная контроля за тестовым процессом
pid_test="tty" # PID тестового процесса (сделан существующей директорией, чтоб запускать без аргументов)
cpus_num=$(cat /proc/cpuinfo | grep -ci "processor") # количество процессоров/ядер/потоков
echo -en "\033[?25l" 1>&2 # скрыть курсор
echo -en "\033[^:]*: //g" | sort -u # вывод модели процессора
echo -en "\033=$(sensors | sed "/Core ""$i""/!d;s/.*crit = +\(.*\)[.]°C).*/\1/")
if [ -n "${cpu_crit_temp[i]}" ]
then
let cpu_red_temp[i]=cpu_crit_temp[i]-10
let cpu_yel_temp[i]=cpu_crit_temp[i]-30
cpu_min_temp[$i]=1000
cpu_max_temp[$i]=0
fi
done
start_time=$(cat /proc/uptime | sed "s/[.] .*$//") # время запуска
if [ -n "$1" ]
then
script_pid="$$"
(if ! $@ > "$0_out" 2>&1 # запуск тестового файла
then
kill -s SIGABRT $script_pid # послать сигнал основному скрипту об отказе запуска
fi 2>/dev/null)&
pid_test="$!" # PID тестового процесса
fi
while (true) # контроль температуры
do
for ((i=0; i<$cpus_num; i++))
do
cpu_freq[$i]=$(cat /sys/devices/system/cpu/cpu${i}/cpufreq/scaling_cur_freq | sed "s/...$//")
cpu_temp[$i]=$(sensors | sed "/Core ""$i""/!d;s/.*+\(.*\)[.]°C[ \t]*(.*/\1/")
if [ -n "${cpu_temp[i]}" ]
then
((${cpu_temp[i]} < ${cpu_min_temp[i]})) && cpu_min_temp[$i]=${cpu_temp[i]}
if ((${cpu_temp[i]} > ${cpu_max_temp[i]}))
then
cpu_max_temp[$i]=${cpu_temp[i]}
time_max[$i]=$(cat /proc/uptime | sed "s/[.] .*$//")
let time_max[i]=time_max[i]-start_time
fi
if ((${cpu_temp[i]} > ${cpu_red_temp[i]}))
then
echo -en "cpu${i}:\t"
echo -en "\033} "
echo -en "\033}"
echo -en "\033}"
echo -en "\033} > ${cpu_yel_temp[i]}))
then
echo -en "cpu${i}:\t"
echo -en "\033} "
echo -en "\033}"
echo -en "\033}°C; max: "
echo -en "\033}"
echo -en "\033}sec) "
else
echo -en "cpu${i}:\t"
echo -en "\033} "
echo -en "\033}"
echo -en "\033}°C; max: "
echo -en "\033}"
echo -en "\033}sec) "
fi
else
echo -en "cpu${i}:\t"
echo -en "\033} "
echo -en "\033 .*$//")
let time=time-start_time
echo -en "Time:\t$time sec. "
[ ! -d "/proc/${pid_test}" ] && break # выход по окончании теста (лучший способ контроля по comm и cmdline, но...лень)
[ "$out" != "0" ] && break # выход при ошибке теста
echo -en "\033[${i}A\r" 1>&2 # перенос курсора вверх на $i строк и на начало строки
sleep 0.1 # пауза, чтоб вывод частот сильно не скакал
done
echo ""
echo -en "\033[?25h" 1>&2 # включение курсора
if [[ "$out" == "0" && -n "$1" ]]
then

rm -fR "$0_out"
exit 0
elif [[ "$out" == "1" && -n "$1" ]]
then
kill -9 "$pid_test" 1>/dev/null 2>/dev/null
cat "$0_out" | sed "/^$/d;/Sample data/d;/CPU frequency/d;/Parameters are set/,/Data alignment value/d"
rm -fR "$0_out"
exit 1
elif [ "$out" == "1" ]
then exit 1
elif [ "$out" == "2" ]
then
echo -en "\033}