SlideShare a Scribd company logo
1 of 43
Download to read offline
© Copyright 2014 Andrey Smirnov
Сетевой ввод-вывод
• Блокирующийся
• Неблокирующийся
• Асинхронный
© Copyright 2014 Andrey Smirnov
UNIX (POSIX)
• fd - файловый дескриптор
• socket()
• listen()/accept()
• read(fd, buf)
• write(fd, buf)
• close(fd)
© Copyright 2014 Andrey Smirnov
Внутренности
Драйвер
TCP/IP
стек
Протокол
HTTP
запрос/
ответ
kernel
user-space
© Copyright 2014 Andrey Smirnov
Блокирующийся 

ввод-вывод
• accept(fd) - заблокируется, пока не будет нового
входящего соединения
• read(fd, buf) - заблокируется, пока не прибудут
данные в сокет
• write(fd, buf) - заблокируется, пока не
освободится место в буфере TCP
© Copyright 2014 Andrey Smirnov
Неблокирующийся 

ввод-вывод
• Любая операция завершается немедленно
• Вместо того, чтобы заблокироваться, вызов
возвращает EAGAIN/EWOULDBLOCK
© Copyright 2014 Andrey Smirnov
Опрос готовности
• Нотификации:
• level-triggered (состояние)
• edge-triggered (изменение состояния)
• Механизмы:
• select(), poll()
• epoll(), kqueue()
© Copyright 2014 Andrey Smirnov
Неблокирующий

ввод-вывод
• select(fds, timeout) ⇛ ready to read/write
• do read/write until EAGAIN
© Copyright 2014 Andrey Smirnov
Ядерный сервер
• kHTTPd
• http.sys
© Copyright 2014 Andrey Smirnov
Сеть в User-space
• Snab Switch
• netmap
© Copyright 2014 Andrey Smirnov
Реактор
• Design Pattern
• “Дай мне кучу сокетов, а я сделаю callback, когда
они будут готовы”
• Таймер: “Вызови меня через X мс”
© Copyright 2014 Andrey Smirnov
Что внутри
• Отсортированный по времени срабатывания
список таймеров + callback
• Список файловых дескрипторов для ожидания
готовности + callback
• select(fds, min(timer)) ⇛ callbacks
© Copyright 2014 Andrey Smirnov
Многозадачность
• Процесс
• Нить
• Кооперативная
• Явная
• Корутины
• Комбинированные варианты
© Copyright 2014 Andrey Smirnov
Процессы
• Исторически первый тип многозадачности
• Полная изоляция*
• Видимость для планировщика ОС
• Сложность коммуникации
© Copyright 2014 Andrey Smirnov
fork()
code
r/o
data
heap
code
r/o
data
heap
© Copyright 2014 Andrey Smirnov
fork()
• Копирование файловых дескрипторов
• Копирование mmap()-областей
• …
© Copyright 2014 Andrey Smirnov
Сервер на процессах
• Родитель делает listen()
• Родитель делает fork()
• Потомки делают accept() и обслуживают
соединения
© Copyright 2014 Andrey Smirnov
Примеры
• Apache: mod_prefork
• FastCGI
• PostgreSQL:
• SysV IPC: shm, sem
© Copyright 2014 Andrey Smirnov
Плюсы и минусы
• Простота* реализации
• Ресурсоемкость
• Возможность использования всех ядер
процессоров
• Сложность обмена информацией
• Падение одного процесса не влияет на другие
© Copyright 2014 Andrey Smirnov
Нити (ОС)
• Видны планировщику
• Имеют отдельный стек и TLS
• Более легковесные, чем процесс
• Отсутствует изоляция
• Сложность написания корректных программ
© Copyright 2014 Andrey Smirnov
Синхронизация
• Любой доступ к общим данным должен быть
синхронизирован
• Атомарные операции (без синхронизации)
© Copyright 2014 Andrey Smirnov
Блокировки
• acquire(x.lock)
• x.field++
• release(x.lock)
© Copyright 2014 Andrey Smirnov
Deadlock
• acquire(A)
• acquire(B)
• …
• acquire(B)
• acquire(A)
• …
Thread 1 Thread 2
© Copyright 2014 Andrey Smirnov
Deadlock
?
© Copyright 2014 Andrey Smirnov
Как избежать deadlock?
© Copyright 2014 Andrey Smirnov
Механизмы синхронизации
• mutex
• semaphore
• rwlock
• spinlock
• condition variable
• …
© Copyright 2014 Andrey Smirnov
GIL
• Один mutex на все состояние
• Простой и надежный вариант
• Низкая конкурентность исполнения
© Copyright 2014 Andrey Smirnov
Worker
© Copyright 2014 Andrey Smirnov
Event Loop
© Copyright 2014 Andrey Smirnov
Примеры
• MySQL
• Apache: mpm_worker
© Copyright 2014 Andrey Smirnov
Кооперативная
многозадачность
• “Невидима” для ОС, один процесс (нить)
• “Поток” добровольно передает управление
другому
• Явная: callbackи
• Неявная: green threads
© Copyright 2014 Andrey Smirnov
Истоки
• Эффективное использование ресурсов ВС
• Пакетный режим исполнения задач
• Многопользовательские системы
• Планировщик интерактивных систем
© Copyright 2014 Andrey Smirnov
Сегодня
• Один сервер - один вариант использования
• Сервер - не многопользовательская система
• Использование процессора минимально
• Обслуживание большого числа соединений
(C10k, C100k)
© Copyright 2014 Andrey Smirnov
JavaScript
• Явная кооперативная многозадачность
• Выполнение - в один поток
• XMLHTTPRequest ⇛ callback
• Таймеры ⇛ callback
© Copyright 2014 Andrey Smirnov
Python/Twisted
• Одна из первых реализаций кооперативной
многозадачности с неблокирующим вводом-
выводом
• Большое количество протоколов, драйверов
• Влияние на другие реализации
• Четкие и ясные примитивы
© Copyright 2014 Andrey Smirnov
Deferred
• Отложенный результат
• “Я не могу дать результат сейчас, но я его
помещу в Deferred, как только он будет доступен”
• 100 строк кода*
© Copyright 2014 Andrey Smirnov
Deferred
© Copyright 2014 Andrey Smirnov
Deferred
© Copyright 2014 Andrey Smirnov
Влияние
• jQuery: Deferred
• Ruby: EventMachine
• Python 3: AsyncIO
• C#: Task/async/await
© Copyright 2014 Andrey Smirnov
Green threads
• Любая блокирующая операция приводит к
переключению
• Код выглядит последовательно
• Многозадачность на основе “согласия”
© 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)!
© Copyright 2014 Andrey Smirnov
Примеры
• Python: gevent, eventlet, …
• Ruby (<1.9)
• Lua
• Go*
• Erlang*
© Copyright 2014 Andrey Smirnov
Комбинированные
• 1:1
• N:1
• M:N
© Copyright 2014 Andrey Smirnov
Разработка	
  надежных	
  
