197
HighLoad для начинающих

Highload для начинающих, Дмитрий Обухов (Mail.ru)

  • Upload
    ontico

  • View
    951

  • Download
    0

Embed Size (px)

DESCRIPTION

Доклад Дмитрия Обухова на HighLoad++ 2014.

Citation preview

Page 1: Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoadдля начинающих

Page 2: Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoad для начинающих

Dmitry E. Oboukhov

31 октября 2014

Page 3: Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoad, что это?

I Конференция?

I Высокая нагрузка?I Миф?!

Page 4: Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoad, что это?

I Конференция?I Высокая нагрузка?

I Миф?!

Page 5: Highload для начинающих, Дмитрий Обухов (Mail.ru)

HighLoad, что это?

I Конференция?I Высокая нагрузка?I Миф?!

Page 6: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Page 7: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду?

- средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Page 8: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Page 9: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!

I 1 запрос в секунду? - любой веб сервер?...перекодирующий видеоролики? :)

Page 10: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду?

- любой веб сервер?...перекодирующий видеоролики? :)

Page 11: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Page 12: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка что это?

I 53.328 ∗ 109 запросов в секунду? - средний CPU

I Более реалистично!I 1 запрос в секунду? - любой веб сервер?...

перекодирующий видеоролики? :)

Page 13: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка это:

Нагрузка, с которой не справляетсяжелезо

Page 14: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Высокая нагрузка это:

Нагрузка, с которой не справляетсяжелезо

Page 15: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Page 16: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограничения

I Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Page 17: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть

- за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Page 18: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Page 19: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I Память

I CPUI Хранилище данных

Page 20: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPU

I Хранилище данных

Page 21: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Когда это бывает?

Достигнуты технические ограниченияI Сеть - за рамками данного доклада

I ПамятьI CPUI Хранилище данных

Page 22: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Причины

I Недоиспользование железаI Трудности масштабирования

Page 23: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Причины

I Недоиспользование железа

I Трудности масштабирования

Page 24: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Причины

I Недоиспользование железаI Трудности масштабирования

Page 25: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Причины

Архитектурные проблемы

Page 26: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер.

на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 27: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl

, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 28: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python

, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 29: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby

...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 30: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 31: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.

I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 32: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.

I Валидация запроса, выборконтроллера.

I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 33: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.

I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 34: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.

I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 35: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).

I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 36: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 37: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 38: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один цикл

I один тред на один цикл

Page 39: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Рассмотрим типичный вебсервер. на Perl, Python, Ruby...

Задачи одного цикла

I Чтение запроса из сети.I Парсинг запроса http.I Валидация запроса, выбор

контроллера.I Запрос(ы) к хранилищу данных.I Формирование ответа (template).I Отправка ответа клиенту.

Традиционная реализация

I один процесс на один циклI один тред на один цикл

Page 40: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.I Увеличение числа серверов.

Page 41: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.

I Увеличение числа серверов.

Page 42: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начались разговоры о HighLoad?

I Увеличение числа процессов/тредов.I Увеличение числа серверов.

Page 43: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Page 44: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.

I Увеличили число процессов в работе.Помогло.

I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Page 45: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Page 46: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.

I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Page 47: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.

I Дальнейшее увеличение числа процессов помогает слабо.

Page 48: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Вернемся к рассматриваемому серверу

I Проблемы наступили при ≈100 запросах в секунду.I Увеличили число процессов в работе.

Помогло.I Новые проблемы при ≈150 запросов в секунду.I Дальнейшее увеличение числа процессов помогает слабо.

Page 49: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 50: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?

- Мы над этим 3 года работали!I Добавлять второй сервер?

- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 51: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 52: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?

- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 53: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!

I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 54: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.

I Провести измерения.I Найти слабые места.

Page 55: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.

I Найти слабые места.

Page 56: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Что делать?

I Менять архитектуру?- Мы над этим 3 года работали!

