Опыт применения виртуализации для web-систем часть 2

37
Использование систем виртуализации в веб часть 2 Чистяков Александр, [email protected] Cezurity

Transcript of Опыт применения виртуализации для web-систем часть 2

Page 1: Опыт применения виртуализации для web-систем часть 2

Использование систем виртуализации в веб

часть 2

Чистяков Александр, [email protected]

Cezurity

Page 2: Опыт применения виртуализации для web-систем часть 2

Давайте знакомиться и дружить

Я: Человек с горы Опыт работы в должности не менее трех

лет Навыки администрирования серверных

систем

Page 3: Опыт применения виртуализации для web-систем часть 2

Давайте знакомиться и дружить

Вы: В зале есть пользователь MacBook? Что он тут делает? Системные администраторы DevOps'ы Ответственные за инфраструктуру (CTO,

архитекторы, etc, etc)

Page 4: Опыт применения виртуализации для web-систем часть 2

WARNING! DO NOT TRY @HOME! Информации будет довольно много!

Прежде чем внедрять у себя — проверьте! Сомневаетесь — не стесняйтесь спросить!

Page 5: Опыт применения виртуализации для web-систем часть 2

Содержание предыдущих серий Первая серия: http://goo.gl/7bYAL Началась с того, что виртуализация имеет

множество применений Закончилась тем, что OpenVZ представлялась

неплохим решением для виртуализации А ZFS — неплохим

решением для организации хранилища

Но был ряд проблем

Page 6: Опыт применения виртуализации для web-систем часть 2

За что боремся?

Дешевое железо А софт лучше вообще бесплатный И бэкап дешевый, часто Клонирование, “дедупликация” Вот почему я обращаю пристальное

внимание на CoW файловые системы

Page 7: Опыт применения виртуализации для web-систем часть 2

Как скрестить ужа с ежом? Напоминаю — ZFS не может быть принята

в ядро Linux Две реализации — ZFS-FUSE и ZFS on

Linux ZFS-FUSE — filesystem in userspace Кроме того, ZFS-FUSE заброшен ZFS on Linux — единственный живой

кандидат Но был ряд проблем

Page 8: Опыт применения виртуализации для web-систем часть 2

Хроники внедрения ZoL 0.6.0-rc7, Debian 6, OpenVZ

Постоянно заканчивалась память Причина в том, что ARC не очень хорошо

интегрирован с ядром Раз в три-семь дней — падения

Page 9: Опыт применения виртуализации для web-систем часть 2

Хроники внедрения

ZoL 0.6.0-rc9, CentOS 6, OpenVZ Ограничить размер ARC

В /etc/modprobe.d/zfs.conf добавить

options zfs zfs_arc_max=2147483648

Uptime 210 дней Но есть ряд проблем

Page 10: Опыт применения виртуализации для web-систем часть 2

Проблемы OpenVZ Проблема с OpenJDK и FUTEX_WAIT: http://goo.gl/N5dFw http://goo.gl/bwQ7a http://goo.gl/lS55q Проявляется в том, что JVM очень долго

стартует и при работе расходует CPU Решена в RHEL ядрах В ядрах Debian Stable не решена Кстати, о ядрах, 3.2 уже здесь! (на

серверах), а где OpenVZ?

Page 11: Опыт применения виртуализации для web-систем часть 2

Пути решения Взяли Oracle JDK — стартует быстро, но

расход процессора все равно велик Сборка ядер от RHEL в deb-пакеты Разработчики OpenVZ не рекомендуют

ядра Debian, только RHEL/CentOS Скрипт для сборки deb-пакета:

http://goo.gl/X0Blo (спасибо, Роман!) Сейчас все мои Debian-хосты используют

ядра от RHEL

Page 12: Опыт применения виртуализации для web-систем часть 2

Проблемы с OpenVZ на ZFS Очень долго работал apt-get на guest'ах Особенно это заметно при деплое на 10

машин на одном хосте В ZoL 0.6.0-rc14 уже не наблюдается Медленная работа с каталогами, в которых

много файлов А что, если диск виртуализировать в виде

большого файла, а не части FS хоста? Для OpenVZ это делается через ploop, но мы

не пробовали Вместо этого OpenVZ поместили в KVM

виртуалку (почему, объясню позже)

Page 13: Опыт применения виртуализации для web-систем часть 2

Какие есть варианты? Linux, OpenVZ, ZoL ZFS BTRFS — с версии ядра 3.7+, не раньше HAMMER — а виртуализировать чем? Linux FreeBSD Solaris NetBSD — порт ZFS пока не готов MacOS X — человек с MB еще здесь? OpenVZ VirtualBox — Solaris, Linux, FreeBSD KVM — Linux, Solaris FreeBSD jails Solaris zones

Page 14: Опыт применения виртуализации для web-систем часть 2