высоконагруженных	
  систем
• 24,	
  25	
  и	
  26-­‐го	
  мая,	
  Москва	
  
• h4p://smira.highload.ru/	
  
• Мастер-­‐класс	
  с	
  практическими	
  заданиями

More Related Content

What's hot

Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Ontico
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Ontico
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Ontico
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)Ontico
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Ontico
 
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...Ontico
 
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)Ontico
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на GoAndrey Smirnov
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Ontico
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...Ontico
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахOntico
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Ontico
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooBadoo Development
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Ontico
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Денис Иванов
Денис ИвановДенис Иванов
Денис ИвановCodeFest
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Ontico
 
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...Ontico
 

What's hot (19)

Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
Виртуальный ЦОД для корпоративных клиентов на базе Virtuozzo: стабильность, п...
 
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
Отказоустойчивый микрокластер своими руками, Виталий Гаврилов (Ленвендо)
 
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
Как SRE следит за стабильностью и скоростью HeadHunter / Антон Иванов (HeadHu...
 
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
NVMf: 5 млн IOPS по сети своими руками / Андрей Николаенко (IBS)
 
Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)Евгений Потапов (Сумма Айти)
Евгений Потапов (Сумма Айти)
 
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...
Сравнение решений по балансировке высоконагруженных систем / Евгений Пивень (...
 
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
AWS и GCP: трудная жизнь в облаках / Максим Пугачев (IPONWEB)
 
Консольные приложения на Go
Консольные приложения на GoКонсольные приложения на Go
Консольные приложения на Go
 
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
Как devops исчерпывает себя, и что будет дальше / Кирилл Вечера (Jetware)
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
 
Балансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в ОдноклассникахБалансировка нагрузки и отказоустойчивость в Одноклассниках
Балансировка нагрузки и отказоустойчивость в Одноклассниках
 
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
Архитектура поиска в Booking.com / Иван Круглов (Booking.com)
 
Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
Архитектура хранения фотографий в Badoo
Архитектура хранения фотографий в BadooАрхитектура хранения фотографий в Badoo
Архитектура хранения фотографий в Badoo
 
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
Docker в работе: взгляд на его использование в Badoo через год / Турецкий Ант...
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Денис Иванов
Денис ИвановДенис Иванов
Денис Иванов
 
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
Виртуализированные сетевые сервисы на line rate в серверном окружении / Алекс...
 
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
HDD, SSD, RAM, RAID, и кого на ком кэшировать / Михаил Конюхов (Perfect Solut...
 

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

Cпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложенияCпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложения7bits
 
Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновOntico
 
A popular DNS security overview
A popular DNS security overviewA popular DNS security overview
A popular DNS security overviewPhilipp Kulin
 
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)Ontico
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo Development
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Ontico
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на productionNikolay Sivko
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeIosif Itkin
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSYandex
 
Intercepter-NG: сниффер нового поколения
Intercepter-NG: сниффер нового поколенияIntercepter-NG: сниффер нового поколения
Intercepter-NG: сниффер нового поколенияPositive Hack Days
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийАлександр Ежов
 
Стажировка-2014, занятие 6 (часть 1). Web-приложения
Стажировка-2014, занятие 6 (часть 1). Web-приложенияСтажировка-2014, занятие 6 (часть 1). Web-приложения
Стажировка-2014, занятие 6 (часть 1). Web-приложения7bits
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Ontico
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...Arvids Godjuks
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Ontico
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Ontico
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_drupalconf
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Ontico
 

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

Cпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложенияCпецкурс 2014, занятие 7. Web-приложения
Cпецкурс 2014, занятие 7. Web-приложения
 
Анатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей СмирновАнатомия веб-сервиса, Андрей Смирнов
Анатомия веб-сервиса, Андрей Смирнов
 
A popular DNS security overview
A popular DNS security overviewA popular DNS security overview
A popular DNS security overview
 
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
Анатомия веб-сервиса, Андрей Смирнов (ex-Skype)
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Sivko
SivkoSivko
Sivko
 
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
Жизнь проекта на production советы по эксплуатации / Николай Сивко (okmeter.io)
 
Жизнь проекта на production
Жизнь проекта на productionЖизнь проекта на production
Жизнь проекта на production
 
TMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: GenodeTMPA-2013 Sartakov: Genode
TMPA-2013 Sartakov: Genode
 
Вячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPSВячеслав Бирюков - HTTP и HTTPS
Вячеслав Бирюков - HTTP и HTTPS
 
Intercepter-NG: сниффер нового поколения
Intercepter-NG: сниффер нового поколенияIntercepter-NG: сниффер нового поколения
Intercepter-NG: сниффер нового поколения
 
Eventmachine: структура evented-приложений
Eventmachine: структура evented-приложенийEventmachine: структура evented-приложений
Eventmachine: структура evented-приложений
 
Стажировка-2014, занятие 6 (часть 1). Web-приложения
Стажировка-2014, занятие 6 (часть 1). Web-приложенияСтажировка-2014, занятие 6 (часть 1). Web-приложения
Стажировка-2014, занятие 6 (часть 1). Web-приложения
 
Do it yourself profiler
Do it yourself profilerDo it yourself profiler
Do it yourself profiler
 
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
Хорошо поддерживаемое в продакшне приложение / Николай Сивко (okmeter.io)
 
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...PHP libevent Daemons. A high performance and reliable solution. Practical exp...
PHP libevent Daemons. A high performance and reliable solution. Practical exp...
 
Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.Максим Дунин, Nginx, Inc.
Максим Дунин, Nginx, Inc.
 
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
Эксплуатация container-based-инфраструктур / Николай Сивко (okmeter.io)
 
Hosting for forbes.ru_
Hosting for forbes.ru_Hosting for forbes.ru_
Hosting for forbes.ru_
 
Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)Сергей Житинский, Александр Чистяков (Git in Sky)
Сергей Житинский, Александр Чистяков (Git in Sky)
 

