В этом руководстве описывается, как ограничить загрузку процессора в Ubuntu. Я буду использовать для этой цели утилиту cpulimit. Cpulimit - это утилита, которая ограничивает загрузку ЦП конкретным процессом (задается в процентах, а не во времени ЦП). Это особенно полезно при выполнении пакетных заданий, когда вы не хотите, чтобы они забирали слишком много циклов ЦП. Целью cpulimit является ограничение использования процессора конкретным процессом. Она не изменяет значение nice или другие параметры приоритета планирования, а управляет реальным использованием процессора. Кроме того, она может динамически и быстро адаптироваться к общей загрузке системы.
Контроль используемого количества циклов ЦП осуществляется путем отправки сигналов SIGSTOP и SIGCONT POSIX процессам. Все дочерние процессы и потоки указанного процесса будут использовать один и тот же процент загрузки ЦП.
1. Одно предварительное примечание
Это руководство основано на использовании серверной версии Ubuntu 18.04 LTS (Bionic Beaver), поэтому вам следует настроить базовую установку сервера Ubuntu 18.04, прежде чем продолжить работу. Система должна иметь статический IP-адрес. Я использую 192.168.1.100 в качестве своего IP-адреса в этом руководстве, а server1.example.com в качестве имени хоста.
2. Установка CPULimit
Для начала нам нужно установить cpulimit следующим образом:
apt-get update
apt-get install cpulimit
3. Ограничение загрузки CPU
Теперь мы проверим утилиту для ограничения использования процессора. Для этого мы сначала проверим использование ЦП без cpulimit, а затем запустим cpulimit, чтобы оценить ее работу. Давайте проясним это на примере.
Вот пример того, как можно загрузить приложением одноядерный процессор:
dd if=/dev/zero of=/dev/null &
Затем мы проверим загрузку процессора командой:
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
Теперь мы можем протестировать 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:~# Process 1853 detected
[1]+ Done cpulimit -l 30 dd if=/dev/zero of=/dev/null
root@server1:~#
[1] 1852
root@server1:~# Process 1853 detected
[1]+ Done cpulimit -l 30 dd if=/dev/zero of=/dev/null
root@server1:~#
Теперь мы проверим загрузку процессора командой top:
top
top - 11:30:54 up 55 min, 1 user, load average: 0.20, 0.58, 1.34
Tasks: 250 total, 2 running, 247 sleeping, 1 stopped, 0 zombie
%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 total, 271944 used, 738596 free, 21816 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 158212 cached Mem
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 dd
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
Tasks: 250 total, 2 running, 247 sleeping, 1 stopped, 0 zombie
%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 total, 271944 used, 738596 free, 21816 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 158212 cached Mem
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 dd
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%. Итак, мы успешно проверили в действии утилиту cpulimit, которая может ограничивать использование одноядерного процессора.
Вот пример того, как загрузить приложением многоядерный процессор:
Для проверки количества вашего ядра процессора используйте команду:
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:~#
[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
Tasks: 290 total, 5 running, 285 sleeping, 0 stopped, 0 zombie
%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 total, 209712 used, 800828 free, 20276 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 93632 cached Mem
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 dd
1264 root 20 0 7224 616 520 R 100.0 0.1 2:21.41 dd
1265 root 20 0 7224 612 520 R 99.0 0.1 2:21.03 dd
1266 root 20 0 7224 616 520 R 98.0 0.1 2:20.82 dd
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
Tasks: 290 total, 5 running, 285 sleeping, 0 stopped, 0 zombie
%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 total, 209712 used, 800828 free, 20276 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 93632 cached Mem
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 dd
1264 root 20 0 7224 616 520 R 100.0 0.1 2:21.41 dd
1265 root 20 0 7224 612 520 R 99.0 0.1 2:21.03 dd
1266 root 20 0 7224 616 520 R 98.0 0.1 2:20.82 dd
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% всех ядер CPU. Далее мы проверим эту команду с помощью утилиты cpulimit. Для этого убейте предыдущие следы команды dd следующим образом:
killall dd
root@server1:~# killall dd
[1] Terminated dd if=/dev/zero of=/dev/null
[3]- Terminated dd if=/dev/zero of=/dev/null
[2]- Terminated dd if=/dev/zero of=/dev/null
[4]+ Terminated dd if=/dev/zero of=/dev/null
root@server1:~#
[1] Terminated dd if=/dev/zero of=/dev/null
[3]- Terminated dd if=/dev/zero of=/dev/null
[2]- Terminated dd if=/dev/zero of=/dev/null
[4]+ Terminated 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:~# Process 1434 detected
Process 1433 detected
Process 1437 detected
Process 1439 detected
[1] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[2] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[3]- Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[4]+ Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
root@server1:~#
[1] 1429
[2] 1430
[3] 1431
[4] 1432
root@server1:~# Process 1434 detected
Process 1433 detected
Process 1437 detected
Process 1439 detected
[1] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[2] Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[3]- Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
[4]+ Done cpulimit -l 20 dd if=/dev/zero of=/dev/null
root@server1:~#
Теперь проверьте использование процессора с помощью утилиты top.
top
top - 11:59:10 up 16 min, 2 users, load average: 0.47, 0.71, 0.81
Tasks: 256 total, 2 running, 251 sleeping, 3 stopped, 0 zombie
%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 total, 204064 used, 806476 free, 20408 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 98340 cached Mem
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 dd
1439 root 20 0 7224 616 520 R 26.6 0.1 0:12.13 dd
1434 root 20 0 7224 612 520 T 25.3 0.1 0:11.97 dd
1437 root 20 0 7224 612 516 T 22.9 0.1 0:11.93 dd
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
Tasks: 256 total, 2 running, 251 sleeping, 3 stopped, 0 zombie
%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 total, 204064 used, 806476 free, 20408 buffers
KiB Swap: 1048572 total, 0 used, 1048572 free. 98340 cached Mem
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 dd
1439 root 20 0 7224 616 520 R 26.6 0.1 0:12.13 dd
1434 root 20 0 7224 612 520 T 25.3 0.1 0:11.97 dd
1437 root 20 0 7224 612 516 T 22.9 0.1 0:11.93 dd
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
Как вы можете видеть выше, использование CPU ограничено со 100% до почти 20% для многоядерного процессора.
Поздравляем! Мы успешно протестировали cpulimit для ограничения использования процессора в Ubuntu 18.04.
4. Ссылки:
Ubuntu: http://www.ubuntu.com/
cpulimit: https://github.com/opsengine/cpulimit
Комментариев нет:
Отправить комментарий