Различные технологии виртуализации позволяют запускать на одном сервере несколько в той или иной степени независимых экземпляров операционной системы (или даже разных операционных систем). Системы виртуализации различаюются как степенью изоляции выполняющихся операционных систем, так и другими особенностями и ограничениями. В дистрибутивах ALT Linux в качестве технологии виртуализации используется OpenVZ.
OpenVZ является реализацией виртуализации на уровне операционной системы (подобно, например, технологии jail
, доступной в ОС FreeBSD
). Все запущенные с её помощью экземпляры операционной системы (далее виртуальные контейнеры) используют один общий экземпляр ядра Linux. Это способствует повышению производительности по сравнению с технологиями, основанными на полной виртуализации оборудования, а также даёт администратору основной системы дополнительные возможности по контролю и управлению виртуальными контейнерами.
Минусом этой технологии является невозможность использования в разных виртуальных контейнерах операционных систем, не основанных на ядре Linux, а также разных версий ядра.
Система OpenVZ использует модифицированное ядро, обеспечивающее виртуализацию, изоляцию, управление ресурсами, сохранение состояний виртуальных серверов.
Каждый виртуальный сервер выглядит с точки зрения его пользователя или администратора практически неотличимо от обычного физического сервера. Каждый виртуальный сервер имеет свои собственные:
/proc
и /sys
, виртуализованные блокировки и т. п.init
). Идентификаторы процессов (PID
) также виртуализованы, поэтому PID
программы init
равняется 1, как ему и следует быть.venet
) обеспечивает наличие виртуальной сети в пределах физического сервера. Каждый виртуальный контейнер может иметь свой набор правил фильтрации пакетов.Ядро OpenVZ обеспечивает ограничение ресурсов каждого виртуального контейнера так, чтобы исключить для него возможность помешать работе других виртуальных контейнеров.
Основными компонентами управления ресурсами в OpenVZ являются: двухуровневая дисковая квота, специальный планировщик процессора, ограничения (user beancounters) и дополнительные полномочия (capabilities). Все эти ресурсы могут быть изменены во время работы виртуального сервера без перезагрузки.
Администратор физического сервера может установить для виртуальных серверов дисковые квоты, в терминах дискового пространства и количества индексных узлов (i-nodes), число которых примерно равно количеству файлов. Это верхний уровень дисковой квоты.
В дополнение к этому, администратор виртуального контейнера может использовать обычные средства управления дисковыми квотами внутри своего контейнера.
Работая внутри контейнера, можно определить объем доступного ему дискового пространства, выполнив следующие команды:
# echo "simfs / simfs rw 0 0" >>/etc/mtab
$ df -h
Одной из не всегда очевидных проблем при планировании ресурсов является дисковый ввод/вывод. При создании нагруженного сервера с обширным вводом/выводом в различных контейнерах следует помимо общей практики использования RAID1+ для повышения надёжности множества сервисов на одной системе по возможности применять разнесение потоков данных по различным физическим дискам2.
Например, практически возможно использование одного физического сервера как терминального (LTSP) и для сборки программных пакетов (hasher) при условии, что терминал-сервер и пакетные базы размещены на программном RAID1, а сборка ведётся на отдельном SCSI-диске; иначе даже существенный объём RAM (например, 4Gb) не поможет избежать заметного взаимного влияния контейнеров при дисковых операциях.
Планировщик процессора в OpenVZ также двухуровневый. На первом уровне планировщик на основании значения параметра cpuunits
решает, какому виртуальному серверу дать квант процессорного времени. На втором уровне стандартный планировщик Linux решает, какому процессу выбранного виртуального сервера дать квант времени, основываясь на стандартных приоритетах процесса в Linux и т. п.
Администратор физического сервера может устанавливать количество процессорного времени, выделяемого каждому виртуальному серверу, как на основании системы весов (cpuunits
), так и задавая явные пределы (cpulimit
).
OpenVZ предоставляет для каждого виртуального контейнера набор счётчиков, ограничений и гарантий. Имеется набор из примерно 20 параметров, которые выбраны таким образом, чтобы никакой виртуальный контейнер не мог злоупотребить каким-либо ресурсом, и таким образом помешать работе других виртуальных контейнеров на этом же физическом сервере. Смысл порогового и максимального значений может различаться в зависимости от параметра.
По умолчанию для виртуального контейнера устанавливаются достаточно низкие значения ограничителей, поэтому в ряде случаев может оказаться, что выделяемых ресурсов недостаточно для нормального функционирования процесса в контейнере. В случае, если работа процесса завершается ошибкой выделения памяти, ошибкой создания процесса или открытия файла, следует снять показания счётчиков виртуального контейнера:
# cat /proc/user_beancounters >~/user_beancounters.`date "+%Y%m%d-%H%M"`
Затем повторить операцию, которая привела к ошибке, и снова снять показания счётчиков. Затем их нужно сравнить и выяснить, какой из счётчиков failcnt
увеличил значение — соответствующий лимит нужно будет увеличить. Краткое пояснение смысла разных лимитов приведено ниже, более подробную информацию можно найти в man vzctl
. Нужно также принимать во внимание, что некоторые лимиты установлены в блоках (обычно 512 байт), некоторые — в страницах памяти (4 Кб на x86 архитектуре), некоторые в байтах и других натуральных величинах.
kmemsize
numproc
Каждый процесс потребляет некоторое количество памяти ядра: 30–50 килобайт, как минимум 16. Важно иметь достаточно большой зазор между пороговым и максимальным значениями, чтобы не вынуждать ядро завершать процессы, выполняющиеся в виртуальном окружении.lockedpages
mlock
.privvmpages
shmsize
physpages
vmguarpages
oomguarpages
numproc
numflock
numpty
numsiginfo
siginfo
. Установка порогового значения, отличающегося от максимального, не имеет смысла.dcachesize
numfile
numtcpsock
tcpsndbuf
numtcpsock
, умноженного на 2,5.tcprcvbuf
numtcpsock
, умноженного на 2,5.othersockbuf
dgramrcvbuf
numothersock
numiptent
iptables
).
http://openvz.org
http://wiki.openvz.org
http://forum.openvz.org
http://www.freesource.info/wiki/AltLinux/Dokumentacija/OpenVZ
1Текст отчасти основан на http://ru.wikipedia.org/wiki/OpenVZ
2Подробную информацию на эту тему можно найти в Multi-Disk HOWTO (его можно найти в Интернет или в пакете howto-html-en
).