В Solaris предусмотрены очень хорошие инструменты для управления ресурсами не только самой ОС, но и зон. К примеру, мы хотим ограничить ресурсами какую-то зону, причём не просто ограничить место, а ограничить по количеству используемых процессоров, памяти, процессов, задач и прочего.
Данная статья так же подходит для ограничения не только зон, но и отдельных процессов.
Тестовый стенд: Solaris 11
Ниже будут идти разного рода ограничения, отсортированные по категориям.
1) Ограничиваем свойствами самой zfs
Приведу здесь только некоторые из значимых опций. Все опции применяются следующей командой:
zfs set OPTION=VALUE /path/to/zfs
где OPTIONS – соответственно опция, а VALUE – значение.
Опции могут быть таких видов: default (значения по умолчанию), inherited (унаследованные из пула), local (опции, установленные через zfs set), temporary (временные опции, установленные через zfs mount -o), – (none) (значения read-only, установленные самой zfs)
– quota: определяет размер выделяемой квоты под ФС, а так же для её снапшотов и клонов (значения: 1G|2G…)
– reservation: определяет резервацию для данной ФС, а так же для её снапшотов и клонов, то есть это место будет всегда зарезервировано для данной ФС (значения: 1G|2G…)
– sharenfs: расшарить эту ФС через NFS (значения: on|off)
– checksum: включить/отключить коррекцию и определение ошибок(значения: on|off). Лучше её не отключать
– compression: включить/отключить сжатие (значения: on|off)
– exec: включить/выключить возможность запуска приложений(значения: on|off)
– setuid: включить/выключить возможность установки SUID бита(значения: on|off)
– copies: сколько копий данной ФС хранить (значения: 1|2|3)
– recordsize: указывает размер блока для ФС
– referenced: указывает на размер данных, занятых ФС. Для клонированных ФС значения одинаковые
– refquota: жёсткий лимит по квоте. Этот параметр не учитывает место занимаемое под снапшоп или клон
– refreservation: определяет резервацию для данной ФС, то есть это место будет всегда зарезервировано для данной ФС. Этот параметр не учитывает место занимаемое под снапшоп или клон (значения: 1G|2G…)
– utf8only: Эта опция приведёт к тому, что файлы в этом каталоге можно будет создавать с названиями только в кодировке UFT-8. Это приведёт к тому, что мы неправильно сконфигурированные клиенты, которые попытаются создать файлы с названиями в кодировке koi8-r или cp1251, не смогут этого сделать. Мы гарантированы от путаницы кодировок.
– casesensitivity: специально для SMB Server предусмотрена опция mixed, ее надо указать ТОЛЬКО при создании ФС
– sync: настройка синхронизации
– encryption: криптовать ФС или нет
– shadow: миграция на уровне файловой системы.
2) Ограничения по ресурсам (память, процессор, сеть,…)
Для ограничения зоны используем утилиты zonecfg. Ниже будут приведены некоторые параметры:
– capped-cpu: количество используемых CPU (может задаваться в процентном соотношении)
– capped-memory: количество используемой памяти – физическую, swap и locked (для каждого типа памяти значения задаются отдельно)
– dedicated-cpu: использовать только указанные CPU (на самом деле используется пул, созданный на основе указанных CPU), которые будут использоваться только в этой зоне, и не в какой другой (даже в глобальной)
– cpu-shares: число используемых FSS (эта опция несовместима с опцией dedicated-cpu)
– limitpriv: максимальное количество привилегий на процесс
– max-lwps: максимальное количество LWPs simultaneously
– max-msg-ids: максимальное количество ID сообщений в очереди
– max-processes: максимальное количество процессов
– max-sem-ids: максимальное количество семафоров
– max-shm-ids: максимальное количество ID shared памяти
– max-shm-memory: максимальное количество shared памяти
– scheduling-class: класс планировщика (рекомендуется ставить FSS, так как обычно требуется достаточно высокая отзывчивость неглобальных зон, даже при серьезной перегрузке сервера. Доступные классы можно узнать командой dispadmin -l)
3) Ограничения по ресурсам (память, процессор, сеть,…) НА ЛЕТУ
Для изменения на лету (иначе пришлось бы менять через zonecfg и перегружать зону) используется утилита prctl. Но она принимает пригодна только для процессов и в качестве параметра номер процесса. А как же быть, если у нас зона? Очень просто. В каждой зоне есть процесс init, через который собственно и будем ограничивать. Найдём номер pid’a init’a для зоны zone11:
# pgrep -z zone11 init
2655
Что бы посмотреть список свойств, которые можно менять, выполним команду:
# prctl 2655 | grep zone
zone.max-lofi
zone.max-swap
zone.max-locked-memory
zone.max-shm-memory
zone.max-shm-ids
zone.max-sem-ids
zone.max-msg-ids
zone.max-processes
zone.max-lwps
zone.cpu-cap
zone.cpu-shares
Описание значений такие же, как и соответствующие значения в предыдущем пункте.
Если не применяются значения через prctl, тогда советую прочесть здесь
Дополнение.
После применения различного рода ограничений, неплохо было бы узнавать как-то о превышении и если надо – реагировать должным образом. Хорошим примером служит утилита rctladm, которая позволяет выставить логгирование на определённые события.
Примечание.
Эти же значения могут устанавливаться и через свойства rctl зоны:
zonecfg:my-zone> add rctl
zonecfg:my-zone:rctl> set name=zone.cpu-shares
zonecfg:my-zone:rctl> add value (priv=privileged,limit=10,action=none)
zonecfg:my-zone:rctl> end
Так же можно ограничивать память налету через демон rcapd (rcapadm, rcapstat). Но ограничения будут действовать только до следующего ребута зоны.
4) Ограничения через pool
Что такое пул ресурсов? Это определённый “набор” ресурсов разрешаемый для использования кем-либо. Фактически пул может ограничить только CPU (минимально, максимально, какие именно CPU использовать (номера)). Для привязки пула нужно создать сам пул и потом с помощью set pool (через zonecfg) привязать зону к нужному пулу.
5) Просмотр доступных ограничений на привилегия зоны
Короткий вывод
(inside zone)#ppriv -l zone
...
contract_event
contract_identity
contract_observer
file_chown
...
Длинный вывод
# ppriv -lv zone ... contract_event Allows a process to request critical events without limitation. Allows a process to request reliable delivery of all events on any event queue. contract_identity Allows a process to set the service FMRI value of a process contract template. contract_observer Allows a process to observe contract events generated by contracts created and owned by users other than the process's effective user ID. Allows a process to open contract event endpoints belonging to contracts created and owned by users other than the process's effective user ID. file_chown Allows a process to change a file's owner user ID. Allows a process to change a file's group ID to one other than the process' effective group ID or one of the process' supplemental group IDs. ...
6) Мониторинг потребляемых ресурсов
Для мониторинга потребляемых ресурсов (CPU, memory) по зонах очень удобно использовать утилиту zonestat (К сожалению она доступна только для 11 версии; раньше можно было смело скачать с opensolaris, но теперь файлы удалены).Что бы она работала, нужно, что бы была запущена служба svc:/system/zones-monitoring:default. Вот пример вывода zonestat 1:
Interval: 21, Duration: 0:00:21 SUMMARY Cpus/Online: 1/1 PhysMem: 1023M VirtMem: 2047M ---CPU---- --PhysMem-- --VirtMem-- --PhysNet-- ZONE USED %PART USED %USED USED %USED PBYTE %PUSE [total] 0.12 12.5% 877M 85.7% 1134M 55.4% 820 0.00% [system] 0.01 1.35% 623M 60.9% 795M 38.8% - - global 0.10 10.6% 125M 12.2% 114M 5.61% 820 0.00% solaris10 0.00 0.29% 77.1M 7.54% 180M 8.80% 0 0.00% zone1 0.00 0.20% 51.8M 5.06% 43.5M 2.12% 0 0.00%
А можно ещё и собрать статистику за указанный период:
#zonestat -p -r memory -q -R average,high 30s 24h 1h