I Добавлять второй сервер?- Это тоже не просто!(бизнеслогика)

Спокойно!I Провести анализ архитектуры.I Провести измерения.I Найти слабые места.

Page 57: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Измерения

Чтение запроса из сети. 15К RPSПарсинг запроса, валидация, выбор контроллера. 150К RPS/CPU

Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Page 58: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Page 59: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPU

Запросы к хранилищу. 60К RPSФормирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Page 60: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Page 61: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPU

Отправка ответа клиенту. 15К RPS

Page 62: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеренияЧтение запроса из сети. 15К RPS

Парсинг запроса, валидация, выбор контроллера. 150К RPS/CPUЗапросы к хранилищу. 60К RPS

Формирование ответа (Соединение данных с template) 100К RPS/CPUОтправка ответа клиенту. 15К RPS

Page 63: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!

Page 64: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!

I У нас проблемы на 150 RPS!I Тут что-то не так!

Page 65: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!

I Тут что-то не так!

Page 66: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Итого1

115 103

+ 1150 103

+ 160 103

+ 1100 103

+ 115 103

= 6000RPS

Но, позвольте!I У нас проблемы на 150 RPS!I Тут что-то не так!

Page 67: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 68: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 69: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.

неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 70: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 71: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 72: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 73: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?

I Проблемы стали больше!I Почему?!

Page 74: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!

I Почему?!

Page 75: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Начинаем разбираться

I Хранилище выходит на свои RPS при достаточно большом числесоединений к нему.

I Либо хранилище надо располагать локально.неприемлемо.

I То же самое и с взаимодействием с клиентом.

Что делать?

I Попробуем еще увеличить число процессов?I Проблемы стали больше!I Почему?!

Page 76: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели

расчетные.

Page 77: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.

I Этот код AS IS по результатам измерений может выдавать гораздобольше RPS чем в реальности.

I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.

Page 78: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.

I Проблемы начинаются на уровне RPS на порядок меньших, нежелирасчетные.

Page 79: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Резюме ситуации, еще раз

I Имеется 100500 строк кода, над которым работали несколько лет.I Этот код AS IS по результатам измерений может выдавать гораздо

больше RPS чем в реальности.I Проблемы начинаются на уровне RPS на порядок меньших, нежели

расчетные.

Page 80: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 81: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.

I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 82: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.

I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 83: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.

I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 84: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.

I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 85: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.

I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 86: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 87: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Еще раз рассмотрим цикл обработки

I Ожидание запроса (данных) от пользователя.I Парсинг запроса, валидация.I Формирование запроса (запросов) в БД.I Ожидание ответа (ответов) из БД.I Соединение данных из БД с шаблоном.I Ожидание отправки данных клиенту.

I Следующий клиент!

Page 88: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Измеряем

Ожидание запроса (данных) от пользователя. 70 мксПарсинг запроса, валидация. 6 мкс

Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 89: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 90: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мкс

Формирование запроса (запросов) в БД. 1 мксОжидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 91: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 92: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мкс

Соединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 93: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мкс

Ожидание отправки данных клиенту. 70 мкс

Page 94: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИзмеряемОжидание запроса (данных) от пользователя. 70 мкс

Парсинг запроса, валидация. 6 мксФормирование запроса (запросов) в БД. 1 мкс

Ожидание ответа (ответов) из БД. 16 мксСоединение данных из БД с шаблоном. 10 мксОжидание отправки данных клиенту. 70 мкс

Page 95: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 =

17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Page 96: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мкс

I Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Page 97: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 =

156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Page 98: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мкс

I Код выполняется только 10% времени!I И при этом тормозит!

Page 99: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!

I И при этом тормозит!

Page 100: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

ИтогоI Код выполнялся: 6+ 1+ 10 = 17 мксI Чего-либо ожидали: 70+ 16+ 70 = 156 мксI Код выполняется только 10% времени!I И при этом тормозит!

Page 101: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

#include <unistd.h>

