criu: ускорение запуска php в cloudlinux os -- Руслан Купреев
TRANSCRIPT
![Page 1: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/1.jpg)
CRIU: Ускорение запуска PHP в CloudLinux OS
Купреев Руслан Москва, 2015
![Page 2: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/2.jpg)
Содержание
2
● Что такое mod_lsapi?
● LVE+CageFS vs OVZ, LXC
● C/R LVE+CageFS
● Результаты
![Page 3: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/3.jpg)
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
![Page 4: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/4.jpg)
Старт 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()
![Page 5: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/5.jpg)
Старт 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()
![Page 6: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/6.jpg)
Старт 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()
![Page 7: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/7.jpg)
Старт lsphp
7
Starter(HTTPD child) -- nobody
... criu_restore() ...
lsphp -- user1
... serving … exit()
![Page 8: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/8.jpg)
LVE+CageFS
8
LVE + CageFS OVZ, LXC
![Page 9: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/9.jpg)
LVE + CageFS
OVZ, LXC
LVE+CageFS
9
![Page 10: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/10.jpg)
OVZ, LXC
Типичный контейнер
10
init
vim
sh
cron
gcc
![Page 11: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/11.jpg)
LVE + CageFS
LVE+CageFS
11
vim
sh
cron
gcc
php
python
ruby
![Page 12: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/12.jpg)
OVZ, LXC
Типичный контейнер
12
MNTNSCGROUPS
![Page 13: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/13.jpg)
LVE + CageFS
LVE+CageFS
13
LVE-KMOD MNTNS + bind mounts
CGROUPS
LibLVE
![Page 14: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/14.jpg)
Отличия для CRIU
14
● Необходимо сохранять LVE-состояние, а не
cgroups напрямую
● Необходимо сохранять CageFS-состояние, а не
MNTNS таски со всеми составляющими mounts
● Могут иметь место fd из чужого MNTNS, без следа
mnt_id в mountinfo таски
![Page 15: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/15.jpg)
LVE-состояние
15
● id ● limits ● flags ● cookie ● leader
![Page 16: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/16.jpg)
LVE-состояние
16
● id ● limits ● flags ● cookie ● leader
![Page 17: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/17.jpg)
C/R LVE-состояния
17
Checkpoint: ● Отключение поддержки cgroups
● Получение LVE-состояния с помощью liblve
Restore: ● Отключение поддержки cgroups
● Вход в LVE как можно быстрее для применения
лимитов
● Вход в LVE в CRIU(root_task) для поддержки
сценария, когда дерево процессов не имеет лидера
LVE сессии
![Page 18: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/18.jpg)
CageFS-состояние
18
● Находится ли процесс в MNTNS и LVE одновременно
![Page 19: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/19.jpg)
C/R CageFS-состояния
19
Checkpoint: ● Проверяем находится ли процесс в MNTNS и LVE
одновременно
Restore: ● Отключение поддержки MNTNS
● Вход в jail
![Page 20: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/20.jpg)
Чужие fds
20
... fd1 = open(“file1”) … lve_jail() … exec() … fd2 = open(“file2”)
![Page 21: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/21.jpg)
MNTNS
Чужие fds
21
MNTNS
.fd2 fd1
php
file2
file1
![Page 22: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/22.jpg)
C/R чужих fds
22
Checkpoint: ● “Чужие” unix сокеты при использовании netlink ● “Чужие” fds Restore: ● Открытие “чужих” fds _до_ входа в jail ● Дублицируем подготовленные “чужие” fds в
нужные места в fdtable
![Page 23: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/23.jpg)
Старт 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
![Page 24: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/24.jpg)
Кол-во syscall-ов
24
![Page 25: CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев](https://reader034.vdocuments.pub/reader034/viewer/2022050806/58ee73121a28ab5f4d8b4575/html5/thumbnails/25.jpg)
Время отклика
25