linuxvirt seminar-csc-2015
TRANSCRIPT
2
Namespace vs CGroups
● Namespace – механизм изоляции и группировки структур данных ядра.
● Control groups – механизм изоляции ресурсов ядра
3
Представление процесса в linux
include/linux/sched.h, include/linux/nsproxy.h
http://lxr.free-electrons.com/source/include/linux/sched.h#L1273http://lxr.free-electrons.com/source/include/linux/nsproxy.h#L29
7
Mount namespace
● mount namespace – копия дерева файловой системы, ассоциированная с процессом
● Создание:
● Опции:– распространение событий монтирования
– запрет перемонтирования
8
Флаги mount
– bind – смонтировать существующее дерево в другую точку (поддерево будет доступно в обоих местах)
Распространение изменений:
–make-shared
–make-slave
–make-private
–make-unbindable
Подробнее: Documentation/filesystems/sharedsubtree.txt
12
Удержание пространства имен
#touch ./uts
#mount —bind /proc/6221/ns/uts ./uts
см: namespaces/ns_exec.c
# hostname
– thinkpad
#./ns_exec ./uts hostname
– newhostname
13
PID namespace
● Назначение: изоляция идентификаторов процессов● Создание
● Возможности:– миграция контейнеров с сохранением PIDs
– имитация init-процесса
– могут быть вложенными
17
IPC namespace
● Изоляция ресурсов IPC (System V IPC) – очередей сообщений, разделяемая память...
● Создание:
18
USER namespace
● Изоляция идентификаторов пользователей и групп● Создание:
● Возможности:– Предоставление привилегированных операций
непривилегированному пользователю внутри пространства имен
– Отображение пользователей и групп
● /proc/sys/kernel/overflowuid
20
Network namespace
● Изоляция сетевой конфигурации, интерфейсов, правил марштуризации
● Создание:
Примеры (через ip):– ip netns add netns1
– ip netns exec netns1 ip link list
– ip netns delete netns1
– ip netns exec netns1 ip link set dev lo up
– ip netns exec netns1 ping 127.0.0.1
21
Control groups
● Подсистемы Linux (немного истории)● Иерархия ресурсов и контрольные группы● Обзор контроллеров● Примеры
22
Подсистема и контрольная группа
● Подсистема (subsystem) – модуль предоставляющий возможности для группировки и управления (ограничение, подсчет использования,...) определенными ресурсами процессов.
● Контрольная группа (Control Group, cgroup) – множество параметров, ассоциированное с одной или более подсистем.
23
Иерархии ресурсов
Процесс: - память - процессор - устройства - ввод-вывод - ...
Память(100%): - процессы пользователей (30%) - работники - QA (5%) - разработчики (15%) - гости - системные (10%) - архиватор - анализаторы логов - службы (50%) - почта (10%) - продуктовая БД (40%)
Устройства: - /dev/* -- /dev/sda – /dev/snd
CPUs 0-15: - продуктовые сервисы 0-8 - пользователи: 9-12 - службы: 13-15
Процесс: - память - процессор - устройства - ввод-вывод - ...
Процесс: - память - процессор - устройства - ввод-вывод - ...
24
Подсистемы = контроллеры
● blkio – управление вводом выводом блочных устройств● cpu – управление доступом к процессору● cpuacc – отчеты по использованию процессора● cpuset – приязка к процессорам и банкам памяти● devices – доступ к устройствам● freezer – останов/возобновление работы группы● memory – ограничения и учет использования памяти● net_cls – маркировка пакетов для контроллера трафика
25
Файлы cgroup
● /proc/cgroups● /proc/self/cgroup – группы процесса● /sys/fs/cgroup/ (/cgroup) – корень иерархии ● */tasks – PIDs участников группы● */cgroup.procs – список thread groups● */notify_on_release – флаг вызова агента
разрушения (по-умолчанию 0)● */release_agent – путь к агенту разрушения
27
cgcreate: cоздание группы
● cgcreate
-t uid:gid – пользователи получающие права на перемещение заданий в(из) группу
-a uid:gid – пользователи получающие права на управление параметрами группы
-g список подсистем (контроллеров):путь
● Пример
cgcreate -t kkv:kkv -g memory,cpu:/mycgroup
28
cgdelete: удаление группы
● cgdelete
-g список подсистем (контроллеров):путь
● Пример
cgdelete -g memory,cpu:/mycgroup
(*) при удалении группы, входящие в нее задачи перемещаются в родительскую группу
29
Перемещение процессов в группу
● cgclassify
-g список подсистем (контроллеров):путь
PID [PID PID …]
Примеры:$cgclassify -g cpu:/mycgroup 6433 3662
$echo 6433 >/sys/fs/cgroup/cpu/mucgroup/tasks
30
Выполнение процесса в группе
● cgexec
-g список подсистем (контроллеров):путь
имя_приложения
● Пример
cgexec -g memory:/mycgroup google-chrome
32
cgget – доступ к параметрам
● cgget
-r параметр группа
Пример:
$cgget -r cpu.shares /mycgroup
>/mycgroup:
>cpu.shares: 1024
cat /sys/fs/cgroup/cpu/mycgroup/cpu.shares
>1024
33
cgset – установка параметров
● cgset
-r параметр=значение
Пример:
$cgset -r cpu.shares=8 /mycgroup
$echo 9 >/sys/fs/cgroup/cpu/mycgroup/cpu.shares
34
Контроллер cpuset
● Назначение: управление привязкой процессоров и памяти к процессам
● ←/→ cpuset. cpus – список привязанных процессоров● ←/→ cpuset. mems – список привязанных процессоров● ←/→ cpuset. cpu_exclusive – флаг эксклюзивного
использования процессора группой● ←/→ cpuset.sched_load_balance +
cpuset.sched_relax_domain_level – управление балансировкой нагрузки в группе
try: cat /proc/self/status
35
cpuset.sched_relax_domain_level
● -1 – не менять внешние правила● 0 – периодическая балансировка● 1 – немедленная между потоками одного ядра● 2 – немедленная между ядрами пакета ● 3 – немедленная в рамках узла● 4 – немедленная между процессорами на NUMA
системе● 5 – немедленная по всей системе
try: cat /proc/self/status
36
Контроллер cpu
● Назначение: управление распределеним нагрузки на процессоры
cpu.shares – доля использования процессора по отношению к другим группам
cpu.rt_runtime_us – максимальноый период монопольного использования процессора в микросекундах
cpu.rt_period_us – максимальное время ожидания процессора группой
37
Контроллер cpuacct
● Назначение: сбор статистики по использованию процессора
cpuacct.stat – число циклов процессора
cpuacct.usage – суммарное время
cpuacct.usage_percpu – число циклов процессора, включая задания подгрупп
38
Контроллер devices
● Назначение: управление доступом к устройствам из группы
→devices.allow – устройства доступные группе
→devices.deny – запрещенные устройства в группе
←devices.list – просмотр устройств в whitelist
Примеры:echo 'c 1:3 mr' > /sys/fs/cgroup/1/devices.allow
echo a > /sys/fs/cgroup/1/devices.deny
echo a > /sys/fs/cgroup/1/devices.allow
https://www.kernel.org/doc/Documentation/devices.txt
39
Контроллер freezer
● Назначение: заморозка/разморозка исполнения группы процессов
←/→freezer.state – состояние заморозки● FROZEN — задания приостановлены● FREEZING – в стадии приостановки (включая группы-потомки)● THAWED – возобновление работы
● ←freezer.self_freezing собственное состояние заморозки
● ←freezer.parent_freezing родительское состояние состояние заморозки
40
Контроллер memory
● Назначение: управление и мониторинг использования памяти
←memory.stat – получение статистики по использованию памяти– total_ – текущая группа и подгруппы
←memory.[memsw.]usage_in_bytes – используемая память в байтах (в подкачке)
←/→memory.[memsw.]limit_in_bytes
←memory.[memsw.].failcnt – счетчик числа достижений лимита памяти
←/→memory.oom_control — флаг разрешения OOM-killer
(*) ←/→memory.soft_limit_in_bytes — флаг разрешения OOM-killer
см https://www.kernel.org/doc/Documentation/cgroups/memory.txt
41
Контроллер blkio
● → blkio.weight – [100-1000], относительный вес ввода вывода в группе
● → blkio.weight – [100-1000], относительный вес ввода вывода в группе для конкретного устройства
● ← blkio.time – время доступа ввода-вывода в группе● ← blkio.sectors – количество перемещенных между устройствами
секторов в группе● ← blkio.io_service_bytes – количество перемещенных между
устройствами байт в группе● ← blkio.io_service_time – время между выдачей запроса и его
завершением● ← blkio.io_queued – число запросов в очереди ввода вывода группы
Миссия
● Docker:– простой и лекговесный путь от модели к
реальности
– минимизация риска падения приложений при переносе из окружения разработки в «боевые условия»
– Ускорение code->test->deploy->use
Технические компоненты
● libcontainer format● kernel namespaces
– fs isolation
– process isolation
– network isolation
● CoW FS● логирование STDOUT, STDIN,STDERR● CLI● GUI (сторонние разработки)
Контейнер Docker
● Формат образа● Набор стандартных операций● Исполнительная среда
Метафора: контейнер содержит образ программного обеспечения – груз, и над ним возможны операции: создание, старт, останов...
Установка
– ядро 3.8+
– x64
– Хранилище:● Device Mapper ● AUFS● vfs● btrfs
– curl
● sudo sh -c "echo deb https://get.docker.io/ubuntu docker main >/etc/apt/sources.list.d/docker.list"
● curl -s https://get.docker.io/gpg | sudo apt-key add -● sudo apt-get update && sudo apt-get install lxc-docker● sudo docker info
Hello world #1
#docker#docker version#docker search tutorial#docker pull learn/tutorial#docker run echo "Hello world"
run & start
● -t псевдотерминал● -i оставить STDIN открытым● имя образа● команда (например /bin/bash)
Создание образа
● Действия в контейнере + commit● Dockerfile + build
– FROM
– MAINTAINER
– RUN
– CMD
– EXPOSE
– VOLUME
– ...
ex: #docker build --rm -t repo:image .
54
Для чтения
● RHEL System resources management guide● https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt
● https://www.kernel.org/doc/Documentation/cgroups/memory.txt
● https://www.docker.com/
● https://www.docker.com/tryit/● http://hub.docker.com● http://www.netpatch.ru/research/docker/2014/03.24-linux-docker-practica
l-guide.html● James Turnbull «The Docker Book»● http://www.ibm.com/developerworks/library/l-mount-namespaces/● http://lwn.net/Articles/531114/● https://github.com/krinkin/oslinux-seminars-2015/