С чего начать Первые шаги трек · 15 ступеней
Linux Labs

stress-ng — нагрузка на процессор, память и диск по таймеру

8 мин stress-ng 0.17 · Ubuntu 24.04

stress-ng создаёт нагрузку на процессор, память и диск на заданное время — для опытов с load, OOM и диском.

Шпаргалка

9 команд Версия для печати
  • stress-ng --cpu 2 --timeout 60s 2 процесса грузят CPU
  • stress-ng --cpu 1 --cpu-load 30 -t 30s один процесс на 30 %
  • stress-ng --vm 1 --vm-bytes 128M -t 30s занять 128 МиБ памяти
  • stress-ng --hdd 1 --hdd-bytes 64M -t 30s --temp-path /var/tmp
  • stress-ng --io 1 -t 30s sync() по кругу
  • stress-ng --cpu 1 -t 10s --metrics-brief с итоговой таблицей
  • nice -n 19 stress-ng --cpu 1 -t 60s & фоном, уступая другим
  • sudo systemd-run --unit=lab-vm -p MemoryMax=96M \
  • stress-ng --vm 1 --vm-bytes 160M -t 20s в своей cgroup

Обзор

stress-ng запускает рабочие процессы — стрессоры. Каждый нагружает свою часть системы: --cpu считает, --vm занимает и перебирает память, --hdd пишет файлы, --io вызывает sync(). Число после ключа — сколько рабочих процессов запустить. На машине тренажёра — версия 0.17.

--timeout (-t) ограничивает время работы. Без него stress-ng работает сутки:

text
student@ubuntu:~$ stress-ng --cpu 1
stress-ng: info:  [1994] defaulting to a 1 day, 0 secs run per stressor

В ps и top главный процесс называется stress-ng, рабочие — stress-ng-cpu, stress-ng-vm и так далее. Главный только раздаёт работу: процессор и память тратят рабочие.

Вывод и код завершения

text
student@ubuntu:~$ stress-ng --cpu 2 --timeout 70s --metrics-brief
stress-ng: info:  [972] setting to a 1 min, 10 secs run per stressor
stress-ng: info:  [972] dispatching hogs: 2 cpu
…
stress-ng: info:  [972] passed: 2: cpu (2)
stress-ng: info:  [972] failed: 0
stress-ng: info:  [972] successful run completed in 1 min, 10.01 secs

--metrics-brief добавил строку для стрессора cpu:

bogo ops real time usr time sys time bogo ops/s (real)
87462 70.00 68.68 0.02 1249.39

Bogo ops — условные операции стрессора: сравнивать их можно только между запусками одного стрессора на одной машине. Два процесса работали 70 секунд на одном процессоре и вместе получили 68.68 секунды usr — каждому досталась половина.

Код Что значит
0 успех
1 ошибка в ключах или во временном каталоге
2 стрессор завершился с ошибкой
3 стрессору не хватило ресурсов — памяти, места
4 стрессор не поддерживается на этой системе
5 стрессор убит неожиданным сигналом

Стрессоры

Ключ Что делает Где видно
--cpu N N процессов считают us в top, load average
--cpu-load P каждый --cpu грузит процессор на P % %CPU процесса
--vm N --vm-bytes S N процессов занимают по S памяти и перебирают её free, RSS
--hdd N --hdd-bytes S N процессов пишут и удаляют файлы по S wa, iostat
--io N N процессов вызывают sync() bo в vmstat

--cpu 0 запускает по процессу на каждый процессор. --vm-bytes можно задать в процентах доступной памяти: --vm-bytes 25%. --vm-keep держит одну и ту же память, не освобождая её между проходами.

stress-ng и OOM

Рабочим процессам stress-ng ставит oom_score_adj 1000: при нехватке памяти oom-killer выберет их первыми. Убитый рабочий процесс главный запускает заново, пока не выйдет время. Ключ --oomable выключает перезапуск: стрессор закончит работу раньше срока, и stress-ng напишет vm: WARNING: finished prematurely after just 0.56 secs.

Ключи

16

Основные ключи — в таблице ниже. Полный список стрессоров — stress-ng --stressors, ключи — stress-ng --help.

Ключ Что делает Пример
-c --cpu N Запустить N процессов, которые считают и грузят процессор; 0 — по одному на каждый процессор. stress-ng --cpu 2 --timeout 60s
-m --vm N Запустить N процессов, которые занимают память и перебирают её. stress-ng --vm 1 --vm-bytes 128M --timeout 30s
--vm-bytes SIZE Сколько памяти занимает каждый процесс --vm (256M по умолчанию); можно в процентах доступной, 25%. stress-ng --vm 1 --vm-bytes 25% --timeout 30s
-t --timeout T Остановиться через T (секунды или 30s, 2m); без него stress-ng работает сутки. stress-ng --cpu 1 --timeout 2m
-l --cpu-load P Грузить процессор каждым процессом --cpu на P процентов вместо полной нагрузки. stress-ng --cpu 1 --cpu-load 30 --timeout 30s
--vm-keep Держать одну и ту же память всё время, не освобождая и не занимая заново. stress-ng --vm 1 --vm-bytes 64M --vm-keep --timeout 30s
-d --hdd N Запустить N процессов, которые пишут и удаляют файлы во временном каталоге. stress-ng --hdd 1 --hdd-bytes 64M --temp-path /var/tmp -t 30s
--hdd-bytes SIZE Сколько данных пишет каждый процесс --hdd (1G по умолчанию). stress-ng --hdd 1 --hdd-bytes 64M --temp-path /var/tmp -t 30s
-i --io N Запустить N процессов, которые по кругу вызывают sync() — сброс кэша на диск. stress-ng --io 1 --timeout 30s
--metrics-brief В конце напечатать таблицу bogo ops и времени по стрессорам. stress-ng --cpu 1 --timeout 10s --metrics-brief
--temp-path DIR Каталог для временных файлов --hdd и других стрессоров; по умолчанию текущий. stress-ng --hdd 1 --temp-path /var/tmp --timeout 30s
--ionice-class CLASS Класс приоритета диска для рабочих процессов — idle, besteffort, realtime. stress-ng --hdd 1 --ionice-class idle --timeout 30s
-q --quiet Не печатать сообщения info. stress-ng --cpu 1 --timeout 30s -q
--oomable Не перезапускать рабочий процесс, которого завершил OOM killer. stress-ng --vm 1 --vm-bytes 160M --oomable --timeout 10s
-v --verbose Печатать всё, включая отладочные сообщения debug. stress-ng --vm 1 --timeout 5s -v
--aggressive Включить самые тяжёлые режимы стрессоров — на общей машине не запускать. опасно stress-ng --cpu 1 --aggressive --timeout 10s

