Ограничение использования CPU в Ubuntu 12.10
Ubuntu, VPS | Комментировать запись
Чрезмерное использование ресурсов CPU может привести к сбою или аварийному отказу сервера. Потому необходимо тщательно контролировать ресурсы сервера; это особенно полезно при использовании пользовательских скриптов, запущенных демоном cron.
Чтобы приступить к выполнению руководства, запустите сервер Ubuntu 12.10 x64.
Установите утилиту cpulimit:
apt-get -y install cpulimit
Базовый синтаксис cpulimit
Usage: cpulimit TARGET [OPTIONS...]
TARGET must be exactly one of these:
-p, --pid=N pid of the process
-e, --exe=FILE name of the executable program file
-P, --path=PATH absolute path name of the executable program file
OPTIONS
-b --background run in background
-l, --limit=N percentage of cpu allowed from 0 to 100 (mandatory)
-v, --verbose show control statistics
-z, --lazy exit if there is no suitable target process, or if it dies
-h, --help display this help and exit
Тестирование использования процессора
Установите использование процессора , не прибегая к помощи cpulimit.
К примеру, процессор может использоваться приложением так:
md5sum /dev/zero &
root@cpulimit:~# md5sum /dev/zero &
[1] 1572
root@cpulimit:~#
Процесс md5sum будет ответвлён и переведён в фоновый режим. При помощи top можно проверить использование CPU:
top - 01:56:23 up 1:03, 1 user, load average: 0.72, 0.32, 0.16
Tasks: 73 total, 2 running, 71 sleeping, 0 stopped, 0 zombie
%Cpu(s): 96.7 us, 3.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
KiB Mem: 503240 total, 318880 used, 184360 free, 8928 buffers
KiB Swap: 0 total, 0 used, 0 free, 219152 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1572 root 20 0 7172 616 520 R 99.9 0.1 1:08.72 md5sum
Как видите, на данный момент используется почти 100% ресурсов CPU (учитывая, что это одноядерный сервер).
Этот процесс можно вывести в фоновый режим при помощи fg и закрыть его, нажав CTRL+C:
root@cpulimit:~# fg
md5sum /dev/zero &
^C
root@cpulimit:~#
Использование cpulimit
Теперь попробуйте применить утилиту cpulimit. К примеру, ограничьте использование CPU до 40% и запустите команду:
cpulimit -l 40 md5sum /dev/zero &
root@cpulimit:~# cpulimit –l 40 md5sum /dev/zero &
[1] 1635
root@cpulimit:~# Process 1635 detected
[1]+ Done cpulimit –l 40 md5sum /dev/zero
Использование процессора сократилось до 40%:
top - 02:03:28 up 1:10, 1 user, load average: 0.26, 0.34, 0.24
Tasks: 74 total, 2 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu(s): 39.5 us, 1.0 sy, 0.0 ni, 59.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
KiB Mem: 503240 total, 320432 used, 182808 free, 8988 buffers
KiB Swap: 0 total, 0 used, 0 free, 220544 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1636 root 20 0 7172 616 520 R 39.9 0.1 0:24.46 md5sum
Многоядерные серверы
На серверах с несколькими процессорами требуется ограничить использование процессора на каждый процесс.
Этот скрипт порождает 4 процесса без каких-либо ограничений и позволяет им работать одновременно:
for j in `seq 1 4`; do md5sum /dev/zero & done
Каждое ядро процессора используется почти на 100%:
top - 23:29:28 up 7 days, 13:54, 1 user, load average: 0.80, 1.08, 0.53
Tasks: 77 total, 5 running, 72 sleeping, 0 stopped, 0 zombie
%Cpu0 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 93.2 us, 6.8 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 95.0 us, 5.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 98.3 us, 1.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8178228 total, 380196 used, 7798032 free, 28136 buffers
KiB Swap: 0 total, 0 used, 0 free, 251708 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8400 root 20 0 7172 612 520 R 101.7 0.0 0:03.10 md5sum
8401 root 20 0 7172 612 520 R 101.7 0.0 0:03.10 md5sum
8399 root 20 0 7172 616 520 R 98.4 0.0 0:03.06 md5sum
8402 root 20 0 7172 612 520 R 98.4 0.0 0:03.09 md5sum
Чтобы запустить cpulimit для каждого процесса, поместите утилиту перед командой:
for j in `seq 1 4`; do cpulimit -l 40 md5sum /dev/zero & done
Теперь каждый процесс использует только 40% ресурсов и не перегружает сервер:
top - 23:31:03 up 7 days, 13:55, 1 user, load average: 2.68, 1.72, 0.82
Tasks: 81 total, 5 running, 76 sleeping, 0 stopped, 0 zombie
%Cpu0 : 39.4 us, 0.7 sy, 0.0 ni, 59.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
%Cpu1 : 38.7 us, 1.7 sy, 0.0 ni, 59.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 39.4 us, 1.3 sy, 0.0 ni, 59.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 39.4 us, 1.7 sy, 0.0 ni, 58.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8178228 total, 380452 used, 7797776 free, 28144 buffers
KiB Swap: 0 total, 0 used, 0 free, 251708 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8442 root 20 0 7172 616 520 R 40.4 0.0 0:06.10 md5sum
8440 root 20 0 7172 612 520 R 40.0 0.0 0:06.09 md5sum
8435 root 20 0 7172 616 520 R 39.7 0.0 0:06.09 md5sum
8436 root 20 0 7172 612 520 R 39.7 0.0 0:06.10 md5sum