Solaris Долгая и запутанная история Современная ситуация: Oracle Solaris 11 — не Open Source SmartOS — регулярно обновляется OmniOS — регулярно обновляется OpenIndiana — редко обновляется,

предназначена для десктопов Illumian — не обновляется, нет KVM Несколько других, менее известных сборок:

http://goo.gl/yihG4

Page 15: Опыт применения виртуализации для web-систем часть 2

SmartOS Делается компанией Joyent Составляет основу Joyent Cloud Illumos kernel + open source drivers + ported

KVM + Node.JS Управление виртуальными машинами с

помощью скрипта на JS Собственная библиотека образов

виртуальных машин как для KVM, так и для Zones

Естественно, образы ориентированы на нужды Joyent Cloud

Page 16: Опыт применения виртуализации для web-систем часть 2

Развертывание SmartOS Работает с USB flash (Hetzner их продает за €40) При установке автоматически создает

mirrored pool Так как USB flash монтируется r/o, управление

конфигами не очень удобно — их нужно копировать после рестарта

Firewall — ipfilter/ipnat KVM виртуалки используют ZVOL Общий образ клонируется Каждая виртуалка — на своем разделе

Page 17: Опыт применения виртуализации для web-систем часть 2

Использование SmartOS Первые десять дней все работало Потом хост внезапно перегрузился В Solaris есть crash dump раздел Хост перезагружался в среднем раз-два в

неделю, crash dump раздел первый месяц был пуст

Удалось получить дамп Получить поддержку у авторов SmartOS не

удалось никакими путями Даже через общих знакомых Люди заняты, их можно понять

Page 18: Опыт применения виртуализации для web-систем часть 2

Наивная диагностика По нашим наблюдениям, ребуты происходили

в моменты возрастания дисковой активности Возможно, причина в драйверах контроллера

диска? Странно, использовали обычный ICH9 Последующие эксперименты с такой же

дисковой подсистемой, но в OmniOS, не выявили проблем

От SmartOS пришлось отказаться Но ряд идей прижился

Page 19: Опыт применения виртуализации для web-систем часть 2

FreeBSD Начинали с 9.0-RELEASE и VirtualBox 4.1.6 Железо: Core i7-3930K (HT, SpeedStep) Для установки FreeBSD использовался

скрипт zfs-hetzner-9.0.sh (google it!), впоследствии модифицированный мной для 9.1

Проблемы начались сразу — виртуальные машины работали с разной скоростью в разные моменты времени (инсталляция Debian занимала от 20 минут до 2 часов)

Page 20: Опыт применения виртуализации для web-систем часть 2

FreeBSD Перешли на 9.0-STABLE и VirtualBox 4.2 У FreeBSD отличная (!) поддержка Несколько раундов переписки в списке

рассылки про виртуализацию, и проблему удалось решить

Суть проблемы: планировщик ОС сбивался

Решение: отключить HT, отключить SpeedStep, после чего планировщик стал работать как надо

Page 21: Опыт применения виртуализации для web-систем часть 2

VirtualBox под FreeBSD Иногда guest завершается с segfault Иногда guest попадает в T-state, после чего

его не убить (проявлялось только на одном из хостов)

Иногда guest перестает подавать признаки жизни, при подключении к консоли — черный экран

py-supervisor для слежения за guest'ами и самодельный скрипт-watchdog для проверки доступности по ping

sysctl debug.debugger_on_panic=0

Page 22: Опыт применения виртуализации для web-систем часть 2

Управление образами guest'ов Файл или raw device? Raw device в ZFS — ZVOL В два раза медленнее, чем файл Запись на ZVOL всегда синхронна! (Если не сделано zfs set sync=disabled) Но мы об этом узнали уже после того, как

выбрали файлы в качестве хранилища Знание — сила!

Page 23: Опыт применения виртуализации для web-систем часть 2

Управление образами guest'ов Каждый образ на своем ZFS разделе

Легче бэкапить, легче управлять zfs snapshot pool/vol@`date +%F-%H` - и так

каждый час

На трех тысячах снэпшотов хост с ZoL начал тормозить

(Сравните это с LVM) Разные разделы могут иметь разные

параметры — сжатие, sync, настройки кэша

Page 24: Опыт применения виртуализации для web-систем часть 2

Управление образами guest'ов zfs snapshot pool/vm1@master-copy zfs clone pool/vm1@master-copy pool/vm2 zfs clone pool/vm1@master-copy pool/vm3 Теперь у нас не один, а три одинаковых

образа VM А места на диске они занимают как один,

пишутся только изменения Мы так клонировали 100-гигабайтную

PostgreSQL базу для стейджингов

Page 25: Опыт применения виртуализации для web-систем часть 2

Кстати, о PostgreSQL Коллега обнаружил, что запрос на

