Использование
систем
виртуализации в веб
часть 2
Чистяков Александр, admin@cezurity.com
Cezurity
Давайте знакомиться и дружить

Я:

    Человек с горы

    Опыт работы в должности не менее трех
    лет

    Навыки администрирования серверных
    систем
Давайте знакомиться и дружить

Вы:

    В зале есть пользователь MacBook?

    Что он тут делает?

    Системные администраторы

    DevOps'ы

    Ответственные за инфраструктуру (CTO,
    архитекторы, etc, etc)
WARNING! DO NOT TRY @HOME!

    Информации будет довольно много!





    Прежде чем внедрять у себя — проверьте!

    Сомневаетесь — не стесняйтесь спросить!
Содержание предыдущих серий

    Первая серия: http://goo.gl/7bYAL

    Началась с того, что виртуализация имеет
    множество применений

    Закончилась тем, что OpenVZ представлялась
    неплохим решением для виртуализации

    А ZFS — неплохим
      решением для
      организации
      хранилища

    Но был ряд проблем
Как скрестить ужа с ежом?

    Напоминаю — ZFS не может быть принята
    в ядро Linux

    Две реализации — ZFS-FUSE и ZFS on
    Linux

    ZFS-FUSE — filesystem in userspace

    Кроме того, ZFS-FUSE заброшен

    ZFS on Linux — единственный живой
    кандидат

    Но был ряд проблем
Хроники внедрения

    ZoL 0.6.0-rc7, Debian 6, OpenVZ





    Постоянно заканчивалась память

    Причина в том, что ARC не очень хорошо
    интегрирован с ядром

    Раз в три-семь дней — падения
Хроники внедрения


    ZoL 0.6.0-rc9, CentOS 6, OpenVZ

    Ограничить размер ARC
     В /etc/modprobe.d/zfs.conf добавить
     options zfs zfs_arc_max=2147483648

    Uptime 210 дней

    Но есть ряд проблем
Проблемы OpenVZ

    Проблема с OpenJDK и FUTEX_WAIT:

    http://goo.gl/N5dFw http://goo.gl/bwQ7a

    http://goo.gl/lS55q

    Проявляется в том, что JVM очень долго
    стартует и при работе расходует CPU

    Решена в RHEL ядрах

    В ядрах Debian Stable не решена

    Кстати, о ядрах, 3.2 уже здесь! (на
    серверах), а где OpenVZ?
Пути решения

    Взяли Oracle JDK — стартует быстро, но
    расход процессора все равно велик

    Сборка ядер от RHEL в deb-пакеты

    Разработчики OpenVZ не рекомендуют
    ядра Debian, только RHEL/CentOS

    Скрипт для сборки deb-пакета:
    http://goo.gl/X0Blo (спасибо, Роман!)

    Сейчас все мои Debian-хосты используют
    ядра от RHEL
Проблемы с OpenVZ на ZFS

    Очень долго работал apt-get на guest'ах

    Особенно это заметно при деплое на 10
    машин на одном хосте

    В ZoL 0.6.0-rc14 уже не наблюдается

    Медленная работа с каталогами, в которых
    много файлов

    А что, если диск виртуализировать в виде
    большого файла, а не части FS хоста?

    Для OpenVZ это делается через ploop, но мы
    не пробовали

    Вместо этого OpenVZ поместили в KVM
    виртуалку (почему, объясню позже)
Какие есть варианты?

    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
Solaris

    Долгая и запутанная история

    Современная ситуация:

    Oracle Solaris 11 — не Open Source

    SmartOS — регулярно обновляется

    OmniOS — регулярно обновляется

    OpenIndiana — редко обновляется,
    предназначена для десктопов

    Illumian — не обновляется, нет KVM

    Несколько других, менее известных сборок:
    http://goo.gl/yihG4
SmartOS

    Делается компанией Joyent

    Составляет основу Joyent Cloud

    Illumos kernel + open source drivers + ported
    KVM + Node.JS

    Управление виртуальными машинами с
    помощью скрипта на JS

    Собственная библиотека образов
    виртуальных машин как для KVM, так и для
    Zones

       Естественно, образы ориентированы
    на нужды Joyent Cloud
Развертывание SmartOS

    Работает с USB flash

      (Hetzner их продает за €40)

    При установке автоматически создает
    mirrored pool

    Так как USB flash монтируется r/o, управление
    конфигами не очень удобно — их нужно
    копировать после рестарта

    Firewall — ipfilter/ipnat

    KVM виртуалки используют ZVOL

    Общий образ клонируется

    Каждая виртуалка — на своем разделе
Использование SmartOS

    Первые десять дней все работало

    Потом хост внезапно перегрузился

    В Solaris есть crash dump раздел

    Хост перезагружался в среднем раз-два в
    неделю, crash dump раздел первый месяц
    был пуст

    Удалось получить дамп

    Получить поддержку у авторов SmartOS не
    удалось никакими путями

    Даже через общих знакомых

    Люди заняты, их можно понять
Наивная диагностика

    По нашим наблюдениям, ребуты происходили
    в моменты возрастания дисковой активности

    Возможно, причина в драйверах контроллера
    диска?

    Странно, использовали обычный ICH9

    Последующие эксперименты с такой же
    дисковой подсистемой, но в OmniOS, не
    выявили проблем

    От SmartOS пришлось отказаться

    Но ряд идей прижился
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 часов)
FreeBSD

    Перешли на 9.0-STABLE и VirtualBox 4.2

    У FreeBSD отличная (!) поддержка

      Несколько раундов переписки в списке
      рассылки про виртуализацию, и
      проблему удалось решить

    Суть проблемы: планировщик ОС
    сбивался

    Решение: отключить HT, отключить
    SpeedStep, после чего планировщик стал
    работать как надо
VirtualBox под FreeBSD

    Иногда guest завершается с segfault

    Иногда guest попадает в T-state, после чего
    его не убить (проявлялось только на одном из
    хостов)

    Иногда guest перестает подавать признаки
    жизни, при подключении к консоли — черный
    экран

    py-supervisor для слежения за guest'ами и
    самодельный скрипт-watchdog для проверки
    доступности по ping

    sysctl debug.debugger_on_panic=0
Управление образами guest'ов

    Файл или raw device?

    Raw device в ZFS — ZVOL

    В два раза медленнее, чем файл

    Запись на ZVOL всегда синхронна!

    (Если не сделано zfs set sync=disabled)

    Но мы об этом узнали уже после того, как
    выбрали файлы в качестве хранилища

    Знание — сила!
Управление образами guest'ов

    Каждый образ на своем ZFS разделе

    Легче бэкапить, легче управлять

    zfs snapshot pool/vol@`date +%F-%H` - и так
    каждый час

    На трех тысячах снэпшотов хост с ZoL начал
    тормозить

    (Сравните это с LVM)

    Разные разделы могут иметь разные
    параметры — сжатие, sync, настройки кэша
Управление образами 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 базу для стейджингов
Кстати, о PostgreSQL

    Коллега обнаружил, что запрос на
    PostgreSQL под FreeBSD работает в пять
    раз медленнее, когда включена
    репликация

    Запись мешает чтению?

    На машине с Linux и включенной
    репликацией запрос работает в пять раз
    быстрее!

    Кто виноват?
Кто виноват?

    Тестовый запрос:

     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 одинаковые
    (дефолтные)
Что делать?

    Делали sync=disabled

    Уменьшали zfs recordsize до 8K (На что
    надеялись? При записи вообще не влияет)

    Пробовали VirtualBox, KVM, PostgreSQL во
    FreeBSD jail

    Ничего не помогает

    Пока не знаю, в чем проблема

    Надо попробовать профайлинг с DTrace
НЕ СПАТЬ, ПОЖАЛУЙСТА!

    Ведь я пока рассказал всего только треть!





    Но если вы — котик, то можно
Тем временем

    Нужно было виртуализировать Windows

    W2K8 как билд-сервер

    Несколько WinXP для прочих нужд

    На хосте Debian Stable + OpenVZ + ZoL

    W2K8 не работает под версией KVM из
    backports — STOP error ......., проблема с
    паравиртуальными драйверами диска

    А XP плохо работает с KVM из Debian
    Stable — постоянные перезагрузки
Паравиртуальные драйвера

    Свободные выходят по несколько раз в
    год, а иногда и в месяц

    Работают как мигалка (“работает”/”не
    работает”), надо подбирать

    Выяснилось, что XP под Debian Testing
    ведет себя значительно стабильнее

    W2K8 тоже работает под KVM из Testing

    Но есть две проблемы:

    Раз в месяц магически отваливается сеть

    OpenVZ не портировано под ядро 3.2.0 из
    состава Debian Testing
