26
CRIU: Ускорение запуска PHP в CloudLinux OS Купреев Руслан Москва, 2015

CRIU: ускорение запуска PHP в CloudLinux OS -- Руслан Купреев

  • Upload
    openvz

  • View
    2.393

  • Download
    0

Embed Size (px)

Citation preview

Page 1: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

CRIU: Ускорение запуска PHP в CloudLinux OS

Купреев Руслан Москва, 2015

Page 2: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Содержание

2

● Что такое mod_lsapi?

● LVE+CageFS vs OVZ, LXC

● C/R LVE+CageFS

● Результаты

Page 3: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

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  -- Руслан Купреев

Старт 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  -- Руслан Купреев

Старт 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  -- Руслан Купреев

Старт 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  -- Руслан Купреев

Старт lsphp

7

Starter(HTTPD child) -- nobody

... criu_restore() ...

lsphp -- user1

... serving … exit()

Page 8: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE+CageFS

8

LVE + CageFS OVZ, LXC

Page 9: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE + CageFS

OVZ, LXC

LVE+CageFS

9

Page 10: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

OVZ, LXC

Типичный контейнер

10

init

vim

sh

cron

gcc

Page 11: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE + CageFS

LVE+CageFS

11

vim

sh

cron

gcc

php

python

ruby

Page 12: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

OVZ, LXC

Типичный контейнер

12

MNTNSCGROUPS

Page 13: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE + CageFS

LVE+CageFS

13

LVE-KMOD MNTNS + bind mounts

CGROUPS

LibLVE

Page 14: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Отличия для CRIU

14

● Необходимо сохранять LVE-состояние, а не

cgroups напрямую

● Необходимо сохранять CageFS-состояние, а не

MNTNS таски со всеми составляющими mounts

● Могут иметь место fd из чужого MNTNS, без следа

mnt_id в mountinfo таски

Page 15: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE-состояние

15

● id ● limits ● flags ● cookie ● leader

Page 16: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

LVE-состояние

16

● id ● limits ● flags ● cookie ● leader

Page 17: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

C/R LVE-состояния

17

Checkpoint: ● Отключение поддержки cgroups

● Получение LVE-состояния с помощью liblve

Restore: ● Отключение поддержки cgroups

● Вход в LVE как можно быстрее для применения

лимитов

● Вход в LVE в CRIU(root_task) для поддержки

сценария, когда дерево процессов не имеет лидера

LVE сессии

Page 18: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

CageFS-состояние

18

● Находится ли процесс в MNTNS и LVE одновременно

Page 19: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

C/R CageFS-состояния

19

Checkpoint: ● Проверяем находится ли процесс в MNTNS и LVE

одновременно

Restore: ● Отключение поддержки MNTNS

● Вход в jail

Page 20: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Чужие fds

20

... fd1 = open(“file1”) … lve_jail() … exec() … fd2 = open(“file2”)

Page 21: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

MNTNS

Чужие fds

21

MNTNS

.fd2 fd1

php

file2

file1

Page 22: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

C/R чужих fds

22

Checkpoint: ● “Чужие” unix сокеты при использовании netlink ● “Чужие” fds Restore: ● Открытие “чужих” fds _до_ входа в jail ● Дублицируем подготовленные “чужие” fds в

нужные места в fdtable

Page 23: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Старт 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  -- Руслан Купреев

Кол-во syscall-ов

24

Page 25: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Время отклика

25

Page 26: CRIU: ускорение запуска PHP в CloudLinux OS  -- Руслан Купреев

Спасибо за

внимание

[email protected]