Промышленное ускорение сайтов / Николай Мациевский (Айри.рф)
CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
Transcript of CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев
CRIU: Ускорение запуска PHP в CloudLinux OS
Купреев Руслан Москва, 2015
Содержание
2
● Что такое mod_lsapi?
● LVE+CageFS vs OVZ, LXC
● C/R LVE+CageFS
● Результаты
mod_lsapi
3
HTTPD -- root
VH1
VH2
Starter(HTTPD child) -- nobody
lsphp -- user1
lsphp -- user2
HTTPD -- nobody request
HTTPD -- nobody request
HTTPD -- nobody request
LVE + CageFS
LVE + CageFS
Старт lsphp
4
Starter(HTTPD child) -- nobody
... preparation(closing fds, cleaning env, etc) ... lve_enter() ... lve_jail() ... fork() + exec(lsphp) … lve_exit()
lsphp -- user1
... opening and reading all the configs ... serving … exit()
Старт lsphp
5
Starter(HTTPD child) -- nobody
... preparation(closing fds, cleaning env, etc) ... lve_enter() ... lve_jail() ... fork() + exec(lsphp) … lve_exit()
lsphp -- user1
... opening and reading all the configs ... serving … exit()
Старт lsphp
6
Starter(HTTPD child) -- nobody
... preparation(closing fds, cleaning env, etc) ... lve_enter() ... lve_jail() ... fork() + exec(lsphp) … lve_exit()
lsphp -- user1
... opening and reading all the configs … criu_dump() ... serving … exit()
Старт lsphp
7
Starter(HTTPD child) -- nobody
... criu_restore() ...
lsphp -- user1
... serving … exit()
LVE+CageFS
8
LVE + CageFS OVZ, LXC
LVE + CageFS
OVZ, LXC
LVE+CageFS
9
OVZ, LXC
Типичный контейнер
10
init
vim
sh
cron
gcc
LVE + CageFS
LVE+CageFS
11
vim
sh
cron
gcc
php
python
ruby
OVZ, LXC
Типичный контейнер
12
MNTNSCGROUPS
LVE + CageFS
LVE+CageFS
13
LVE-KMOD MNTNS + bind mounts
CGROUPS
LibLVE
Отличия для CRIU
14
● Необходимо сохранять LVE-состояние, а не
cgroups напрямую
● Необходимо сохранять CageFS-состояние, а не
MNTNS таски со всеми составляющими mounts
● Могут иметь место fd из чужого MNTNS, без следа
mnt_id в mountinfo таски
LVE-состояние
15
● id ● limits ● flags ● cookie ● leader
LVE-состояние
16
● id ● limits ● flags ● cookie ● leader
C/R LVE-состояния
17
Checkpoint: ● Отключение поддержки cgroups
● Получение LVE-состояния с помощью liblve
Restore: ● Отключение поддержки cgroups
● Вход в LVE как можно быстрее для применения
лимитов
● Вход в LVE в CRIU(root_task) для поддержки
сценария, когда дерево процессов не имеет лидера
LVE сессии
CageFS-состояние
18
● Находится ли процесс в MNTNS и LVE одновременно
C/R CageFS-состояния
19
Checkpoint: ● Проверяем находится ли процесс в MNTNS и LVE
одновременно
Restore: ● Отключение поддержки MNTNS
● Вход в jail
Чужие fds
20
... fd1 = open(“file1”) … lve_jail() … exec() … fd2 = open(“file2”)
MNTNS
Чужие fds
21
MNTNS
.fd2 fd1
php
file2
file1
C/R чужих fds
22
Checkpoint: ● “Чужие” unix сокеты при использовании netlink ● “Чужие” fds Restore: ● Открытие “чужих” fds _до_ входа в jail ● Дублицируем подготовленные “чужие” fds в
нужные места в fdtable
Старт lsphp c CRIU
23
Starter(HTTPD child)
... preparation(closing fds, cleaning env, etc) ... lve_enter() ... lve_jail() ... fork() + exec(lsphp) … lve_exit()
first start ?... criu_restore() ...
success ?YES
lsphp -- user1
... open() and read() configs … criu_dump() ... serving … exit()
lsphp -- user1
... serving … exit()
YES
NO
NO
Кол-во syscall-ов
24
Время отклика
25