Как ограничить использование процессора с помощью CPULimit в Ubuntu Linux

Команда предназначена для ограничения использования процессора определенным процессом в Linux, не допуская превышения заданного порога. Это может быть особенно полезно для управления системными ресурсами и предотвращения монополизации процессорного времени одним процессом, что может привести к снижению общей производительности системы. Указав желаемый предел использования процессора в процентах, пользователи могут накладывать ограничения на запущенные процессы или инициировать новые в условиях контролируемого потребления процессора. Инструмент посылает сигналы SIGSTOP и SIGCONT целевому процессу, приостанавливая и возобновляя его для поддержания заданного лимита использования.

1 Предварительное примечание

Этот учебник был протестирован на Ubuntu 24.04, но он также работает и на более старых версиях Ubuntu.

2 Установка CPULimit

Для начала нам нужно установить cpulimit следующим образом:

sudo apt update
sudo apt install cpulimit

3 Ограничение использования процессора

Теперь мы проверим, как утилита ограничивает использование процессора. Для этого мы сначала проверим использование процессора без CPUlimit, а затем применим CPUlimit для его оценки. Поясним это на примере.

  1. Вот пример использования процессора приложением на одноядерном процессоре:
dd if=/dev/zero of=/dev/null &

Запуск dd в фоновом режиме

Затем мы проверим использование процессора с помощью команды:

top
top - 11:24:18 up 49 min,  1 user,  load average: 0.94, 1.02, 1.79
Tasks: 249 total,   2 running, 247 sleeping,   0 stopped,   0 zombie
%Cpu(s): 13.4 us, 11.6 sy,  0.0 ni, 74.9 id,  0.0 wa,  0.1 hi,  0.0 si,  0.0 st
KiB Mem:   1010540 total,   271652 used,   738888 free,    21760 buffers
KiB Swap:  1048572 total,        0 used,  1048572 free.   158204 cached Mem

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
1850 root      20   0    7224    616    520 R 100.0  0.1   1:20.33 dd
1851 root      20   0   24952   1756   1180 R   0.3  0.2   0:00.03 top
1 root      20   0   33480   2776   1456 S   0.0  0.3   0:05.31 init
2 root      20   0       0      0      0 S   0.0  0.0   0:00.01 kthreadd

Как мы видим, загрузка процессора достигла 100%. Теперь мы будем использовать cpulimit, чтобы ограничить использование процессора. Мы можем вывести этот процесс на передний план, используя fg и отмените команду с помощью CTRL+C

fg
Верните процесс на передний план с помощью команды fg

Теперь мы можем протестировать cpulimit, чтобы проверить, делает ли он то, что должен. Давайте протестируем его следующим образом:

cpulimit -l 30 dd if=/dev/zero of=/dev/null &
root@server1:~# cpulimit -l 30 dd if=/dev/zero of=/dev/null &
[1] 1852
root@server1:~# Обнаружен процесс 1853[1]+ Выполнено cpulimit -l 30 dd if=/dev/zero of=/dev/null
root@server1:~#

Теперь мы проверим использование процессора с помощью команды top:

top
top – 11:30:54 up 55 min, 1 пользователь, средняя нагрузка: 0.20, 0.58, 1.34
Задачи: всего 250, 2 запущены, 247 спят, 1 остановлены, 0 зомби
%Cpu(s): 4.5 us, 4.1 sy, 0.0 ni, 91.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1010540 всего, 271944 используется, 738596 свободно, 21816 буферов
KiB Swap: 1048572 всего, 0 используется, 1048572 свободно. 158212 кэш-памятиPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1853 root 20 0 7224 612 520 T 33.8 0.1 0:35.53 дд
1 root 20 0 33480 2776 1456 S 0.0 0.3 0:05.37 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0

Теперь вы можете видеть, что использование процессора снизилось со 100% до 33,8%, почти 30%. Таким образом, мы успешно проверили утилиту cpulimit, которая может ограничить потребление процессора в одноядерном дистрибутиве Ubuntu.

  1. Вот пример использования процессора приложением на многоядерном процессоре:

Чтобы проверить ядро процессора, выполните команду:

nproc

В моем случае количество ядер процессора составило 4.
Теперь мы проверим использование процессора без cpulimit на всех 4 ядрах для приложения следующим образом:

for j in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done

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

