Ограничение использования CPU в Ubuntu 12.10

Чрезмерное использование ресурсов 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

Tags: , , ,

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