2020-10 upd: we reached the first fundraising goal and rented a server in Hetzner for development! Thank you for donating !
Внимание! Данные страницы описывают CBSD версии 13.0.x. Если вы используете более раннюю версию, рекомендуется сначала обновиться.
Управление лимитами jail
Команды jrctl, jrctl-tui
% cbsd jrctl
% cbsd jrctl-tui
Описание:
CBSD поддерживает различные механизмы FreeBSD для установки лимитов на ресурсы клетки, такие как: zfs quota, rctl(8) и cpuset
CPU и Memory лимиты
Наиболее востребованными в установке параметрами ограничения являются лимиты по потреблению CPU и оперативной памяти. Вы можете ограничивать потребление CPU через RACCT ( параметры cputime и pcpu ), либо использовать выделение фиксированного количества ядер (через cpuset) через параметр cpu=.
В наших исследованиях и тестированиях cpu= является наиболее практичным и востребованным решением. Параметр cpu= указывает, какое количество ядер контейнер может утилизировать. Вы сразу можете создать контейнер, ограниченный, к примеру, одним ядром:
% cbsd jcreate jname=myjail cpu=1 runasap=1
Помимо ограничения ядер, вы можете захотеть ограничить потребление памяти через vmemoryuse=:
% cbsd jcreate jname=myjail cpu=1 vmemoryuse=1g runasap=1
Или, если вы предпочитаете создавать окружения через CBSDfile, это может выглядеть так:
jail_test2()
{
ip4_addr="DHCP"
host_hostname="test2.my.domain"
pkg_bootstrap="0"
# LIMIT/QUOTAs:
fsquota="10g" # set ZFS dataset quota
cpu="1" # only one vCPU allowed!
vmemoryuse="512m" # only 512MB RAM allowed!
}
Файловые квоты
Плавающие файловые квоты возможны только для клеток, размещенных на ZFS-файловой системе. Квота регулируется через параметр fsquota=. Для систем на UFS подобное можно осуществить лишь md(4)-based vnode файл/имидж (параметр mdsize у клетки).
Приоритезация через renice
Для приоритезации используется подсистема renice(8). Вы можете указывать различные приоритеты у разных клеток, чтобы наиболее важные клетки получали максимум CPU-времени за счет клеток, которые процессорное время могут уступить. К примеру, вы можете захотеть выдать клеткам distcc минимальный приоритет, тогда как клетке с WEB сервером — средний, а клетке с базой данных — максимальный. За это поведение отвечает параметр nice в настройках jrctl клетки, его значение и поведение соответствует nice(1) — чем ниже коэффициент, тем клетка приоритетнее.
Демонстрация работы nice:
1) Создадим AMP клетку, поместив в docroot .php скрипт выполняющий некоторые математические действия, например bench.zip взятый с http://www.php-benchmark-script.com/ с увеличенными в 10 раз итерациями в циклах. Склонируем клетку, первой дав имя highprio1, второй — lowprio1. Через cbsd jrctl-tui укажем первой максимальный приоритет -20, второй — минимальный, 20. Кроме этого, повесим клетки на одно ядро через cpuset в cbsd jconfig (одноядерные системы сейчас найти сложно, а умный шедулер ОС не позволит провести чистый эксперемент без этих действий ;-).
% cbsd jls display=jid,jname,ip4_addr,cpuset
16 highprio1 10.0.0.121/24 4
17 lowprio1 10.0.0.122/24 4
— jid 16 имеет приоритетная клетка и jid 17 — неприоритетная, обе на четвертом ядре.
сделаем опрос через top состояния загруженности php-fpm и выводом JID:
% export iter=1
% while [ 1 ]; do
printf "Iter: $iter" ;
iter=$((iter+1))
top -jab | grep php
sleep 1
done
Запускаем скрипт одновременно в обоих IP:
% fetch -T 300 -o /dev/stdout http://10.0.0.121 & fetch -T 300 -o /dev/stdout http://10.0.0.122 &
[1] 65985
[2] 65986
--------------------------------------
| PHP BENCHMARK SCRIPT |
--------------------------------------
Start : 2014-01-06 16:28:59
Server : @10.0.0.121
PHP version : 5.4.23
Platform : FreeBSD
--------------------------------------
test_math : 12.870 sec.
test_stringmanipulation : 15.896 sec.
test_loops : 8.968 sec.
test_ifelse : 7.864 sec.
--------------------------------------
Total time: : 45.598 sec.
--------------------------------------
| PHP BENCHMARK SCRIPT |
--------------------------------------
Start : 2014-01-06 16:29:02
Server : @10.0.0.122
PHP version : 5.4.23
Platform : FreeBSD
--------------------------------------
test_math : 32.632 sec.
test_stringmanipulation : 18.053 sec.
test_loops : 6.323 sec.
test_ifelse : 5.504 sec.
--------------------------------------
Total time: : 62.512 sec.
[2] Done fetch -T 300 -o /dev/stdout http://10.0.0.122
[1] + Done fetch -T 300 -o /dev/stdout http://10.0.0.121
во время чего наблюдаем следующую картину top:
Iter: 1
65101 16 www 1 35 -20 32548K 11456K CPU4 4 0:35 20.56% php-fpm: pool www (php-fpm)
65587 17 www 1 52 20 32548K 11456K RUN 4 0:32 0.00% php-fpm: pool www (php-fpm)
Iter: 2
65101 16 www 1 60 -20 32548K 11456K RUN 4 0:36 25.98% php-fpm: pool www (php-fpm)
65587 17 www 1 42 20 32548K 11456K CPU4 4 0:33 2.10% php-fpm: pool www (php-fpm)
Iter: 3
65101 16 www 1 60 -20 32548K 11456K CPU4 4 0:36 26.27% php-fpm: pool www (php-fpm)
65587 17 www 1 94 20 32548K 11456K RUN 4 0:33 8.59% php-fpm: pool www (php-fpm)
Iter: 4
65101 16 www 1 61 -20 32548K 11456K CPU4 4 0:37 31.69% php-fpm: pool www (php-fpm)
65587 17 www 1 95 20 32548K 11456K RUN 4 0:34 9.47% php-fpm: pool www (php-fpm)
Iter: 5
65101 16 www 1 62 -20 32548K 11456K CPU4 4 0:37 35.60% php-fpm: pool www (php-fpm)
65587 17 www 1 95 20 32548K 11456K RUN 4 0:34 11.18% php-fpm: pool www (php-fpm)
Iter: 6
65101 16 www 1 64 -20 32548K 11456K CPU4 4 0:38 38.96% php-fpm: pool www (php-fpm)
65587 17 www 1 96 20 32548K 11456K RUN 4 0:34 12.79% php-fpm: pool www (php-fpm)
..
Клетка с jid 16 получила бОльший приоритет и выполнилась в почти в 1.5 раза быстрее.
RACCT/RCTL фреймворк
Если ваше ядро имеет поддержку RACCT/RCTL, вы можете устанавливать лимиты, описанные в rctl(8) на клетки и смотреть текущую статистику по потребляемым ресурсам jail. Для установки и снятия лимитов используется команда cbsd jrctl, которая с аргументами
% cbsd jrctl mode=apply ...
и
% cbsd jrctl mode=unset ...
вызываются автоматически для установки или снятия лимитов при работе команд jstart и jstop соответственно. Через флаг
% cbsd jrctl mode=show
высвечивается текущая статистика по потребляемым ресурсам jail, что может быть использовано для генерации отчетов и графиков по загрузке jail, а также, используется демоном CBSD для генерации рекомендаций о необходимости добавлять новые ресурсы и предупреждений перегрузок.
Через команду
% cbsd jrctl
без аргументов, вы можете увидеть установленные лимиты для всех клеток. Через аргумент display можно указать конкретные поля для выборки данных. Если display не указан, используется значение, заданное в файле $workdir/etc/defaults/jrctl.conf, которое вы можете изменить на свое усмотрение через $workdir/etc/jrctl.conf
Вы можете редактировать лимиты через
% cbsd jrctl-tui jname=jname
Либо, если вы строите хостинг площадку и хотите создавать лимиты не-интерактивно, вы можете генерировать файл $workdir/$jname/jail.limits
Через jrctl можно установить следующие лимиты jail:
a) Все что позволяет делать подсистема rctl(8) FreeBSD, а именно:
cputime CPU time, in seconds
datasize data size, in bytes
stacksize stack size, in bytes
coredumpsize core dump size, in bytes
memoryuse resident set size, in bytes
memorylocked locked memory, in bytes
maxproc number of processes
openfiles file descriptor table size
vmemoryuse address space limit, in bytes
pseudoterminals number of PTYs
swapuse swap usage, in bytes
nthr number of threads
msgqqueued number of queued SysV messages
msgqsize SysV message queue size, in bytes
nmsgq number of SysV message queues
nsem number of SysV semaphores
nsemop number of SysV semaphores modified in a single semop(2) call
nshm number of SysV shared memory segments
shmsize SysV shared memory size, in bytes
wallclock wallclock time, in seconds