Ничего не найдено. Попробуй запрос короче.

Рецепты

4

Нагрузка, которая не мешает соседям

bash
nice -n 19 stress-ng --cpu 1 --timeout 60s &       # процессор
stress-ng --hdd 1 --hdd-bytes 64M --temp-path /var/tmp \
  --ionice-class idle --timeout 30s                # диск
sudo systemd-run --unit=lab-vm -p MemoryMax=96M \
  stress-ng --vm 1 --vm-bytes 160M --timeout 20s   # память
text
student@ubuntu:~$ ps -o pid,ni,stat,pcpu,comm -C stress-ng-cpu
    PID  NI STAT %CPU COMMAND
   1636  19 RN   97.4 stress-ng-cpu

С nice -n 19 процесс берёт весь свободный процессор (97.4 %) и уступает его любому процессу с обычным приоритетом nice. Память в своей cgroup не трогает остальную машину: OOM случится внутри группы lab-vm (см. oom-killer).

Поднять load average

bash
stress-ng --cpu 3 --timeout 120s &
uptime                    # через минуту, через две

Три рабочих процесса на одном процессоре поднимают load к 3. 1-минутное число дойдёт примерно до 1.9 за минуту и почти до 3 за три (см. load-average).

Получить OOM в cgroup

text
student@ubuntu:~$ sudo systemd-run --unit=lab-vm -p MemoryMax=96M \
  --wait stress-ng --vm 1 --vm-bytes 160M --timeout 10s
Running as unit: lab-vm.service; invocation ID: 95a09070a73e46a6…
Finished with result: oom-kill
Main processes terminated with: code=exited/status=0
Service runtime: 129ms

systemd остановил службу целиком при первом же OOM (OOMPolicy=stop). С -p OOMPolicy=continue служба живёт до конца --timeout, а stress-ng перезапускает убитый рабочий процесс.

Фоном и под присмотром

bash
stress-ng --cpu 2 --timeout 90s -q &   # задание оболочки
jobs; kill %1                          # остановить досрочно
sudo systemd-run --unit=lab-cpu stress-ng --cpu 1 -t 300s
sudo systemctl stop lab-cpu            # остановить юнит

Задание оболочки умрёт вместе с сессией. Юнит systemd-run живёт отдельно от терминала, его видно в systemctl status lab-cpu. Ctrl+C останавливает stress-ng с итогом: главный процесс собирает рабочих и печатает successful run completed.

Неполадки

4

temp-path '.' must be readable and writeable

text
student@ubuntu:/$ stress-ng --hdd 1 --timeout 3s
aborting: temp-path '.' must be readable and writeable

--hdd пишет файлы в текущий каталог, а в / у ученика нет права записи. Укажи --temp-path /var/tmp или перейди в домашний каталог.

gave up trying to mmap, no available memory

Полная строка — vm: gave up trying to mmap, no available memory, skipping stressor. --vm-bytes больше, чем машина может дать (520M при 458 МиБ всего). Стрессор пропущен, код завершения — 3. Уменьши размер или задай его в процентах: --vm-bytes 50%.

stress-ng работает и не заканчивается

Забыт --timeout: по умолчанию прогон длится сутки. Останови Ctrl+C, kill %1 или sudo systemctl stop <юнит> и запусти заново с -t.

Сообщения note и cpu-method в выводе

note: /proc/sys/kernel/sched_autogroup_enabled is 1… и for stable load results, select a specific cpu stress method… — подсказки о точности замеров bogo ops. На нагрузку они не влияют.

Опасно

1

Нагрузка без таймера и лимитов на общей машине

--vm без MemoryMax доводит машину до OOM, и вместе со стрессором могут пострадать соседи. --all, --aggressive и большие N грузят машину так, что на ней тормозит всё, включая твой терминал. На общем сервере — всегда --timeout, nice, ionice и своя cgroup для памяти.

См. также

  • load-average — что показывает load и как он растёт.
  • oom-killer — что происходит, когда память кончилась.
  • system-monitoring — vmstat, mpstat: чем смотреть нагрузку.
  • memory-swap — free, available и swap.
  • processes — nice, renice, ionice.
  • systemd — юниты и systemd-run.
Загрузка…