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