FreeBSD virtual environment management and repository

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