Kir Kolyshkin (k001) wrote,
Kir Kolyshkin
k001

Category:

мифы и сказания про OpenVZ

Недавно мне рассказывали, что в Яндексе довольно много используют OpenVZ. Это приятно. Конечно, было бы приятнее, если бы ещё и патчи нам присылали (как, например, делают похожие крупные продвинутые пользователи -- ALTLinux, Proxmox или Debian -- впрочем, это не совсем та категория, наверное, неудачный пример). Ну да ладно, может, всё ещё впереди. Так вот, мне про Яндекс говорили на словах, а сегодня я получил некоторым образом документальное подтверждение. Павел Воробьёв, руководитель службы администрирования коммуникационных сервисов Яндекса, в своём блоге пишет: "... система OpenVZ, широко применяющаяся в нашей группе администрирования". Повторюсь -- это приятно.

Неприятно то, что Павел в своей заметке допустил несколько, скажем так, неточностей. Мне это не нравится, потому что его же люди читают, и они тоже будут думать неправильно. Поэтому я хочу тут всё это разобрать. Поехали.

Изолированием занимается демон openvz, он создает процессам ощущение изолированности, эмулирует дисковую подсистему, занимается распределением памяти

Демон примерещился. Нету там никакого демона. Всем вышеперечисленным занимается ядро. Да, и слово "ощущение" там тоже лишнее. Дисковая подсистема совсем никак не "эмулируется" -- для изоляции диска используется тот самый пресловутый chroot(). Память распределяет тоже ядро. Вообще, OpenVZ -- это модифицированное ядро Linux плюс кое-какие утилиты. Функциональность, достигаемая патчами в ядро, делится примерно на три части:
1. Изоляция/виртуализация, или namespaces. Это, условно говоря, chroot() для всего, что предоставляет ядро, например, "chroot" для дерева процессов, для сетевого стека, для разделяемой памяти (IPC shmem) и т.п. Все эти "чруты" в совокупности дают возможность создавать изолированные окружения, которые мы называем контейнерами. Однако, этого недостаточно, поэтому идём дальше.
2. Управление ресурсами. Так как все контейнеры работают на одном-единственном ядре, а оно -- на одном-единственном сервере, то у нас на все контейнеры есть один-единственный набор ресурсов -- память, процессор, диск, сеть и т.п. Всё это надо как-то разруливать, чтобы какой-нибудь один контейнер, например, не скушал всю память. Подсистему управления ресурсами, в свою очередь, можно поделить на 4-5 частей. Тут ещё много можно писать, но для ясности поскипаю.
3. Живая миграция. То есть, возможность заморозить контейнер и скинуть его замороженный образ на диск, а потом оттуда разморозить обратно в память и продолжить выполнение. Собственно, поверх этого живая миграция -- несложный скрипт на шелле, замораживающий контейнер на одной машине и размораживающий на другой.

виртуалки openvz получают максимальную производительность в ущерб точному распределению ресурсов.

Эта фраза тоже странная. Распределение ресурсов у нас как раз вполне даже точное (и на эту тему я могу рассказать очень много, было бы кому). Ущерб (а точнее, то свойство технологии, благодаря которому мы имеем хорошую производительность) заключается в том, что мы не можем запустить не-Линукс.

Так же мы лишаемся еще одного неоспоримого плюса полной или пара-виртуализации: ядро во всех виртуалках общее, при возникновении lock-а в ядре, он так же будет общим. При зависании ядра по каким-то причинам, мы теряем хост-систему целиком.

Про OpenVZ тут верно, но не надо думать, что в полной или пара-виртуализации всё совсем по-другому. Там разные ядра работают отнюдь не поверх железки, а поверх гипервизора/монитора. Монитор -- это тоже такое маленькое ядро, и оно одно, на всех общее. Если в нём случится глюк или лок -- это тоже для всех. Разница лишь в том, что монитор обычно меньше и проще, чем ядро Линукса, да и локов в нём меньше, но это различие не столько качественное, сколько количественное (хотя тут можно и поспорить).

В жизни все не так радужно. В какой-то момент патчи OpenVZ были благополучно выкинуты из мейнстрим-ядра linux со словами "мы такое поддерживать не хотим".

В этом месте я просто-таки не могу удержаться от сакраментального вопроса (да, я знаю, что это боян, бородатый канадский боян, но всё же, всё же) -- где, ну где вы берёте такую траву? Отсыпьте, пожалуйста, нашему коллективу полкоробка, а то кофе уже вообще не берёт.

Серьёзно, я даже не знаю, как на это возразить. Я неоднократно описывал, как мы работаем с мейнстримом, наверное, надо ещё раз рассказать?

У нас есть OpenVZ -- большой набор патчей, реализующих разную функциональность для контейнеров. Эта функциональность делится на некие "кирпичики", составляющие. Ну, например, network namespaces -- возможность иметь в ядре Линукса не одну сущность под названием "сетевая подсистема", а много. Эта сущность включает в себя экземпляр TCP/IP стека, таблицы маршрутизации, таблицы фаерволлинга, всякие разные кеши и хеши, ну и собственно сами сетевые устройства. Возможность создавать свои отдельные экземпляры сетевой подсистемы, отдавать его контейнеру, прокидывать туда устройства и т.п. -- это и есть один из "кирпичиков", из которых построена OpenVZ.

Так вот, время от времени мы берём такой кирпичик и пытаемся воссоздать его в мейнстрим-ядре. Не просто послать на linux-kernel@ часть наших патчей, а именно воссоздать, то есть по сути с нуля, заново реализовать, представить на суд общественности, получить комментарии, поправить, представить на суд общественности -- и так далее, пока или оно не будет принято, или кончится терпение и мы плюнем на это неподъёмное дело. Вот таким примерно образом мы "засовываем" OpenVZ в мейнстрим ядро. Надо сказать, что OpenVZ целиком в мейнстриме никогда не было, и никто его оттуда никогда не выкидывал (и ничего из того, чего мы туда действительно запихали, тоже не выкидывал). После того, как "кирпичик" появляется в мейнстриме, мы выкидываем аналогичную часть из нашего патча и адаптируемся к мейнстримному (иногда написанному нами же, иногда нет).

Ну и последняя цитата на сегодня:

На смену OpenVZ в мейнстрим пришли lxc - linux containers.

Этот вопрос мало кем освещён, тут точно стоит рассказать, как оно на самом деле.

Существует несколько разных людей и команд, которые заинтересованы в том, чтобы в Линуксе (в мейнстрим-ядре) появились контейнеры и вся сопутствующая функциональность. Одна из таких команд -- OpenVZ. Как я выше написал, мы самбитим патчи в мейнстрим, иногда их даже принимают (какое-то время Parallels даже был в top10 linux contributing companies). Одна из других команд -- это ребята из IBM (Франция, Индия, США). Их много и они упорные, и кроме некоторых патчей в ядро, они пишут свои утилиты. Вот LXC -- это то, что есть в менйстримном ядре (включая патчи от OpenVZ, IBM и других людей типа Эрика Бидермана), плюс эти самые lxc утилиты. В противоположность, OpenVZ -- это то, что в мейнстримном ядре, плюс наши патчи, плюс наши утилиты. Что из этого всего следует -- решать вам.
Tags: fun, openvz, work, wtf
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 48 comments