int main(int argc, char **argv) {int i;for (;;) {

usleep(70); usleep(7);usleep(16); usleep(10);usleep(70);

}}

Page 102: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 103: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU

- по моим измерениям - где-то 15% загрузки на CPUI Запустив десяток таких “воркеров”, получаем примерно такую же

нагрузку как на проблемном сервере.I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 104: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 105: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 106: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 107: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 108: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительность

достаточную для развития проекта еще на несколько лет вперед.I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 109: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 110: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.

I Что делать?

Page 111: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железаИтого

I Код, делающий только sleep в цикле неплохо грузит CPU- по моим измерениям - где-то 15% загрузки на CPU

I Запустив десяток таких “воркеров”, получаем примерно такую женагрузку как на проблемном сервере.

I Понятно что пример синтетический (есть вопросы к реализации usleep).

Вернемся к нашему серверу

I Каждая отдельная часть имеет хорошую производительностьдостаточную для развития проекта еще на несколько лет вперед.

I Большую часть времени (90%) наш код проводит в ожидании.I Что делать?

Page 112: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недоиспользование железа

Просто реорганизовать код

Page 113: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Компьютер — это конечный автомат. Треды для тех людей,которые не умеют программировать конечные автоматы.

Алан Кокс

Page 114: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Избавимся от тредов!

- и процессов.

Page 115: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Избавимся от тредов!- и процессов.

Page 116: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событий

I Вся работа делается в обработчике события.- в общем случае - callback.

I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Page 117: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Page 118: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.

I Когда программе нечего делать (например она ждет события), тоуправление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Page 119: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.

в общем случае - return из callback.I Обработчик события может генерировать другие события и

устанавливать другие обработчики.

Page 120: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Page 121: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Машина событийI Вся работа делается в обработчике события.

- в общем случае - callback.I Когда программе нечего делать (например она ждет события), то

управление возвращается машине событий.в общем случае - return из callback.

I Обработчик события может генерировать другие события иустанавливать другие обработчики.

Page 122: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 123: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.

- заменится обработчиком события "пришел запрос от пользователя"I Парсинг запроса, валидация.

- не изменитсяI Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 124: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 125: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.

- не изменитсяI Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 126: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 127: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.

- не изменитсяI Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 128: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 129: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.

- заменится обработчиком события "пришел ответ из БД"I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 130: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 131: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.

- не изменитсяI Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 132: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 133: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.

- заменится обработчиком события "данные пользователю отправлены"

Page 134: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программированиеПерестроим наш сервер

I Ожидание запроса от пользователя.- заменится обработчиком события "пришел запрос от пользователя"

I Парсинг запроса, валидация.- не изменится

I Формирование запроса (запросов) в БД.- не изменится

I Ожидание ответа (ответов) из БД.- заменится обработчиком события "пришел ответ из БД"

I Соединение данных из БД с шаблоном.- не изменится

I Ожидание отправки данных клиенту.- заменится обработчиком события "данные пользователю отправлены"

Page 135: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Итого

I Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.I Но слишком много переделок!

Page 136: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 раз

I Одного CPU/коннекта к БД достаточно для еще нескольких лет ростанагрузки.

I Но слишком много переделок!

Page 137: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.

I Но слишком много переделок!

Page 138: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ИтогоI Производительность одного сервера выросла в 10 разI Одного CPU/коннекта к БД достаточно для еще нескольких лет роста

нагрузки.I Но слишком много переделок!

Page 139: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Page 140: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)

- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Page 141: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Page 142: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.

- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Page 143: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Что затронуто изменениями

I Интерфейс с вебсервером (получение параметров запроса итп)- некритично. В крайнем случае обходится написанием "врапперов". Вбольшинстве случаев вообще незаметно.

I Интерфейс с БД.- критично. Много кода бизнеслогики поехало в callbacks. Сложнуюлогику практически невозможно реализовать. Требуется переписывание90% проекта.

Page 144: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 145: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачность

I Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 146: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”

I Простое управлениеТри основных метода