Сельхозмагия

    При падении сети помогает зайти на
    консоль XP-виртуалки по VNC и что угодно
    там поделать — сеть вернется

    Через четыре месяца это надоело, и
    вместо KVM был взят хост с Windows и
    Hyper-V, что закрыло вопрос навсегда

    Чтобы сохранить существующие OpenVZ
    контейнеры, их перенесли в Debian Stable
    виртуальную машину, работающую под
    KVM на хосте с Debian Testing
Раз уж речь зашла о KVM

    Я просто не умею ее готовить

    Но с каждым разом узнаю что-нибудь
    новое

    Диски — virtio, тип кэша хорошо бы none,
    но ZFS не поддерживает Direct IO, поэтому
    writeback

    Если сторадж подключен по NFS или
    iSCSI, тип кэша — none

    Копируйте конфигурацию CPU с хоста,
    чтобы не эмулировать лишние инструкции
И еще про KVM

    KSM — Kernel Samepage Merging

    Много одинаковых виртуалок — общая
    память объединяется

    В VirtualBox это называется “Page Fusion”
    и работает только для Windows guests

    Минус: приложение должно само сообщать
    ядру, где находятся одинаковые страницы

    Минус: сканирование идет медленно

    UKSM, PKSM — сторонние пачти, выше
    скорость, не нужны хинты от приложения

    Но я пока не пробовал
Насколько хорош KSM?

    cat /sys/kernel/mm/ksm/pages_sharing

    На одном хосте (много однотипных
    виртуалок) - 3378324

    На другом — 309816

    Скрипт для красивой печати:
    http://goo.gl/LjKvh

    13 гигабайт сэкономлено на первом хосте
    и 1.2 гигабайта на втором

    Визуальные наблюдения подтверждают
Тюнинг на стороне guest

    Планировщик IO по умолчанию CFQ

    Найдите на графике момент переключения
    на deadline





    Используйте deadline или noop!
Выводы

    Третьей части — быть! (я ведь пока еще
    ничего не рассказал про выделенные
    сетевые хранилища)

    Необходимо тщательно подбирать
    инструменты под вашу задачу

    Тем более, что выбор есть

    Очень рекомендую попробовать ZFS в
    любом виде
Вопросы?
Голосуйте за меня на
  http://devconf.ru/offers !

Спасибо!
Чистяков Александр,
Cezurity
admin@cezurity.com
http://alexclear.livejournal.com
https://github.com/alexclear