More from Andrey Smirnov

aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)Andrey Smirnov
 
aptly: Debian repository management tool
aptly: Debian repository management toolaptly: Debian repository management tool
aptly: Debian repository management toolAndrey Smirnov
 
aptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетовaptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетовAndrey Smirnov
 
Smirnov twisted-python
Smirnov twisted-pythonSmirnov twisted-python
Smirnov twisted-pythonAndrey Smirnov
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonAndrey Smirnov
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonAndrey Smirnov
 
Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)Andrey Smirnov
 

More from Andrey Smirnov (11)

Remote Highload
Remote HighloadRemote Highload
Remote Highload
 
aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)aptly: система управления репозиториями пакетов (РИТ-2014)
aptly: система управления репозиториями пакетов (РИТ-2014)
 
aptly: Debian repository management tool
aptly: Debian repository management toolaptly: Debian repository management tool
aptly: Debian repository management tool
 
aptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетовaptly - система управления Debian-репозиториями пакетов
aptly - система управления Debian-репозиториями пакетов
 
Smirnov twisted-python
Smirnov twisted-pythonSmirnov twisted-python
Smirnov twisted-python
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Twisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в PythonTwisted Framework - сетевые приложения в Python
Twisted Framework - сетевые приложения в Python
 
Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)Доклад на РИТ: Высокие нагрузки (2008)
Доклад на РИТ: Высокие нагрузки (2008)
 
pyFMS
pyFMSpyFMS
pyFMS
 
pyFMS
pyFMSpyFMS
pyFMS
 
PGDBObject
PGDBObjectPGDBObject
PGDBObject
 

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

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