Курс высокие нагрузки: сеть (отрывок)
DESCRIPTION
Разработка надёжных высоконагруженных систем Москва, 24, 25 и 26 мая http://smira.highload.ru/ Трехдневный мастер-класс с практическими заданиямиTRANSCRIPT
![Page 1: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/1.jpg)
© Copyright 2014 Andrey Smirnov
Сетевой ввод-вывод
• Блокирующийся
• Неблокирующийся
• Асинхронный
![Page 2: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/2.jpg)
© Copyright 2014 Andrey Smirnov
UNIX (POSIX)• fd - файловый дескриптор
• socket()
• listen()/accept()
• read(fd, buf)
• write(fd, buf)
• close(fd)
![Page 3: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/3.jpg)
© Copyright 2014 Andrey Smirnov
ВнутренностиДрайвер TCP/IP
стек
ПротоколHTTP
запрос/ответ
kernel
user-space
![Page 4: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/4.jpg)
© Copyright 2014 Andrey Smirnov
Блокирующийся ввод-вывод
• accept(fd) - заблокируется, пока не будет нового входящего соединения
• read(fd, buf) - заблокируется, пока не прибудут данные в сокет
• write(fd, buf) - заблокируется, пока не освободится место в буфере TCP
![Page 5: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/5.jpg)
© Copyright 2014 Andrey Smirnov
Неблокирующийся ввод-вывод
• Любая операция завершается немедленно
• Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK
![Page 6: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/6.jpg)
© Copyright 2014 Andrey Smirnov
Опрос готовности• Нотификации:
• level-triggered (состояние)
• edge-triggered (изменение состояния)
• Механизмы:
• select(), poll()
• epoll(), kqueue()
![Page 7: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/7.jpg)
© Copyright 2014 Andrey Smirnov
Неблокирующий ввод-вывод
• select(fds, timeout) ⇛ ready to read/write
• do read/write until EAGAIN
![Page 8: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/8.jpg)
© Copyright 2014 Andrey Smirnov
Ядерный сервер
• kHTTPd
• http.sys
![Page 9: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/9.jpg)
© Copyright 2014 Andrey Smirnov
Сеть в User-space
• Snab Switch
• netmap
![Page 10: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/10.jpg)
© Copyright 2014 Andrey Smirnov
Реактор
• Design Pattern
• “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы”
• Таймер: “Вызови меня через X мс”
![Page 11: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/11.jpg)
© Copyright 2014 Andrey Smirnov
Что внутри
• Отсортированный по времени срабатывания список таймеров + callback
• Список файловых дескрипторов для ожидания готовности + callback
• select(fds, min(timer)) ⇛ callbacks
![Page 12: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/12.jpg)
© Copyright 2014 Andrey Smirnov
Многозадачность• Процесс
• Нить
• Кооперативная
• Явная
• Корутины
• Комбинированные варианты
![Page 13: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/13.jpg)
© Copyright 2014 Andrey Smirnov
Процессы
• Исторически первый тип многозадачности
• Полная изоляция*
• Видимость для планировщика ОС
• Сложность коммуникации
![Page 14: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/14.jpg)
© Copyright 2014 Andrey Smirnov
fork()
code
r/o
data
heap
code
r/o
data
heap
![Page 15: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/15.jpg)
© Copyright 2014 Andrey Smirnov
fork()
• Копирование файловых дескрипторов
• Копирование mmap()-областей
• …
![Page 16: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/16.jpg)
© Copyright 2014 Andrey Smirnov
Сервер на процессах
• Родитель делает listen()
• Родитель делает fork()
• Потомки делают accept() и обслуживают соединения
![Page 17: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/17.jpg)
© Copyright 2014 Andrey Smirnov
Примеры
• Apache: mod_prefork
• FastCGI
• PostgreSQL:
• SysV IPC: shm, sem
![Page 18: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/18.jpg)
© Copyright 2014 Andrey Smirnov
Плюсы и минусы• Простота* реализации
• Ресурсоемкость
• Возможность использования всех ядер процессоров
• Сложность обмена информацией
• Падение одного процесса не влияет на другие
![Page 19: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/19.jpg)
© Copyright 2014 Andrey Smirnov
Нити (ОС)• Видны планировщику
• Имеют отдельный стек и TLS
• Более легковесные, чем процесс
• Отсутствует изоляция
• Сложность написания корректных программ
![Page 20: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/20.jpg)
© Copyright 2014 Andrey Smirnov
Синхронизация
• Любой доступ к общим данным должен быть синхронизирован
• Атомарные операции (без синхронизации)
![Page 21: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/21.jpg)
© Copyright 2014 Andrey Smirnov
Блокировки
• acquire(x.lock)
• x.field++
• release(x.lock)
![Page 22: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/22.jpg)
© Copyright 2014 Andrey Smirnov
Deadlock
• acquire(A)
• acquire(B)
• …
• acquire(B)
• acquire(A)
• …
Thread 1 Thread 2
![Page 23: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/23.jpg)
© Copyright 2014 Andrey Smirnov
Deadlock
![Page 24: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/24.jpg)
?© Copyright 2014 Andrey Smirnov
Как избежать deadlock?
![Page 25: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/25.jpg)
© Copyright 2014 Andrey Smirnov
Механизмы синхронизации• mutex
• semaphore
• rwlock
• spinlock
• condition variable
• …
![Page 26: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/26.jpg)
© Copyright 2014 Andrey Smirnov
GIL
• Один mutex на все состояние
• Простой и надежный вариант
• Низкая конкурентность исполнения
![Page 27: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/27.jpg)
© Copyright 2014 Andrey Smirnov
Worker
![Page 28: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/28.jpg)
© Copyright 2014 Andrey Smirnov
Event Loop
![Page 29: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/29.jpg)
© Copyright 2014 Andrey Smirnov
Примеры
• MySQL
• Apache: mpm_worker
![Page 30: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/30.jpg)
© Copyright 2014 Andrey Smirnov
Кооперативная многозадачность
• “Невидима” для ОС, один процесс (нить)
• “Поток” добровольно передает управление другому
• Явная: callbackи
• Неявная: green threads
![Page 31: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/31.jpg)
© Copyright 2014 Andrey Smirnov
Истоки
• Эффективное использование ресурсов ВС
• Пакетный режим исполнения задач
• Многопользовательские системы
• Планировщик интерактивных систем
![Page 32: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/32.jpg)
© Copyright 2014 Andrey Smirnov
Сегодня
• Один сервер - один вариант использования
• Сервер - не многопользовательская система
• Использование процессора минимально
• Обслуживание большого числа соединений (C10k, C100k)
![Page 33: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/33.jpg)
© Copyright 2014 Andrey Smirnov
JavaScript
• Явная кооперативная многозадачность
• Выполнение - в один поток
• XMLHTTPRequest ⇛ callback
• Таймеры ⇛ callback
![Page 34: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/34.jpg)
© Copyright 2014 Andrey Smirnov
Python/Twisted• Одна из первых реализаций кооперативной многозадачности с неблокирующим вводом-выводом
• Большое количество протоколов, драйверов
• Влияние на другие реализации
• Четкие и ясные примитивы
![Page 35: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/35.jpg)
© Copyright 2014 Andrey Smirnov
Deferred
• Отложенный результат
• “Я не могу дать результат сейчас, но я его помещу в Deferred, как только он будет доступен”
• 100 строк кода*
![Page 36: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/36.jpg)
© Copyright 2014 Andrey Smirnov
Deferred
![Page 37: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/37.jpg)
© Copyright 2014 Andrey Smirnov
Deferred
![Page 38: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/38.jpg)
© Copyright 2014 Andrey Smirnov
Влияние
• jQuery: Deferred
• Ruby: EventMachine
• Python 3: AsyncIO
• C#: Task/async/await
![Page 39: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/39.jpg)
© Copyright 2014 Andrey Smirnov
Green threads
• Любая блокирующая операция приводит к переключению
• Код выглядит последовательно
• Многозадачность на основе “согласия”
![Page 40: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/40.jpg)
© 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: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/41.jpg)
© Copyright 2014 Andrey Smirnov
Примеры• Python: gevent, eventlet, …
• Ruby (<1.9)
• Lua
• Go*
• Erlang*
![Page 42: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/42.jpg)
© Copyright 2014 Andrey Smirnov
Комбинированные
• 1:1
• N:1
• M:N
![Page 43: Курс высокие нагрузки: сеть (отрывок)](https://reader034.vdocuments.pub/reader034/viewer/2022042714/556ccf79d8b42aba548b54d9/html5/thumbnails/43.jpg)
© Copyright 2014 Andrey Smirnov
Разработка надежных высоконагруженных систем
• 24, 25 и 26-‐го мая, Москва
• h4p://smira.highload.ru/
• Мастер-‐класс с практическими заданиями