среда, 9 января 2008 г.

Настройка распределеня ресурсов CPU в зонах Sun Solaris 10

Цель данной статьи показать настройку распределеня физических процессоров для каждой зоны в отдельности. Это будет полезно когда на сервере не один процессор и необходимо каждой зоне выделить определенное их количество. В данном примере мы имеем реальный сервер Fujitsu-Siemens PrimePower 850 c 16 процессорами и в дальнейшем нам нужно настроить 3 зоны следующим образом.

1. zweb - 1 процессор
2. zapp - 6 процессоров
3. zdev - 9 процессоров

А нижеприведенный рисунок объясняет нашу задачу графически.



Собственно мы не будем углублятся в описание создания зон, так как их описание имеется здесь и на других различных ресурсах Интернета. Мы займемся непосредственно распределением процессоров.
Давайте с начала посмотрим состояние наших зон
bash# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
5 zweb running /zones/z.zweb native shared
6 zapp running /zones/z.zapp native shared
7 zdev running /zones/z.zdev native shared
Приступим.
В Solaris 10 имеется замечательный демон управления ресурсами poold, с котором мы и будем работать.
Для начала проверим запущен ли он уже или нет.
bash# ps -eaf | grep poold
root 20019 18948 0 15:03:58 pts/3 0:00 grep poold
Как мы видим он не запущен, поэтому ответная реакция на попытку просмотра информации о пулах будет следующая.
bash# pooladm
pooladm: couldn't open pools state file: Facility is not active
Запустим службу poold с помощью команды pooladm и ключа -е
bash# pooladm -e
bash# pgrep poold
20237
Затем без всяких опций и ключей команда pooladm должна вывести нам всю имеющуюся информацию о запущеной конфигурации пулов.
bash# pooladm
system default
string system.comment
int system.version 1
boolean system.bind-default true
string system.poold.objectives wt-load

pool pool_default
int pool.sys_id 0
boolean pool.active true
boolean pool.default true
int pool.importance 1
string pool.comment
pset pset_default

pset pset_default
int pset.sys_id -1
boolean pset.default true
uint pset.min 1
uint pset.max 65536
string pset.units population
uint pset.load 19
uint pset.size 16
string pset.comment

cpu
int cpu.sys_id 5
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 4
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 7
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 6
string cpu.comment
string cpu.status on-line

...
...

Для реализации нашего плана, нам требуется создать (так проще) конфигурационый файл наших будующих пулов CPU. Это выполняется командой poolcfg
bash# cat /zones/settings/zonepoolcfg
# 1. Указываем 1 процессор для zweb-pset

create pset zweb-pset ( uint pset.min = 1; uint pset.max = 1 )
# 2. Создаем новый пул вызывающий zweb-pool

create pool zweb-pool
# 3. Ассоциируем пул zweb-pool с zweb-pset

associate pool zweb-pool ( pset zweb-pset )

create pset zapp-pset ( uint pset.min = 6; uint pset.max = 6 )
create pool zapp-pool
associate pool zapp-pool ( pset zapp-pset )

create pset zdev-pset ( uint pset.min = 9; uint pset.max = 9 )
create pool zdev-pool
associate pool zdev-pool ( pset zdev-pset )
Теперь нам необходимо обновить нашу конфигурацию пулов используя poolcfg с ключем -f для указания конфигурационых настроек.
bash# poolcfg -f /zones/settings/zonepoolcfg
poolcfg: cannot load configuration from /etc/pooladm.conf:
No such file or directory

Эта ошибка возникла потому что конфигурационый файл /etc/pooladm.conf должен существовать перед каким либо обновлением его самого. Используйте ключ -s комманды pooladm для сохранения активной конфигурации пулов из памяти в /etc/pooladm.conf
bash# pooladm -s
bash# ls -l /etc/pooladm.conf
-rw-r--r-- 1 root root 3105 Jan 10 11:15 /etc/pooladm.conf
Теперь этот файл существует и мы можем повторить попытку обновления конфигурационых настроек пулов с помощью утилиты pooladm и ключа -f
bash# poolcfg -f /var/zones/zonepoolcfg
Альтернативно написанию скрипта мы можем прописать следующие команды для обновления конфигурации но создание скрипта дало нам преимущество в удобстве.
bash# poolcfg -c 'create pset zweb-pset  ( uint pset.min = 1; uint pset.max = 1 )'
bash# poolcfg -c 'create pool zweb-pool'
bash# poolcfg -c 'associate pool zweb-pool ( pset zweb-pset )'