root@server1:~# for j in `seq 1 4`; do dd if=/dev/zero of=/dev/null & done
[1] 1263
[2] 1264
[3] 1265
[4] 1266
root@server1:~#

Теперь проверьте использование процессора с помощью команды top:

top
top – 11:47:45 up 4 min, 1 user, load average: 3.63, 1.53, 0.57
Задачи: 290 всего, 5 запущенных, 285 спящих, 0 остановленных, 0 зомби
%Cpu0 : 48.3 us, 51.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu1 : 47.8 us, 52.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 53.3 us, 46.4 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu3 : 52.0 us, 48.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1010540 всего, 209712 используется, 800828 свободно, 20276 буферов
KiB Swap: 1048572 всего, 0 используется, 1048572 свободно. 93632 кэш-памятиPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1263 root 20 0 7224 612 520 R 100.0 0.1 2:21.40 дд
1264 root 20 0 7224 616 520 R 100.0 0.1 2:21.41 дд
1265 root 20 0 7224 612 520 R 99.0 0.1 2:21.03 дд
1266 root 20 0 7224 616 520 R 98.0 0.1 2:20.82 дд
1281 root 20 0 104416 3992 2920 S 1.0 0.4 0:00.03 sshd
1283 root 20 0 104416 3988 2920 S 1.0 0.4 0:00.03 sshd
1279 root 20 0 104556 4008 2924 S 0.7 0.4 0:00.08 sshd

Команда dd потребляет почти 100 % процессора всех ядер. Далее мы проверим команду с помощью утилиты cpulimit. Для этого уничтожим предыдущие трассы для команды dd следующим образом:

killall dd
root@server1:~# killall dd
[1] Завершено dd if=/dev/zero of=/dev/null
[3]- Завершено dd if=/dev/zero of=/dev/null
[2]- Завершено dd if=/dev/zero of=/dev/null
[4]+ Завершено dd if=/dev/zero of=/dev/null
root@server1:~#

Теперь используйте cpulimit с той же командой следующим образом:

for j in `seq 1 4`; do cpulimit -l 20 dd if=/dev/zero of=/dev/null & done
root@server1:~# for j in `seq 1 4`; do cpulimit -l 20 dd if=/dev/zero of=/dev/null & done
[1] 1429
[2] 1430
[3] 1431
[4] 1432
root@server1:~# Обнаружен процесс 1434
Обнаружен процесс 1433
Обнаружен процесс 1437
Обнаружен процесс 1439[1] Выполнено cpulimit -l 20 dd if=/dev/zero of=/dev/null
[2] Выполнено cpulimit -l 20 dd if=/dev/zero of=/dev/null
[3]- Выполнено cpulimit -l 20 dd if=/dev/zero of=/dev/null
[4]+ Готово cpulimit -l 20 dd if=/dev/zero of=/dev/null
root@server1:~#

Теперь проверьте использование процессора с помощью утилиты cpulimit.

top
top – 11:59:10 up 16 min, 2 пользователя, средняя загрузка: 0.47, 0.71, 0.81
Задачи: всего 256, 2 запущены, 251 спят, 3 остановлены, 0 зомби
%Cpu0 : 2.0 us, 2.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 26.2 us, 22.8 sy, 0.0 ni, 50.7 id, 0.0 wa, 0.3 hi, 0.0 si, 0.0 st
%Cpu2 : 14.0 us, 12.3 sy, 0.0 ni, 73.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 13.3 us, 11.6 sy, 0.0 ni, 75.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 1010540 всего, 204064 используется, 806476 свободно, 20408 буферов
KiB Swap: 1048572 всего, 0 используется, 1048572 свободно. 98340 кэш-памятиPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1433 root 20 0 7224 612 520 T 28.2 0.1 0:12.00 дд
1439 root 20 0 7224 616 520 R 26.6 0.1 0:12.13 дд
1434 root 20 0 7224 612 520 T 25.3 0.1 0:11.97 дд
1437 root 20 0 7224 612 516 T 22.9 0.1 0:11.93 дд
7 root 20 0 0 0 0 S 0.3 0.0 0:00.22 rcu_sched
8 root 20 0 0 0 0 S 0.3 0.0 0:00.21 rcuos/0

Как вы можете видеть выше, использование процессора ограничено от 100 % до 20 % почти для многоядерных процессоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *