Management and Repository for FreeBSD Jails

Внимание! Данные страницы описывают cbsd версии 10.0.3. Если вы используете более раннюю версию, рекомендуется сначала обновиться.

Управление лимитами jail

Команды jrctl, jrctl-tui

                        % cbsd jrctl
                        % cbsd jrctl-tui
                
Описание:

CBSD поддерживает различные подсистемы FreeBSD для установки лимитов на ресурсы клетки.

Файловые квоты

Плавающие файловые квоты возможны только для клеток, размещенных на ZFS-файловой системе. Для систем на 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-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