... итд

Следующий шаг является активацией конфигурации из файла /etc/pooladm.conf в память, используя команду pooladm с ключом -c
bash# pooladm -c
А теперь проверим что у нас получилось
bash# psrset
user processor set 1: processor 0
user processor set 2: processors 1 2 3 4 5 6
user processor set 3: processors 7 8 9 10 11 12 13 14 15
bash# poolstat
pset
id pool size used load
1 zapp-pool 6 0.00 0.00
0 pool_default 3 0.00 0.02
3 zweb-pool 1 0.00 0.00
2 zdev-pool 6 0.00 0.00
Как мы видим у нас получилось 3 профайла с одним, шестью и десятью процессорами. Теперь я думаю многие уже понимают как мы поступим дальше. Именно эти профайлы и будут использовать наши зоны. Но сначала мы посмотрим что у нас получилось более детально. Опять используем команду pooladm без всяких опций и ключей.
bash# pooladm

system default
string system.comment
int system.version 1
boolean system.bind-default true
string system.poold.objectives wt-load

pool zapp-pool
int pool.sys_id 1
boolean pool.active true
boolean pool.default false
int pool.importance 1
string pool.comment
pset zapp-pset
...
...
pset zapp-pset
int pset.sys_id 1
boolean pset.default false
uint pset.min 6
uint pset.max 6
string pset.units population
uint pset.load 0
uint pset.size 6
string pset.comment

cpu
int cpu.sys_id 5
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 4
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 1
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 0
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 3
string cpu.comment
string cpu.status on-line

cpu
int cpu.sys_id 2
string cpu.comment
string cpu.status on-line
...
...
Теперь обновим конфигурацию наших зон для работы с пулами. Это делается довольно легко но если вы еще не создали зоны, то прошу вас ознакомится с неофициальной заметкой по созданию зон для чайников.
bash# zonecfg -z zapp
zonecfg:zapp> set pool=zapp-pool
zonecfg:zapp> verify
zonecfg:zapp> exit
Ну собсвтенно проделываем подобные действия для остальных 2 зон, указывая в опции set pool название профайла пула для определеной зоны.
После этого нам требуется перезагрузить наши зоны для активации наших изменений.
bash# zoneadm zweb reboot
bash# zoneadm zapp reboot
bash# zoneadm zdev reboot

bash# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
5 zweb shutting_down /zones/z.zweb native shared
6 zapp shutting_down /zones/z.zapp native shared
7 zdev shutting_down /zones/z.zdev native shared

bash# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / native shared
5 zweb running /zones/z.zweb native shared
6 zapp running /zones/z.zapp native shared
7 zdev running /zones/z.zdev native shared
Все зоны запустились, теперь давайте проверим все ли у нас получилось или нет.

zWeb:
bash# psrset
user processor set 1: processor 0
bash# psrinfo
0 on-line since 01/10/2008 11:35:26
zApp:
bash# psrset
user processor set 2: processors 1 2 3 4 5 6
bash# psrinfo
1 on-line since 01/10/2008 11:35:27
2 on-line since 01/10/2008 11:35:27
3 on-line since 01/10/2008 11:35:27
4 on-line since 01/10/2008 11:35:27
5 on-line since 01/10/2008 11:35:27
6 on-line since 01/10/2008 11:35:27
zDev:
bash# psrset
user processor set 3: processors 7 8 9 10 11 12 13 14 15
bash# psrinfo
7 on-line since 01/10/2008 11:35:26
8 on-line since 01/10/2008 11:35:27
9 on-line since 01/10/2008 11:35:27
10 on-line since 01/10/2008 11:35:27
11 on-line since 01/10/2008 11:35:27
12 on-line since 01/10/2008 11:35:27
13 on-line since 01/10/2008 11:35:28
14 on-line since 01/10/2008 11:35:28
15 on-line since 01/10/2008 11:35:28
P.S. Что же, мы убедились что при определеных знаниях это все легко. Да впринципе при определеных знаниях в этой определености все кажется простым :)

Для более детального изучения этой темы смотрите следующие темы:
1. Brendan Gregg's Zones documentation - здесь
2. Sun's HOW-TO Guide: Solaris Containers: Consolidating Servers and Applications - здесь
3. Управление ресурсами в зонах Solaris в официальной документации - здесь

Комментариев нет: