2010-08-17
Обсудить на форуме
Принять участие в разработке библиотеки/утилиты можно на GitHub.
В какой-то момент мне надоело высчитывать с калькулятором значения VMGUARPAGES и PRIVVMPAGES для OpenVZ и следить, чтобы они были согласованы для разных виртуальных машин (например, память распределялась непротиворечивым образом, чтобы одна витруальная машина не могла повлиять на другую). И я написал небольшую, но очень удобную "псевдографическую" утилитку, - vzmem, - которой сейчас и хочу поделиться.
Как использовать dklab_vzmem
Vzmem - это утилита командной строки, которая позволяет распределять физическую память между несколькими
виртуальными машинами OpenVZ так, чтобы одна машина "не залезала" на другую. Т.е. если нужно увеличить память для какой-то
из машин, всегда видно, откуда эту память требуется "откусить": от одной из существующих машин или от пула свободных блоков.
Листинг 1: Установка vzmem на сервер
|
cd /usr/sbin
wget https://raw.github.com/DmitryKoterov/dklab_vzmem/master/vzmem
chmod +x vzmem |
Распределение памяти задается в текстовом файле /etc/vz/conf/MEM-MAP, который выглядит примерно вот так:
Листинг 2: Файл /etc/vz/conf/MEM-MAP
|
300
10003 vps1.example.com ========== 109552K
10004 vps2.example.com ============================== 335503K
20004 vps3.example.com ==========+++++++++++++++ 109552K + 221324K swap
FREE ====================== 513525K |
- Каждый значок "=" символизирует кусочек физической памяти (в данном примере - 1/300 ее часть) и влияет на значение параметра OpenVZ VMGUARPAGES (и задает величину SHMPAGES). Перемещая значки "=" между разными виртуальными машинами, можно перераспределять память (утилита следит, чтобы в сумме
количество блоков оставалось равно 300).
- Значки "+" символизируют "дополнительную память из неиспользуемых сейчас блоков или SWAP". Их можно добавлять, сколько угодно
(но желательно - не очень много, чтобы машина в критических ситуациях не ушла в SWAP слишком сильно). В сумме количество
значков "=" и "+" указывает значение параметра PRIVVMPAGES (то же самое значение записывается и в OOMGUARPAGES).
- Ну а значения в килобайтах после значков "=" и "+" вычисляются автоматически - их не надо изменять руками.
"И зачем вся эта живопись?" - спросите вы. А вот зачем: если возникает необходимость увеличить у какой-то машины память,
открываете любой привычный текстовый редактор, выделяете значки "=", которых не жалко, и методом "вырезать-вставить"
перемещаете их в нужную машину. При этом в сумме символов остается 300. (В mcedit, к которому я привык, комбинация
клавиш такая: F3 - начало выделения, F3 - окончание выделения, F6 - перенос выделенных символов на место курсора.)
Применение изменений в MEM-MAP
Когда изменения в MEM-MAP внесены, нужно выполнить следующую команду:
Листинг 3: Применение изменений в /etc/vz/conf/MEM-MAP
|
vzmem -a |
Итого:
- VMGUARPAGES = SHMPAGES = число_значков("=")
- PRIVVMPAGES = OOMGUARPAGES = число_значков("=") + число_значков("+")
Vzmem следит, чтобы в сумме значков "=" было ровно 300 штук (в данном примере) и сообщает об
ошибке, если это не так.
Начальное создание файла MEM-MAP
Чтобы изначально создать /etc/vz/conf/MEM-MAP на основе имеющейся у вас конфигурации OpenVZ, выполните команду:
Листинг 4: Начальное создание файла /etc/vz/conf/MEM-MAP
|
vzmem -i 300 |
Вместо 300 можно задать любое число, которое определит, на сколько "блоков" следует
разделить физическую память. Ставьте это число таким, чтобы было удобнее перемещать
значки "=" и "+" из одной строки в другую.
|
Если память на момент вызова vzmem -i уже распределена противоречивым образом, vzmem пытается
распределить число значков "=" между машинами пропорциональным образом. На всякий случай
проверьте результат после инициализации.
|
|
|
|