- CPU стресс-тест в Linux, как нагрузить все ядра микропроцессора
- Утилизация мощности двух ядер CPU (40%+70%)
- Наблюдаем за нагрузкой отдельных ядер CPU
- Утилизация 100% мощности одного или нескольких ядер CPU
- Другие связки из простых команд для загрузки ЦПУ
- Грузим процессор на 100% используя pbzip2
- Stress — пакет комплексных нагрузочных тестов ПК
- В заключение
- Отключить/включить ядра CPU в Linux
- Распределить рабочую нагрузку между различными процессорами
CPU стресс-тест в Linux, как нагрузить все ядра микропроцессора
Иногда возникает необходимость выполнить частичную или полную загрузку микропроцессора на персональном компьютере или сервере. Это может понадобиться для стресс-тест системы, для проверки стабильности работы, оценки эффективности системы охлаждения и измерения потребляемой компьютером или сервером мощности под нагрузкой.
В статье приведены конструкции из простых и всегда доступных консольных команд в 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», которая должна быть знакома почти каждому системному администратору. Если у вас она не установлена то исправить ситуацию можно командой:
Для запуска этого консольного монитора ресурсов используем одноименную команду:
Ниже приведен пример работы этого консольного монитора ресурсов, загружены два ядра все той же связкой из команд dd и bzip2.
Рис. 2. Мониторинг нагрузки двух ядер CPU в GNU Linux используя HTOP.
Что же означают в HTOP красные и зеленые отметки в прогресс-барах для ядер CPU? — все проще простого:
- зеленый цвет — количество ресурсов процессора, выделенные под процессы с нормальным приоритетом;
- красный цвет — ресурсы CPU, выделяемые процессам с приоритетом ядра.
О том как узнать частоту установленного микропроцессора(ров), режимы работы ядер и другую полезную информацию я писал в одной их предыдущих статей о CPU в GNU Linux.
Утилизация 100% мощности одного или нескольких ядер CPU
Для этой цели можно использовать команды, которые обрабатывают непрерывный поток данных на очень высокой скорости, без периодических колебаний нагрузки как в случае с bzip.
Скажем микропроцессору «yes». только очень много раз!
С виду простая и безобидная команда, а нагрузит она одно ядро CPU примерно на 100% и без скачков. Суть этой конструкции проста: выводим слово «yes» бесконечное количество раз и перенаправляем вывод в «черную дыру» — /dev/null.
Рис. 3. Нагружаем одно ядро CPU на 100% командой yes в GNU Linux.
Другие связки из простых команд для загрузки ЦПУ
Пример с командой «yes» — это наиболее простой и доступный способ нагрузить одно или несколько ядер центрального процессора.
Кроме того, можно поэкспериментировать и с другими командами и программами, которые по умолчанию доступны почти в каждом дистрибутиве GNU Linux.
Суть построения подобных связок из команд следующая:
- Что-то откуда-то беспрерывно считываем и перенаправляем в /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.
А теперь загрузим процессор подсчетом контрольной суммы бесконечного файла с нулями:
В htop мы сможем видеть то же то и на рисунке 3, правда плотность загрузки будет более стабильной.
Грузим CPU просчитывая MD5-сумму бесконечного потока случайных данных:
График загрузки будет идентичен тому что на рисунке 4, микропроцессор загружен процессом, который работает на уровне ядра ОС, очень высокий приоритет.
Грузим процессор на 100% используя pbzip2
В начале статьи был представлен пример с bzip2, которая поотдельности может нагрузит одно ядро микропроцессора. Существует также мультипоточная реализация данного архиватора — pbzip2.
Установить pbzip2 можно командой:
Для нагрузки всех доступных ресурсов процессора достаточно запустить следующую команду:
cat /dev/zero | pbzip2 -c > /dev/null
Вместо источника потока «/dev/zero» можно использовать «/dev/urandom» или же собрать еще более простую конструкцию:
Stress — пакет комплексных нагрузочных тестов ПК
О применении утилиты «stress» в GNU Linux я уже писал в статье о самостоятельном ремонте ПК. Там она использовалась в связке с другими программами для получения такого себе нагрузочного стресс-набора на подобии AIDA64 под Windows.
Этой программой можно нагрузить сразу все доступные ядра CPU или же указать конкретно сколько ядер должны трудиться в поте лица. Для установки пакета ‘stress’ достаточно выполнить команду:
sudo apt-get install stress
Итак, запускаем программу с указанием загрузить 4 ядра микропроцессора:
Результаты производительности приведены ниже.
Рис. 5. Нагружаем все ядра CPU по максимуму на 100% командой stress в GNU Linux.
Рис. 6. Смотрим результат работы программы stress в htop.
В заключение
Как видим, нагрузить отдельное ядро процессора или же несколько ядер даже без установки специального программного обеспечения в GNU Linux — задача вполне реальная. Каждый может выбрать себе связку команд, которую легко запомнить и использовать. К тому же, строить подобные связки зная принцип их работы можно самостоятельно буквально на лету.
Но все же, установив небольшой программный пакет «stress» можно решить задачу комплексно и с дополнительными возможностями. Еще для нагрузки и тестов Linux системы можно использовать мощный комбайн «phoronix-test-suite», который придется ставить отдельно (в репозитории Debian его нет), но это уже другая история.
Отключить/включить ядра CPU в Linux
В Linix вы можете временно включить или отключить ядра процессора без перезагрузки с помощью консольной утилиты chcpu.
Выведите информацию о доступных ядрах:
CPU(s): 3 On-line CPU(s) list: 0-2
В этом примере для гостевой ОС на виртуальной машине Linux доступны три ядра 0, 1 и 2.
В Linux вы можете отключить любые ядра процессора, кроме нулевого (CPU0).
Чтобы отключить ядра 1 и 2, выполните команду:
CPU 1 disabled CPU 2 disabled
Проверьте теперь какие ядра доступны:
On-line CPU(s) list: 0 Off-line CPU(s) list: 1,2
Также можно вывести информацию о доступных процессорах так:
$ grep «processor» /proc/cpuinfo
Чтобы включить ядра процессора, выполните:
CPU 1 enabled CPU 2 enabled
Также вы можете отключить определенное ядро командой. В этом примере мы отключаем CPU1:
$ sudo echo 0 | sudo tee /sys/devices/system/cpu/cpu1/online
Проверьте сообщения в dmseg:
[ 2257.253801] smpboot: CPU 1 is now offline
Чтобы включить его, выполните:
$ sudo echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
Если вы хотите, чтобы Linux всегда загружалась с меньшим количество доступных ядер, нужно настроить параметр ядра maxcpus=N.
N в этом случае – это количество доступных ядер процессора, доступных в Linux.
$ sudo mcedit /etc/default/grub
Измените строку следующим образом:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash maxcpu=2"
Вы можете использовать отключение ядер CPU в Linux, когда нужно уменьшить количество vCPU для виртуальной машины Linux и вы хотите протестировать, как работает операционная система и приложения с меньшим количеством доступных vCPU.
Также в Linux вы можете запускать приложения на определённых ядрах с помощью CPU affinity. Чтобы получить информацию о привязки определенного процесса к ядрам, выполните:
pid 894's current affinity mask: 3
pid 894's current affinity list: 0,1
Этому процессу разрешено выполняться на ядрах 0 и 1.
Чтобы разрешить запушенному процессу выполняться только на CPU0, выполните:
pid 894's current affinity list: 0,1 pid 894's new affinity list: 0
Или, чтобы разрешить процессу firefox использовать ядра с 0 по 3:
$ sudo taskset -c 0-3 firefox
Распределить рабочую нагрузку между различными процессорами
На моем Ubuntu 16.04 я использую программу, которая относительно дорогая с точки зрения использования процессора. Это занимает довольно много времени, и другие задачи (такие как просмотр веб-страниц), как следствие, замедляются. Я искал способ улучшить вычислительную мощность, если это возможно, и в то же время лучше узнать, что происходит на моем ноутбуке.
По этому я обнаружил, что если я спрошу top , программа, которую я запускаю, показывает загрузку процессора на 100%, в то время как при открытии System monitor загрузка процессора составляет только ~25% в Processes Вкладка. В дополнение Resources На вкладке «Системный монитор» отображаются 4 процессора, использование которых для каждого из них изменяется от ~5 до ~100%:
@C:~$ lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 4 On-line CPU(s) list: 0-3 Thread(s) per core: 2 Core(s) per socket: 2 Socket(s): 1 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 142 Model name: Intel(R) Core(TM) i5-7200U CPU @2.50GHz Stepping: 9 CPU MHz: 3099.937 CPU max MHz: 3100,0000 CPU min MHz: 400,0000 BogoMIPS: 5423.81 Virtualization: VT-x L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 3072K NUMA node0 CPU(s): 0-3
Могу ли я что-нибудь сделать, чтобы улучшить ситуацию, например разбавить работу между 4 процессорами? Usinge nice не кажется решением моей ситуации.
Я знаю, что это может быть общий вопрос, который зависит от типа программы, которую я запускаю (скажем, это Python сценарий), но я пытаюсь здесь получить общие знания.