Ограничение по процессорной мощности, не так просто, как кажется. Существует несколько способов ограничить потребление процессора:
- Планировщик долевого распределения (FSS)
- Пулы ресурсов
- Зонные ограничения
Тестовый стенд: Solaris 11
1) Планировщик долевого распределения (FSS)
Каждому процессу выделяются доли процессора, что позволяет контролировать доступ проекта к процессорным ресурсам. FSS гарантирует справедливое распределение ресурсов ЦП между проектами, основанное на распределении долей, не зависящем от количества процессов, связанных с проектом. FSS позволяет добиться равнодоступности путем сокращения доступа проекта к чрезмерному количеству ресурсов ЦП и повышения доступа к умеренному количеству в соответствии с требованиями других проектов.
Термин “доля” означает часть ресурсов ЦП системы, выделенных для проекта. Если проекту выделяется больше долей ЦП, чем другим проектам, такой проект получает больше процессорных ресурсов от планировщика долевого распределения.
Доли ЦП не эквивалентны процентам ресурсов ЦП. Доли позволяют определить важность рабочих нагрузок по отношению к другим рабочим нагрузкам. При назначении проекту долей ЦП наиболее важным является не количество долей, выделенных проекту. Гораздо важнее знать, сколько долей выделено проекту по сравнению с другими проектами. Следует также учитывать, что многие из этих других проектов будут конкурировать с данным проектом за ресурсы ЦП.
Создадим проект test:
#projadd -U webservd -K 'project.cpu-cap=(privileged,100,deny)' www
#projmod -s -U webservd -K 'project.cpu-shares=(privileged,20,none)' www
# cat /etc/project
www:100::webservd::project.cpu-cap=(privileged,100,deny);project.cpu-shares=(privileged,20,none)
А вот и пояснение:
– project.cpu-cap – абсолютное ограничение по количеству ресурсов ЦП, потребляемых проектом. Значение 100 означает, что в качестве project.cpu-cap задано 100% одного ЦП.
– project.cpu-shares – Число долей ЦП, выделенных данному проекту. Приоритет задаётся по отношению этого числа другого проекта. (по умолчанию у всех проектов 1)
Примечание.
Напомню, что доли распределяются на все процессы, находящиеся в соответствующих проектах в зоне/задаче/проекте. То есть к примеру, создать проект php с частями доли 1 и поместить туда юзера www это не тоже самое, что оставить юзера www в проекте default (хотя частей там тоже 1), так как в проекте php доля 1 будет распределена только между юзером www, а в проекте default – между всеми юзерами, зонами, задачами, которые находятся в default.
Если вы всё-таки передумали использовать ограничение, рекомендую перейти на другой планировщик (к примеру, на TS), так как FSS при не использовании ограничений может только понизить производительность.
2) Пулы ресурсов (работает только в global-zone)
По умолчанию в Solaris данный механизм отключен. Для того, что бы проверить включен ли он на конкретом сервере, можно выполнить команду:
# pooladm
Для активации выполняем команду:
# pooladm -e
После активации механизма, следует создать конфиг по умолчанию командой:
# pooladm -s
Примечание:
Если механизм уже включен и настроен, то его конфиг должен находиться в файле /etc/pooladm.conf. Для того, чтобы сбросить настройки можно переименовать этот файл и деактивировать/активировать механизм пулов ресурсов. Для восстановления настроек, можно переименовать файл обратно и снова деактивировать/активировать механизм.
Создадим набор из процессоров
# poolcfg -c 'create pset web_pset ( uint pset.min = 2; uint pset.max = 6 )'
Создадим пул и ассоциируем его с данным набором:
# poolcfg -c 'create pool web_pool'
# poolcfg -c 'associate pool web_pool (pset web_pset)'
Примечание.
Созданный набор из CPU означает, что данный пул не может одновременно использовать больше 6 CPU, но это НЕ значит, что другие процессы не могут использовать именно эти CPU (они будут делиться между всеми процессами, которые используют данные CPU). Что бы повысить приоритет на данный CPU – можно использовать пулы совместно с FSS. CPU меняются, но в один момент они доступны только одному пулу.
Все сделанные изменения на данный момент не вступили в силу. Команда poolcfg лишь модифицирует конфигурационный файл. Посмотреть созданную конфигурацию можно командой:
# poolcfg -c info
Для того, чтобы созданная конфигурация вступила в силу следует выполнить команду;
# pooladm -c /etc/pooladm.conf
или просто
# pooladm -c
Теперь привяжем наш пул web_pool к зоне zone0:
# zonecfg -z zone0 set pool=web_pool
Вот небольшая справка по использованию пулов:
Переместить два ЦП из pset1 в pset2
# poolcfg -dc 'transfer 2 from pset pset1 to pset2’
Переместить два конкретных процессора в pset_large
# poolcfg -dc 'transfer to pset pset_large (cpu 0; cpu 2)'
Связать процесс с пулом вручную:
# poolbind -p my_pool $$
Проверить привязку процесса к пулу командой poolbind с параметром -q.
$ poolbind -q $$
Связать все процессы в проекте my_proj с пулом my_pool.
# poolbind -i project -p my_pool my_proj
# projmod -a -K project.pool=my_pool my_proj
Вывод статистических отчетов по ресурсам, связанным с пулами
# poolstat 3 5
Так же можно ассоциировать пул с классом планировщика (то есть все процессы из этого пула будут использовать заданный планировщик.):
# poolcfg -c 'modify pool my_pool (string pool.scheduler="FSS")'
3) Зонные ограничения
Здесь у нас есть возможность выбрать и настроить 2 параметра: capped-cpu и dedicated-cpu:
dedicated-cpu – выделяем зоне количество CPU, которые нигде не будут больше использоваться (даже в global zone).
capped-cpu – ограничение на время выполнения CPU.
Одновременно можно использовать только один из параметров.
Разберём на примере.
Пример 1.
Добавим ограничение на использование не более 10% CPU
zonecfg:zone0> add capped-cpu zonecfg:zone0:capped-cpu> set ncpus=0.1
Пример 2.
Добавим ограничение на использование не более 2-x CPU
zonecfg:zone0> add dedicated-cpu zonecfg:zone0:dedicated-cpu> set ncpus=1-2 zonecfg:zone0:dedicated-cpu> set importance=2
Описание параметров:
ncpus
Здесь указывается количество процессоров или диапазон, например 2-4 процессора. Если диапазон указывается вследствие необходимости реализации динамического поведения пула ресурсов, также необходимо выполнить следующее:
– установить свойство importance;
– включите службу poold
importance
Если для реализации динамического поведения используется диапазон процессоров, также следует настроить свойство importance. Свойство importance является необязательным и определяет относительную важность пула. Это свойство требуется только в случае указания диапазона для ncpus и при использовании динамических пулов ресурсов, управляемых демоном poold. Если демон poold не запущен, свойство importance игнорируется. Если демон poold не запущен, а свойство importance не задано, значение importance по умолчанию принимается равным 1. Для получения дополнительной информации см. Ограничения посредством свойства pool.importance.
4) Заключение.
Хочу привести очень интересную статью о том, что ограничение capped-cpu не ограничивает рост Load Avarege, а лишь ограничивает CPU usage.