Upload
ontico
View
951
Download
0
Embed Size (px)
DESCRIPTION
Доклад Дмитрия Обухова на HighLoad++ 2014.
Citation preview
HighLoadдля начинающих
HighLoad для начинающих
Dmitry E. Oboukhov
31 октября 2014
HighLoad, что это?
I Конференция?
I Высокая нагрузка?I Миф?!
HighLoad, что это?
I Конференция?I Высокая нагрузка?
I Миф?!
HighLoad, что это?
I Конференция?I Высокая нагрузка?I Миф?!
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...
перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду?
- средний CPU
I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...
перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...
перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!
I 1 запрос в секунду? - любой веб сервер?...перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!I 1 запрос в секунду?
- любой веб сервер?...перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...
перекодирующий видеоролики? :)
Высокая нагрузка что это?
I 53.328 ∗ 109 запросов в секунду? - средний CPU
I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...
перекодирующий видеоролики? :)
Высокая нагрузка это:
Нагрузка, с которой не справляетсяжелезо
Высокая нагрузка это:
Нагрузка, с которой не справляетсяжелезо
Когда это бывает?
Достигнуты технические ограниченияI Сеть - за рамками данного доклада
I ПамятьI CPUI Хранилище данных
Когда это бывает?
Достигнуты технические ограничения
I Сеть - за рамками данного доклада
I ПамятьI CPUI Хранилище данных
Когда это бывает?
Достигнуты технические ограниченияI Сеть
- за рамками данного доклада
I ПамятьI CPUI Хранилище данных
Когда это бывает?
Достигнуты технические ограниченияI Сеть - за рамками данного доклада
I ПамятьI CPUI Хранилище данных
Когда это бывает?
Достигнуты технические ограниченияI Сеть - за рамками данного доклада
I Память
I CPUI Хранилище данных
Когда это бывает?
Достигнуты технические ограниченияI Сеть - за рамками данного доклада
I ПамятьI CPU
I Хранилище данных
Когда это бывает?
Достигнуты технические ограниченияI Сеть - за рамками данного доклада
I ПамятьI CPUI Хранилище данных
Причины
I Недоиспользование железаI Трудности масштабирования
Причины
I Недоиспользование железа
I Трудности масштабирования
Причины
I Недоиспользование железаI Трудности масштабирования
Причины
Архитектурные проблемы
Недоиспользование железа
Рассмотрим типичный вебсервер.
на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl
, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python
, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby
...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.
I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.
I Валидация запроса, выборконтроллера.
I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.
I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.
I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).
I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один цикл
I один тред на один цикл
Недоиспользование железа
Рассмотрим типичный вебсервер. на Perl, Python, Ruby...
Задачи одного цикла
I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор
контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.
Традиционная реализация
I один процесс на один циклI один тред на один цикл
Недоиспользование железа
Начались разговоры о HighLoad?
I Увеличение числа процессов/тредов.I Увеличение числа серверов.
Недоиспользование железа
Начались разговоры о HighLoad?
I Увеличение числа процессов/тредов.
I Увеличение числа серверов.
Недоиспользование железа
Начались разговоры о HighLoad?
I Увеличение числа процессов/тредов.I Увеличение числа серверов.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.
Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.
I Увеличили число процессов в работе.Помогло.
I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.
Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.
Помогло.
I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.
Помогло.I Новые проблемы при ≈150 запросов в секунду.
I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Вернемся к рассматриваемому серверу
I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.
Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?
- Мы над этим 3 года работали!I Добавлять второй сервер?
- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?
- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!
I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.
I Провести измерения.I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.
I Найти слабые места.
Недоиспользование железа
Что делать?
I Менять архитектуру?- Мы над этим 3 года работали!
I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)
Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.
Недоиспользование железа
Измерения
Чтение запроса из сети. 15К RPSПарсинг запроса, валидация, выбор контроллера. 150К RPS/CPU
Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU
Отправка ответа клиенту. 15К RPS
Недоиспользование железа
ИзмеренияЧтение запроса из сети. 15К RPS
Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS
Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS
Недоиспользование железа
ИзмеренияЧтение запроса из сети. 15К RPS
Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPU
Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU
Отправка ответа клиенту. 15К RPS
Недоиспользование железа
ИзмеренияЧтение запроса из сети. 15К RPS
Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS
Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS
Недоиспользование железа
ИзмеренияЧтение запроса из сети. 15К RPS
Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS
Формирование ответа (Соединение данных с template) 100К RPS/CPU
Отправка ответа клиенту. 15К RPS
Недоиспользование железа
ИзмеренияЧтение запроса из сети. 15К RPS
Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS
Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS
Недоиспользование железа
Итого1
115 103
+ 1150 103
+ 160 103
+ 1100 103
+ 115 103
= 6000RPS
Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!
Недоиспользование железа
Итого1
115 103
+ 1150 103
+ 160 103
+ 1100 103
+ 115 103
= 6000RPS
Но, позвольте!
I У нас проблемы на 150 RPS!I Тут что-то не так!
Недоиспользование железа
Итого1
115 103
+ 1150 103
+ 160 103
+ 1100 103
+ 115 103
= 6000RPS
Но, позвольте!I У нас проблемы на 150 RPS!
I Тут что-то не так!
Недоиспользование железа
Итого1
115 103
+ 1150 103
+ 160 103
+ 1100 103
+ 115 103
= 6000RPS
Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.
неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?
I Проблемы стали больше!I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!
I Почему?!
Недоиспользование железа
Начинаем разбираться
I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.
I Либо хранилище надо располагать локально.неприемлемо.
I То же самое и с взаимодействием с клиентом.
Что делать?
I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!
Недоиспользование железа
Резюме ситуации, еще раз
I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо
больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели
расчетные.
Недоиспользование железа
Резюме ситуации, еще раз
I Имеется 100500 строк кода, над которым работали несколько лет.
I Этот код AS IS по результатам измерений может выдавать гораздобольше RPS чем в реальности.
I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.
Недоиспользование железа
Резюме ситуации, еще раз
I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо
больше RPS чем в реальности.
I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.
Недоиспользование железа
Резюме ситуации, еще раз
I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо
больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели
расчетные.
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.
I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.
I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.
I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.
I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.
I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Еще раз рассмотрим цикл обработки
I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.
I Следующий клиент!
Недоиспользование железа
Измеряем
Ожидание запроса (данных) от пользователя. 70 мксПарсинг запроса, валидация. 6 мкс
Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс
Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс
Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мкс
Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс
Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс
Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс
Ожидание ответа (ответов) из БД. 16 мкс
Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс
Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мкс
Ожидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс
Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс
Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 =
17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мкс
I Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 =
156 мксI Код выполняется только 10% времени!I И при этом тормозит!
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мкс
I Код выполняется только 10% времени!I И при этом тормозит!
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!
I И при этом тормозит!
Недоиспользование железа
ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!
Недоиспользование железа
#include <unistd.h>
int main(int argc, char **argv) {int i;for (;;) {
usleep(70); usleep(7);usleep(16); usleep(10);usleep(70);
}}
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU
- по моим измерениям - где-то 15% загрузки на CPUI Запустив десяток таких “воркеров”, получаем примерно такую же
нагрузку как на проблемном сервере.I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительность
достаточную для развития проекта еще на несколько лет вперед.I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.
I Что делать?
Недоиспользование железаИтого
I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU
I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.
I Понятно что пример синтетический (есть вопросы к реализации usleep).
Вернемся к нашему серверу
I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.
I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?
Недоиспользование железа
Просто реорганизовать код
Событийно-ориентированное программирование
Компьютер — это конечный автомат. Треды для тех людей,которые не умеют программировать конечные автоматы.
Алан Кокс
Событийно-ориентированное программирование
Избавимся от тредов!
- и процессов.
Событийно-ориентированное программирование
Избавимся от тредов!- и процессов.
Событийно-ориентированное программирование
Машина событий
I Вся работа делается в обработчике события.- в общем случае - callback.
I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.
I Обработчик события может генерировать другие события иустанавливать другие обработчики.
Событийно-ориентированное программирование
Машина событийI Вся работа делается в обработчике события.
- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то
управление возвращается машине событий.в общем случае - return из callback.
I Обработчик события может генерировать другие события иустанавливать другие обработчики.
Событийно-ориентированное программирование
Машина событийI Вся работа делается в обработчике события.
- в общем случае - callback.
I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.
I Обработчик события может генерировать другие события иустанавливать другие обработчики.
Событийно-ориентированное программирование
Машина событийI Вся работа делается в обработчике события.
- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то
управление возвращается машине событий.
в общем случае - return из callback.I Обработчик события может генерировать другие события и
устанавливать другие обработчики.
Событийно-ориентированное программирование
Машина событийI Вся работа делается в обработчике события.
- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то
управление возвращается машине событий.в общем случае - return из callback.
I Обработчик события может генерировать другие события иустанавливать другие обработчики.
Событийно-ориентированное программирование
Машина событийI Вся работа делается в обработчике события.
- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то
управление возвращается машине событий.в общем случае - return из callback.
I Обработчик события может генерировать другие события иустанавливать другие обработчики.
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.
- заменится обработчиком события "пришел запрос от пользователя"I Парсинг запроса, валидация.
- не изменитсяI Формирование запроса (запросов) в БД.
- не изменитсяI Ожидание ответа (ответов) из БД.
- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.
- не изменитсяI Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.
- не изменитсяI Формирование запроса (запросов) в БД.
- не изменитсяI Ожидание ответа (ответов) из БД.
- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.
- не изменитсяI Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.
- не изменитсяI Ожидание ответа (ответов) из БД.
- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.
- не изменитсяI Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.
- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.
- не изменитсяI Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.
- не изменитсяI Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.
- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программированиеПерестроим наш сервер
I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"
I Парсинг запроса, валидация.- не изменится
I Формирование запроса (запросов) в БД.- не изменится
I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"
I Соединение данных из БД с шаблоном.- не изменится
I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"
Событийно-ориентированное программирование
Итого
I Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста
нагрузки.I Но слишком много переделок!
Событийно-ориентированное программирование
ИтогоI Производительность одного сервера выросла в 10 раз
I Одного CPU/коннекта к БД достаточно для еще нескольких лет ростанагрузки.
I Но слишком много переделок!
Событийно-ориентированное программирование
ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста
нагрузки.
I Но слишком много переделок!
Событийно-ориентированное программирование
ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста
нагрузки.I Но слишком много переделок!
Событийно-ориентированное программирование
Что затронуто изменениями
I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.
I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.
Событийно-ориентированное программирование
Что затронуто изменениями
I Интерфейс с вебсервером (получение параметров запроса итп)
- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.
I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.
Событийно-ориентированное программирование
Что затронуто изменениями
I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.
I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.
Событийно-ориентированное программирование
Что затронуто изменениями
I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.
I Интерфейс с БД.
- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.
Событийно-ориентированное программирование
Что затронуто изменениями
I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.
I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачность
I Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”
I Простое управлениеТри основных метода
I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных метода
I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)
I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)
I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.
I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление
Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событий
I Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событийI Передача управления планировщику
I Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)
I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Интегрируем с машиной событийСтруктура кода теперь выглядит так:
I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события
ИтогоВернулись к (почти) традиционному виду программы.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событий
I Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibers
I Переписываем интерфейс с вебсервером- некритично, решается враппером.
I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.
I Переписываем другие сетевые обращения (если есть)- врапперы
I Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.
I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.
I Переписываем другие сетевые обращения (если есть)- врапперы
I Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.
I Переписываем другие сетевые обращения (если есть)- врапперы
I Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперы
I Итого: переписываем около 5% кода.
Событийно-ориентированное программирование
Вернемся к нашему серверу
I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером
- некритично, решается враппером.I Переписываем интерфейс с БД
- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)
- врапперыI Итого: переписываем около 5% кода.
Библиотеки и языки
I PerlCoro + AnyEvent
I Pythonfibers + twisted
I PHP5появился оператор yield, fiber
Библиотеки и языки
I Perl
Coro + AnyEventI Python
fibers + twistedI PHP5
появился оператор yield, fiber
Библиотеки и языки
I PerlCoro + AnyEvent
I Pythonfibers + twisted
I PHP5появился оператор yield, fiber
Библиотеки и языки
I PerlCoro + AnyEvent
I Python
fibers + twistedI PHP5
появился оператор yield, fiber
Библиотеки и языки
I PerlCoro + AnyEvent
I Pythonfibers + twisted
I PHP5появился оператор yield, fiber
Библиотеки и языки
I PerlCoro + AnyEvent
I Pythonfibers + twisted
I PHP5
появился оператор yield, fiber
Библиотеки и языки
I PerlCoro + AnyEvent
I Pythonfibers + twisted
I PHP5появился оператор yield, fiber
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты
I Node.JS- отказались от парадигмы fibers
I Tarantool...
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыкли
I Рассматриваем существующие вариантыI Node.JS
- отказались от парадигмы fibersI Tarantool...
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты
I Node.JS- отказались от парадигмы fibers
I Tarantool...
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты
I Node.JS
- отказались от парадигмы fibersI Tarantool...
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты
I Node.JS- отказались от парадигмы fibers
I Tarantool...
Что дальше?
I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты
I Node.JS- отказались от парадигмы fibers
I Tarantool...
Tarantool
I Полноценный app-серверI БД на борту
- in-memory- disk
I Сокеты, диск, http-сервер, очереди
Tarantool
I Полноценный app-сервер
I БД на борту- in-memory- disk
I Сокеты, диск, http-сервер, очереди
Tarantool
I Полноценный app-серверI БД на борту
- in-memory- disk
I Сокеты, диск, http-сервер, очереди
Tarantool
I Полноценный app-серверI БД на борту
- in-memory
- diskI Сокеты, диск, http-сервер, очереди
Tarantool
I Полноценный app-серверI БД на борту
- in-memory- disk
I Сокеты, диск, http-сервер, очереди
Tarantool
I Полноценный app-серверI БД на борту
- in-memory- disk
I Сокеты, диск, http-сервер, очереди
Недостатки
I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по
CPU/хостам.
Недостатки
I Для больших проектов одного CPU все-таки маловато
I Реализации fiber’ов для традиционных ЯП плохо масштабируются поCPU/хостам.
Недостатки
I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по
CPU/хостам.
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения
I Go- более низкий порог вхождения
Перспектива
I Erlang
- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения
I Go- более низкий порог вхождения
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам
- очень качественное решение- высокий порог вхождения
I Go- более низкий порог вхождения
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение
- высокий порог вхожденияI Go
- более низкий порог вхождения
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения
I Go- более низкий порог вхождения
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения
I Go
- более низкий порог вхождения
Перспектива
I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения
I Go- более низкий порог вхождения