PostgreSQL под FreeBSD работает в пять раз медленнее, когда включена репликация

Запись мешает чтению? На машине с Linux и включенной

репликацией запрос работает в пять раз быстрее!

Кто виноват?

Page 26: Опыт применения виртуализации для web-систем часть 2

Кто виноват? Тестовый запрос: update users set phone_number=id where id in (select

id from users offset 200000 limit 50000);

Ubuntu с ext4 — 15 минут FreeBSD, Linux/ZoL, Solaris с экспортом по

iSCSI, Solaris с экспортом по NFS — примерно 75 минут

Настройки PostgreSQL одинаковые (дефолтные)

Page 27: Опыт применения виртуализации для web-систем часть 2

Что делать? Делали sync=disabled Уменьшали zfs recordsize до 8K (На что

надеялись? При записи вообще не влияет) Пробовали VirtualBox, KVM, PostgreSQL во

FreeBSD jail Ничего не помогает Пока не знаю, в чем проблема Надо попробовать профайлинг с DTrace

Page 28: Опыт применения виртуализации для web-систем часть 2

НЕ СПАТЬ, ПОЖАЛУЙСТА! Ведь я пока рассказал всего только треть!

Но если вы — котик, то можно

Page 29: Опыт применения виртуализации для web-систем часть 2

Тем временем Нужно было виртуализировать Windows W2K8 как билд-сервер Несколько WinXP для прочих нужд На хосте Debian Stable + OpenVZ + ZoL W2K8 не работает под версией KVM из

backports — STOP error ......., проблема с паравиртуальными драйверами диска

А XP плохо работает с KVM из Debian Stable — постоянные перезагрузки

Page 30: Опыт применения виртуализации для web-систем часть 2

Паравиртуальные драйвера Свободные выходят по несколько раз в

год, а иногда и в месяц Работают как мигалка (“работает”/”не

работает”), надо подбирать Выяснилось, что XP под Debian Testing

ведет себя значительно стабильнее W2K8 тоже работает под KVM из Testing Но есть две проблемы: Раз в месяц магически отваливается сеть OpenVZ не портировано под ядро 3.2.0 из

состава Debian Testing

Page 31: Опыт применения виртуализации для web-систем часть 2

Сельхозмагия При падении сети помогает зайти на

консоль XP-виртуалки по VNC и что угодно там поделать — сеть вернется

Через четыре месяца это надоело, и вместо KVM был взят хост с Windows и Hyper-V, что закрыло вопрос навсегда

Чтобы сохранить существующие OpenVZ контейнеры, их перенесли в Debian Stable виртуальную машину, работающую под KVM на хосте с Debian Testing

Page 32: Опыт применения виртуализации для web-систем часть 2

Раз уж речь зашла о KVM Я просто не умею ее готовить Но с каждым разом узнаю что-нибудь

новое Диски — virtio, тип кэша хорошо бы none,

но ZFS не поддерживает Direct IO, поэтому writeback

Если сторадж подключен по NFS или iSCSI, тип кэша — none

Копируйте конфигурацию CPU с хоста, чтобы не эмулировать лишние инструкции

Page 33: Опыт применения виртуализации для web-систем часть 2

И еще про KVM KSM — Kernel Samepage Merging Много одинаковых виртуалок — общая

память объединяется В VirtualBox это называется “Page Fusion”

и работает только для Windows guests Минус: приложение должно само сообщать

ядру, где находятся одинаковые страницы Минус: сканирование идет медленно UKSM, PKSM — сторонние пачти, выше

скорость, не нужны хинты от приложения Но я пока не пробовал

Page 34: Опыт применения виртуализации для web-систем часть 2

Насколько хорош KSM? cat /sys/kernel/mm/ksm/pages_sharing На одном хосте (много однотипных

виртуалок) - 3378324 На другом — 309816 Скрипт для красивой печати:

http://goo.gl/LjKvh 13 гигабайт сэкономлено на первом хосте

и 1.2 гигабайта на втором Визуальные наблюдения подтверждают

Page 35: Опыт применения виртуализации для web-систем часть 2

Тюнинг на стороне guest Планировщик IO по умолчанию CFQ Найдите на графике момент переключения

на deadline

Используйте deadline или noop!

Page 36: Опыт применения виртуализации для web-систем часть 2

Выводы

Третьей части — быть! (я ведь пока еще ничего не рассказал про выделенные сетевые хранилища)

Необходимо тщательно подбирать инструменты под вашу задачу

Тем более, что выбор есть Очень рекомендую попробовать ZFS в

любом виде

Page 37: Опыт применения виртуализации для web-систем часть 2

Вопросы?

Спасибо!

Чистяков Александр,Cezurity

[email protected]

http://alexclear.livejournal.com

https://github.com/alexclear