I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 147: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 148: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных метода

I Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 149: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)

I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 150: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)

I Разбудить выбранный процесс (wakeup, ready)

Page 151: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

ПланировщикПоскольку планировщик OS - очень тяжелый, необходим планировщикuserspace.

I Невытесняющая многозадачностьI Простое порождение “процессов”I Простое управление

Три основных методаI Создать процесс (create, async)I Передать управление планировщику (yield, cede)I Разбудить выбранный процесс (wakeup, ready)

Page 152: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 153: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событий

I Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 154: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщику

I Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 155: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)

I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 156: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 157: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Интегрируем с машиной событийСтруктура кода теперь выглядит так:

I Регистрация события в машине событийI Передача управления планировщикуI Событие будит текущий процесс (файбер)I Программа продолжает работу с данными от события

ИтогоВернулись к (почти) традиционному виду программы.

Page 158: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 159: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событий

I Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 160: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibers

I Переписываем интерфейс с вебсервером- некритично, решается враппером.

I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Page 161: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 162: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.

I Переписываем интерфейс с БД- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Page 163: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 164: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.

I Переписываем другие сетевые обращения (если есть)- врапперы

I Итого: переписываем около 5% кода.

Page 165: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 166: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперы

I Итого: переписываем около 5% кода.

Page 167: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Событийно-ориентированное программирование

Вернемся к нашему серверу

I Добавляем машину событийI Добавляем библиотеку fibersI Переписываем интерфейс с вебсервером

- некритично, решается враппером.I Переписываем интерфейс с БД

- относительно трудоемко, но решается враппером.I Переписываем другие сетевые обращения (если есть)

- врапперыI Итого: переписываем около 5% кода.

Page 168: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Page 169: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I Perl

Coro + AnyEventI Python

fibers + twistedI PHP5

появился оператор yield, fiber

Page 170: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Page 171: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Python

fibers + twistedI PHP5

появился оператор yield, fiber

Page 172: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Page 173: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5

появился оператор yield, fiber

Page 174: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Библиотеки и языки

I PerlCoro + AnyEvent

I Pythonfibers + twisted

I PHP5появился оператор yield, fiber

Page 175: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Page 176: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыкли

I Рассматриваем существующие вариантыI Node.JS

- отказались от парадигмы fibersI Tarantool...

Page 177: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Page 178: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS

- отказались от парадигмы fibersI Tarantool...

Page 179: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Page 180: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Что дальше?

I Используем fiber’ы/event-машины в том языке к которому привыклиI Рассматриваем существующие варианты

I Node.JS- отказались от парадигмы fibers

I Tarantool...

Page 181: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Page 182: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-сервер

I БД на борту- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Page 183: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Page 184: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-серверI БД на борту

- in-memory

- diskI Сокеты, диск, http-сервер, очереди

Page 185: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Page 186: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Tarantool

I Полноценный app-серверI БД на борту

- in-memory- disk

I Сокеты, диск, http-сервер, очереди

Page 187: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недостатки

I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по

CPU/хостам.

Page 188: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недостатки

I Для больших проектов одного CPU все-таки маловато

I Реализации fiber’ов для традиционных ЯП плохо масштабируются поCPU/хостам.

Page 189: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Недостатки

I Для больших проектов одного CPU все-таки маловатоI Реализации fiber’ов для традиционных ЯП плохо масштабируются по

CPU/хостам.

Page 190: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Page 191: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang

- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Page 192: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам

- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Page 193: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение

- высокий порог вхожденияI Go

- более низкий порог вхождения

Page 194: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Page 195: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go

- более низкий порог вхождения

Page 196: Highload для начинающих, Дмитрий Обухов (Mail.ru)

Перспектива

I Erlang- хорошее масштабирование по CPU и хостам- очень качественное решение- высокий порог вхождения

I Go- более низкий порог вхождения

Page 197: Highload для начинающих, Дмитрий Обухов (Mail.ru)