Управление ресурсами в Linux и OpenVZ Кирилл Колышкин kir@openvz.org http://openvz.org/
Отчет - http://yourcmc.ru/wiki/RootConf_2009:_%D0%9E%D1%82%D1%87%D1%91%D1%82_%D0%92%D0%B8%D1%82%D0%B0%D0%BB%D0%B8%D1%8F_%D0%A4%D0%B8%D0%BB%D0%B8%D0%BF%D0%BF%D0%BE%D0%B2%D0%B0#.D0.A3.D0.BF.D1.80.D0.B0.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.80.D0.B5.D1.81.D1.83.D1.80.D1.81.D0.B0.D0.BC.D0.B8_.D0.B2_Linux_.D0.B8_OpenVZ_.28.D0.B7.D0.B0.D1.87.D1.91.D1.82.21.29
2. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
3. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
4. Ресурсы: зачем контролировать?
• Ресурсы не бесконечны
• Сервер один, задач и пользователей много
• Нужна статистика по использованию
• Нужна защита от DoS атак
• Нужно обеспечить качество сервиса
– не только лимиты, но и гарантии
5. Ресурсы: что контролировать?
• Процессор
• Оперативная память и подкачка (swap)
• Дисковое пространство
• Дисковый ввод-вывод (I/O bandwidth)
• Сеть (сокеты, буфера, bandwidth и т.п.)
• Прочее
6. Процессор
Процессорное время раздаётся процессам
маленькими временными отрезками
• Приоритеты (веса)
• Ограничения сверху (лимиты)
• Привязка к конкретным процессорам
(для многопроцессорных систем)
7. Оперативная память
• Память уровня пользователя
– Виртуальная (VM) и физическая (RSS)
– page cache
• Память ядра
– Различные объекты / механизмы выделения
– Особый случай: сетевые буфера
• Пространство подкачки (swap)
8. Диск
• Место
• Пропускная способность ввода-вывода
– Чтение и запись
– Отображения памяти (mmap)
– Подкачка (swapin/swapout)
• Статистика ввода-вывода
9. Сеть
• Тут всё уже решено, говорить не о чем
– ...более или менее
• TC: traffic control
– Шейпинг, шедалинг, политики, ...
• iptables
10. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
11. Контейнеры — это ...
• такая легковесная виртуализация
• много контейнеров поверх единого ядра
• совсем как VM, только
– одна ОС (хотя м.б. разные дистрибутивы)
– «родная» производительность
– высокая плотность размещения
– динамическое управление ресурсами
13. HP labs: OpenVZ vs Xen
• Накладные расходы Xen больше
• Накладными расходами OpenVZ
зачастую можно пренебречь
• Под Xen работало 4 копии интернет-
магазина и сервер уже был перегружен,
под OpenVZ заработало 6 без перегрузки
15. Контейнеры
и управление ресурсами
• Обеспечить мирное сосуществование
множества контейнеров
• С точки зрения управления ресурсами,
контейнеры — это просто группы
процессов!
16. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
17. Процессор
• Каждый процесс имеет nice value,
можно менять «по дороге» (nice/renice)
• Есть приоритет реального времени и
отдельная очередь процессов для него
• Жёсткий лимит на процессорное время
процесса (ulimit -c)
18. Место на диске
• Стандартные UNIX квоты очень хороши
– квоты на точку монтирования
– для пользователей и для групп
– мягкие и жёсткие лимиты, грейс-период
– можно узнать текущие значения
– можно менять лимиты «по дороге»
– приложения ожидают отказов (или должны)
19. Всё остальное: ulimit
• Реализован системными вызовами
setrlimit() и getrlimit()
• Контролирует 16 разных параметров:
core file size, data segment size, scheduling priority, file size, pending signals,
max locked memory, max memory size, number of open files, pipe size,
POSIX message queues, real-time priority, stack size, cpu time, max user processes,
virtual memory, file locks
• Есть «мягкие» и «жёсткие» лимиты
20. ulimit
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 38400
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
21. У ulimit много проблем
• Далеко не все ресурсы учитываются
• Нельзя посмотреть текущее использование
• Лимиты выставляются в текущем контексте
• Все лимиты выставляются на процесс
– кроме NPROC, который на пользователя
• Лимиты на память в основном игнорируются
22. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
23. OpenVZ beancounters
• Контролирует группы процессов
• 20 различных параметров
• Все можно менять во время выполнения
• Для каждого параметра можно видеть:
– Текущее значение, пиковое значение
– Счётчик отказов в выделении ресурса
27. Другие механизмы OpenVZ
• “Честный” планировщик процессов
– веса (приоритеты) и жёсткие лимиты
• Двухуровневая дисковая квота
–I уровень: квоты на контейнер
–II уровень: квоты внутри контейнера
• Приоритет дискового ввода-вывода
28. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
29. Control Groups aka CGroups
• Универсальный механизм для группировки
процессов в иехархические группы
• Различные контроллеры ресурсов
• Можно иметь разные группы для разных
контроллеров
• Управляется через файловую систему
30. Control Groups: управление
mkdir /dev/cgroup
mount -t cgroup none /dev/cgroup
mkdir /dev/cgroup/0
cd /dev/cgroup/0
echo $$ > tasks
cat /proc/self/cgroup
/etc/init.d/httpd start
31. Control Groups: история
• Вначале были cpusets от Bull/SGI
– Для привязки групп задач к NUMA узлам
• Paul Menage из Google разделил cpusets
на инфраструктуру (группировки) и
контроллеры
– сpusets теперь просто один из контроллеров
– можно добавлять другие
32. Memory Controller
• Контролирует память пользователя и page
cache
• Reclamation (утилизация? Переработка?)
– как в try_to_free_pages()
• Out-of-memory killer
35. Повестка дня (aka Agenda)
• Зачем и какие ресурсы контролировать?
• Немного про контейнеры
• Существующие механизмы, их недостатки
• OpenVZ user beancounters, эксплойты
• CGroups и memory controller
• TODO
36. Светлое будущее (TODO)
• Kernel memory controller (уже в -mm)
• Учёт длины маппингов
• «Честный» учёт разделяемых страниц
• Чекпоинтинг
• I/O controller
• Всё, что есть в OpenVZ, портировать в Linux