CodeFest 2013. Чистяков А. — Использование систем виртуализации в веб

  • 1.
    Использование систем виртуализации в веб часть2 Чистяков Александр, admin@cezurity.com Cezurity
  • 2.
    Давайте знакомиться идружить Я:  Человек с горы  Опыт работы в должности не менее трех лет  Навыки администрирования серверных систем
  • 3.
    Давайте знакомиться идружить Вы:  В зале есть пользователь MacBook?  Что он тут делает?  Системные администраторы  DevOps'ы  Ответственные за инфраструктуру (CTO, архитекторы, etc, etc)
  • 4.
    WARNING! DO NOTTRY @HOME!  Информации будет довольно много!  Прежде чем внедрять у себя — проверьте!  Сомневаетесь — не стесняйтесь спросить!
  • 5.
    Содержание предыдущих серий  Первая серия: http://goo.gl/7bYAL  Началась с того, что виртуализация имеет множество применений  Закончилась тем, что OpenVZ представлялась неплохим решением для виртуализации  А ZFS — неплохим решением для организации хранилища  Но был ряд проблем
  • 6.
    Как скрестить ужас ежом?  Напоминаю — ZFS не может быть принята в ядро Linux  Две реализации — ZFS-FUSE и ZFS on Linux  ZFS-FUSE — filesystem in userspace  Кроме того, ZFS-FUSE заброшен  ZFS on Linux — единственный живой кандидат  Но был ряд проблем
  • 7.
    Хроники внедрения  ZoL 0.6.0-rc7, Debian 6, OpenVZ  Постоянно заканчивалась память  Причина в том, что ARC не очень хорошо интегрирован с ядром  Раз в три-семь дней — падения
  • 8.
    Хроники внедрения  ZoL 0.6.0-rc9, CentOS 6, OpenVZ  Ограничить размер ARC В /etc/modprobe.d/zfs.conf добавить options zfs zfs_arc_max=2147483648  Uptime 210 дней  Но есть ряд проблем
  • 9.
    Проблемы OpenVZ  Проблема с OpenJDK и FUTEX_WAIT:  http://goo.gl/N5dFw http://goo.gl/bwQ7a  http://goo.gl/lS55q  Проявляется в том, что JVM очень долго стартует и при работе расходует CPU  Решена в RHEL ядрах  В ядрах Debian Stable не решена  Кстати, о ядрах, 3.2 уже здесь! (на серверах), а где OpenVZ?
  • 10.
    Пути решения  Взяли Oracle JDK — стартует быстро, но расход процессора все равно велик  Сборка ядер от RHEL в deb-пакеты  Разработчики OpenVZ не рекомендуют ядра Debian, только RHEL/CentOS  Скрипт для сборки deb-пакета: http://goo.gl/X0Blo (спасибо, Роман!)  Сейчас все мои Debian-хосты используют ядра от RHEL
  • 11.
    Проблемы с OpenVZна ZFS  Очень долго работал apt-get на guest'ах  Особенно это заметно при деплое на 10 машин на одном хосте  В ZoL 0.6.0-rc14 уже не наблюдается  Медленная работа с каталогами, в которых много файлов  А что, если диск виртуализировать в виде большого файла, а не части FS хоста?  Для OpenVZ это делается через ploop, но мы не пробовали  Вместо этого OpenVZ поместили в KVM виртуалку (почему, объясню позже)
  • 12.
    Какие есть варианты?  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
  • 13.
    Solaris  Долгая и запутанная история  Современная ситуация:  Oracle Solaris 11 — не Open Source  SmartOS — регулярно обновляется  OmniOS — регулярно обновляется  OpenIndiana — редко обновляется, предназначена для десктопов  Illumian — не обновляется, нет KVM  Несколько других, менее известных сборок: http://goo.gl/yihG4
  • 14.
    SmartOS  Делается компанией Joyent  Составляет основу Joyent Cloud  Illumos kernel + open source drivers + ported KVM + Node.JS  Управление виртуальными машинами с помощью скрипта на JS  Собственная библиотека образов виртуальных машин как для KVM, так и для Zones  Естественно, образы ориентированы на нужды Joyent Cloud
  • 15.
    Развертывание SmartOS  Работает с USB flash  (Hetzner их продает за €40)  При установке автоматически создает mirrored pool  Так как USB flash монтируется r/o, управление конфигами не очень удобно — их нужно копировать после рестарта  Firewall — ipfilter/ipnat  KVM виртуалки используют ZVOL  Общий образ клонируется  Каждая виртуалка — на своем разделе
  • 16.
    Использование SmartOS  Первые десять дней все работало  Потом хост внезапно перегрузился  В Solaris есть crash dump раздел  Хост перезагружался в среднем раз-два в неделю, crash dump раздел первый месяц был пуст  Удалось получить дамп  Получить поддержку у авторов SmartOS не удалось никакими путями  Даже через общих знакомых  Люди заняты, их можно понять
  • 17.
    Наивная диагностика  По нашим наблюдениям, ребуты происходили в моменты возрастания дисковой активности  Возможно, причина в драйверах контроллера диска?  Странно, использовали обычный ICH9  Последующие эксперименты с такой же дисковой подсистемой, но в OmniOS, не выявили проблем  От SmartOS пришлось отказаться  Но ряд идей прижился
  • 18.
    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 часов)
  • 19.
    FreeBSD  Перешли на 9.0-STABLE и VirtualBox 4.2  У FreeBSD отличная (!) поддержка  Несколько раундов переписки в списке рассылки про виртуализацию, и проблему удалось решить  Суть проблемы: планировщик ОС сбивался  Решение: отключить HT, отключить SpeedStep, после чего планировщик стал работать как надо
  • 20.
    VirtualBox под FreeBSD  Иногда guest завершается с segfault  Иногда guest попадает в T-state, после чего его не убить (проявлялось только на одном из хостов)  Иногда guest перестает подавать признаки жизни, при подключении к консоли — черный экран  py-supervisor для слежения за guest'ами и самодельный скрипт-watchdog для проверки доступности по ping  sysctl debug.debugger_on_panic=0
  • 21.
    Управление образами guest'ов  Файл или raw device?  Raw device в ZFS — ZVOL  В два раза медленнее, чем файл  Запись на ZVOL всегда синхронна!  (Если не сделано zfs set sync=disabled)  Но мы об этом узнали уже после того, как выбрали файлы в качестве хранилища  Знание — сила!
  • 22.
    Управление образами guest'ов  Каждый образ на своем ZFS разделе  Легче бэкапить, легче управлять  zfs snapshot pool/vol@`date +%F-%H` - и так каждый час  На трех тысячах снэпшотов хост с ZoL начал тормозить  (Сравните это с LVM)  Разные разделы могут иметь разные параметры — сжатие, sync, настройки кэша
  • 23.
    Управление образами 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 базу для стейджингов
  • 24.
    Кстати, о PostgreSQL  Коллега обнаружил, что запрос на PostgreSQL под FreeBSD работает в пять раз медленнее, когда включена репликация  Запись мешает чтению?  На машине с Linux и включенной репликацией запрос работает в пять раз быстрее!  Кто виноват?
  • 25.
    Кто виноват?  Тестовый запрос:  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 одинаковые (дефолтные)
  • 26.
    Что делать?  Делали sync=disabled  Уменьшали zfs recordsize до 8K (На что надеялись? При записи вообще не влияет)  Пробовали VirtualBox, KVM, PostgreSQL во FreeBSD jail  Ничего не помогает  Пока не знаю, в чем проблема  Надо попробовать профайлинг с DTrace
  • 27.
    НЕ СПАТЬ, ПОЖАЛУЙСТА!  Ведь я пока рассказал всего только треть!  Но если вы — котик, то можно
  • 28.
    Тем временем  Нужно было виртуализировать Windows  W2K8 как билд-сервер  Несколько WinXP для прочих нужд  На хосте Debian Stable + OpenVZ + ZoL  W2K8 не работает под версией KVM из backports — STOP error ......., проблема с паравиртуальными драйверами диска  А XP плохо работает с KVM из Debian Stable — постоянные перезагрузки
  • 29.
    Паравиртуальные драйвера  Свободные выходят по несколько раз в год, а иногда и в месяц  Работают как мигалка (“работает”/”не работает”), надо подбирать  Выяснилось, что XP под Debian Testing ведет себя значительно стабильнее  W2K8 тоже работает под KVM из Testing  Но есть две проблемы:  Раз в месяц магически отваливается сеть  OpenVZ не портировано под ядро 3.2.0 из состава Debian Testing
  • 30.
    Сельхозмагия  При падении сети помогает зайти на консоль XP-виртуалки по VNC и что угодно там поделать — сеть вернется  Через четыре месяца это надоело, и вместо KVM был взят хост с Windows и Hyper-V, что закрыло вопрос навсегда  Чтобы сохранить существующие OpenVZ контейнеры, их перенесли в Debian Stable виртуальную машину, работающую под KVM на хосте с Debian Testing
  • 31.
    Раз уж речьзашла о KVM  Я просто не умею ее готовить  Но с каждым разом узнаю что-нибудь новое  Диски — virtio, тип кэша хорошо бы none, но ZFS не поддерживает Direct IO, поэтому writeback  Если сторадж подключен по NFS или iSCSI, тип кэша — none  Копируйте конфигурацию CPU с хоста, чтобы не эмулировать лишние инструкции
  • 32.
    И еще проKVM  KSM — Kernel Samepage Merging  Много одинаковых виртуалок — общая память объединяется  В VirtualBox это называется “Page Fusion” и работает только для Windows guests  Минус: приложение должно само сообщать ядру, где находятся одинаковые страницы  Минус: сканирование идет медленно  UKSM, PKSM — сторонние пачти, выше скорость, не нужны хинты от приложения  Но я пока не пробовал
  • 33.
    Насколько хорош KSM?  cat /sys/kernel/mm/ksm/pages_sharing  На одном хосте (много однотипных виртуалок) - 3378324  На другом — 309816  Скрипт для красивой печати: http://goo.gl/LjKvh  13 гигабайт сэкономлено на первом хосте и 1.2 гигабайта на втором  Визуальные наблюдения подтверждают
  • 34.
    Тюнинг на сторонеguest  Планировщик IO по умолчанию CFQ  Найдите на графике момент переключения на deadline  Используйте deadline или noop!
  • 35.
    Выводы  Третьей части — быть! (я ведь пока еще ничего не рассказал про выделенные сетевые хранилища)  Необходимо тщательно подбирать инструменты под вашу задачу  Тем более, что выбор есть  Очень рекомендую попробовать ZFS в любом виде
  • 36.
    Вопросы? Голосуйте за меняна http://devconf.ru/offers ! Спасибо! Чистяков Александр, Cezurity admin@cezurity.com http://alexclear.livejournal.com https://github.com/alexclear