43
© Copyright 2014 Andrey Smirnov Сетевой ввод-вывод Блокирующийся Неблокирующийся Асинхронный

Курс высокие нагрузки: сеть (отрывок)

Embed Size (px)

DESCRIPTION

Разработка надёжных высоконагруженных систем Москва, 24, 25 и 26 мая http://smira.highload.ru/ Трехдневный мастер-класс с практическими заданиями

Citation preview

Page 1: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Сетевой ввод-вывод

• Блокирующийся

• Неблокирующийся

• Асинхронный

Page 2: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

UNIX (POSIX)• fd - файловый дескриптор

• socket()

• listen()/accept()

• read(fd, buf)

• write(fd, buf)

• close(fd)

Page 3: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

ВнутренностиДрайвер TCP/IP

стек

ПротоколHTTP

запрос/ответ

kernel

user-space

Page 4: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Блокирующийся ввод-вывод

• accept(fd) - заблокируется, пока не будет нового входящего соединения

• read(fd, buf) - заблокируется, пока не прибудут данные в сокет

• write(fd, buf) - заблокируется, пока не освободится место в буфере TCP

Page 5: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Неблокирующийся ввод-вывод

• Любая операция завершается немедленно

• Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK

Page 6: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Опрос готовности• Нотификации:

• level-triggered (состояние)

• edge-triggered (изменение состояния)

• Механизмы:

• select(), poll()

• epoll(), kqueue()

Page 7: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Неблокирующий ввод-вывод

• select(fds, timeout) ⇛ ready to read/write

• do read/write until EAGAIN

Page 8: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Ядерный сервер

• kHTTPd

• http.sys

Page 9: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Сеть в User-space

• Snab Switch

• netmap

Page 10: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Реактор

• Design Pattern

• “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы”

• Таймер: “Вызови меня через X мс”

Page 11: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Что внутри

• Отсортированный по времени срабатывания список таймеров + callback

• Список файловых дескрипторов для ожидания готовности + callback

• select(fds, min(timer)) ⇛ callbacks

Page 12: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Многозадачность• Процесс

• Нить

• Кооперативная

• Явная

• Корутины

• Комбинированные варианты

Page 13: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Процессы

• Исторически первый тип многозадачности

• Полная изоляция*

• Видимость для планировщика ОС

• Сложность коммуникации

Page 14: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

fork()

code

r/o

data

heap

code

r/o

data

heap

Page 15: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

fork()

• Копирование файловых дескрипторов

• Копирование mmap()-областей

• …

Page 16: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Сервер на процессах

• Родитель делает listen()

• Родитель делает fork()

• Потомки делают accept() и обслуживают соединения

Page 17: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Примеры

• Apache: mod_prefork

• FastCGI

• PostgreSQL:

• SysV IPC: shm, sem

Page 18: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Плюсы и минусы• Простота* реализации

• Ресурсоемкость

• Возможность использования всех ядер процессоров

• Сложность обмена информацией

• Падение одного процесса не влияет на другие

Page 19: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Нити (ОС)• Видны планировщику

• Имеют отдельный стек и TLS

• Более легковесные, чем процесс

• Отсутствует изоляция

• Сложность написания корректных программ

Page 20: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Синхронизация

• Любой доступ к общим данным должен быть синхронизирован

• Атомарные операции (без синхронизации)

Page 21: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Блокировки

• acquire(x.lock)

• x.field++

• release(x.lock)

Page 22: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Deadlock

• acquire(A)

• acquire(B)

• …

• acquire(B)

• acquire(A)

• …

Thread 1 Thread 2

Page 23: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Deadlock

Page 24: Курс высокие нагрузки: сеть (отрывок)

?© Copyright 2014 Andrey Smirnov

Как избежать deadlock?

Page 25: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Механизмы синхронизации• mutex

• semaphore

• rwlock

• spinlock

• condition variable

• …

Page 26: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

GIL

• Один mutex на все состояние

• Простой и надежный вариант

• Низкая конкурентность исполнения

Page 27: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Worker

Page 28: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Event Loop

Page 29: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Примеры

• MySQL

• Apache: mpm_worker

Page 30: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Кооперативная многозадачность

• “Невидима” для ОС, один процесс (нить)

• “Поток” добровольно передает управление другому

• Явная: callbackи

• Неявная: green threads

Page 31: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Истоки

• Эффективное использование ресурсов ВС

• Пакетный режим исполнения задач

• Многопользовательские системы

• Планировщик интерактивных систем

Page 32: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Сегодня

• Один сервер - один вариант использования

• Сервер - не многопользовательская система

• Использование процессора минимально

• Обслуживание большого числа соединений (C10k, C100k)

Page 33: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

JavaScript

• Явная кооперативная многозадачность

• Выполнение - в один поток

• XMLHTTPRequest ⇛ callback

• Таймеры ⇛ callback

Page 34: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Python/Twisted• Одна из первых реализаций кооперативной многозадачности с неблокирующим вводом-выводом

• Большое количество протоколов, драйверов

• Влияние на другие реализации

• Четкие и ясные примитивы

Page 35: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Deferred

• Отложенный результат

• “Я не могу дать результат сейчас, но я его помещу в Deferred, как только он будет доступен”

• 100 строк кода*

Page 36: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Deferred

Page 37: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Deferred

Page 38: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Влияние

• jQuery: Deferred

• Ruby: EventMachine

• Python 3: AsyncIO

• C#: Task/async/await

Page 39: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Green threads

• Любая блокирующая операция приводит к переключению

• Код выглядит последовательно

• Многозадачность на основе “согласия”

Page 40: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

gevent

def print_head(url):! print('Starting %s' % url)! data = urlopen(url).read()! print('%s: %s bytes: %r' % (url, len(data), data[:50]))!!jobs = [gevent.spawn(print_head, url) for url in urls]!!gevent.wait(jobs)!

Page 41: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Примеры• Python: gevent, eventlet, …

• Ruby (<1.9)

• Lua

• Go*

• Erlang*

Page 42: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Комбинированные

• 1:1

• N:1

• M:N

Page 43: Курс высокие нагрузки: сеть (отрывок)

© Copyright 2014 Andrey Smirnov

Разработка  надежных  высоконагруженных  систем

• 24,  25  и  26-­‐го  мая,  Москва  

• h4p://smira.highload.ru/  

• Мастер-­‐класс  с  практическими  заданиями