nginx.changes.2015 / Игорь Сысоев, Валентин Бартенев (nginx)

61
nginx.CHANGES.2015 Игорь Сысоев Валентин Бартенев

Upload: ontico

Post on 06-Jan-2017

1.179 views

Category:

Engineering


6 download

TRANSCRIPT

Page 1: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginx.CHANGES.2015

Игорь Сысоев Валентин Бартенев

Page 2: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

NGINX, Inc.• 2011 год

• Офисы

• San Francisco, 50 человек. Управление, маркетинг, продажи.

• Москва, 24 человека. Разработка, поддержка.

• Продукты

• nginx open source

• NGINX Plus

Page 3: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Безопасность• Бекэнды

• Поддержка SNI (1.7.0)

• Проверка сертификатов (1.7.0)

• Клиентские сертификаты (1.7.8)

• Шифрование ключа сертификата,ssl_password_file (1.7.3)

Page 4: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Бекэнды• Балансировка по хэшу (1.7.2)

Cache::MemcachedCache::Memcached::Fast (ketama/160)

• Разделяемые зоны (1.9.0)

• Небуферизированное проксирование телазапроса (1.7.11)

• proxy_next_upstream_tries,proxy_next_upstream_timeout (1.7.5)

• proxy_limit_rate (1.7.7)

Page 5: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Кэш• Ревалидация кэша (1.7.3)

• Поддержка Vary в кэше (1.7.7)

• proxy_force_ranges (1.7.7)

• proxy_cache_lock_age (1.7.8)

Page 6: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Прочее• JSON и XML в autoindex (1.7.9)

• add_header always (1.7.5)

• Несколько sub_filter’s в одном location иподдержка переменных (1.9.4)

Page 7: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Логи• Параметр "if" в "access_log" (1.7.0)

• Логирование в syslog (1.7.1)

Page 8: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Stream• Проксирование (1.9.0)

• Поддержка SSL (1.9.0)

• Ограничение доступа (1.9.2)

• Ограничение числа соединений (1.9.3)

Page 9: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Пулы потоков

Page 10: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Традиционная архитектура

Рабочий процесс nginx

Переключение задач Запрос №1 Запрос №2 Запрос №3

Page 11: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Кирил Георгиев на турнире в Болгарии сыграл параллельно 360 партий. Его итоговый результат: 284 победы, 70 вничью и 6 поражений.

nginx как безупречный гроссмейстер

Page 12: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Асинхронный подход

Плюсы: • Эффективное использование системных ресурсов

• Предсказуемая масштабируемость под высокими нагрузками

Минусы:

• Сложность программирования

• Сложность отладки

• Блокирующие операции могут нивелировать все плюсы

Page 13: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Цикл обработки событий nginx

Ожидание событий на соединениях

Получение очереди

новых событий

Обработка очереди в цикле

Ядро ОС

Page 14: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Обработка очереди событий

Начало

Конец Очередь пуста?

НетДаИзвлечь событие

Обработать

Page 15: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Важные особенности

• Обработка в одном потоке

• События обрабатываются «мгновенно»

• Время обработки событий суммируется

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

Page 16: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

На складе. Через час вернусь.

№4

Page 17: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Блокирующая операция

Ожидание...

Единственная блокирующая операция существенно задерживает обработку остальных запросов

Page 18: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Блокирующие операции в nginx

● Сторонние модули, работающие синхронно с различными библиотеками и базами данных

● Операции с жестким диском

Задержка (µc)Память < 0,1Диск 100-1000+

● FreeBSD — есть неплохая поддержка AIO ● Linux требует флага O_DIRECT

Page 19: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Доставка оформлена.Следующий!

Page 20: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Пул потоков

Цикл обработки событий

Новое задание Очередь заданий

Обработанные задания

Page 21: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Генератор рандомизированной нагрузки

Генератор тестовой нагрузки

Тестовая система с nginx 1.9.0

12 ЦПУ-ядер

10 Гбит/с сеть

48 Гб ОЗУ

256 Гб данных

Page 22: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

• 2 x Intel Xeon E5645 (итого 12 ядер, 24 HT-потока)

• 4 x Western Digital WD1003FBYX в RAID10 массиве

• 48 Гб оперативной памяти

• 10 Гбит/с сетевой интерфейс

• Ubuntu Server 14.04.1 LTS

Конфигурация системы:

Генератор нагрузки:

• Рандомизированная: -c200

• Тестовая: -c50

Набор данных:

• 256 Гб псевдослучайных байт в файлах по 4 Мб

Тестовый стенд

wrk (https://github.com/wg/wrk)

Page 23: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

worker_processes 16;

events { accept_mutex off; }

http { include mime.types; default_type application/octet-stream;

access_log off; sendfile on; sendfile_max_chunk 512k;

server { listen 8000; location / { root /storage; } }}

nginx.conf

Page 24: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Результаты первого теста (без пулов потоков):

% ifstat -bi eth2eth2Kbps in Kbps out5531.24 1.03e+064855.23 812922.75994.66 1.07e+065476.27 981529.36353.62 1.12e+065166.17 892770.35522.81 978540.86208.10 985466.76370.79 1.12e+066123.33 1.07e+06

Running 1m test @ http://192.0.2.1:8000/1/1/1 12 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 7.42s 5.31s 24.41s 74.73% Req/Sec 0.15 0.36 1.00 84.62% 488 requests in 1.01m, 2.01GB readRequests/sec: 8.08Transfer/sec: 34.07MB

На интерфейсе сервера:

Тестовый клиент:

Page 25: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Наблюдения

• Сервер отдает только ~1 Гбит/c

• Существенные задержки даже для данных, которые отдаются из памяти

• Запросы случайных файлов со второго клиента блокируют рабочие процессы nginx

Page 26: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Рабочие процессы nginx большую часть времени заблокированы на I/O.

Пулы потоков не используются

Page 27: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

А теперь включим пул потоков и повторим тест.

location / { root /storage; aio threads;}

Page 28: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Результаты второго теста (пул потоков включен):

% ifstat -bi eth2eth2Kbps in Kbps out60915.19 9.51e+0659978.89 9.51e+0660122.38 9.51e+0661179.06 9.51e+0661798.40 9.51e+0657072.97 9.50e+0656072.61 9.51e+0661279.63 9.51e+0661243.54 9.51e+0659632.50 9.50e+06

Running 1m test @ http://192.0.2.1:8000/1/1/1 12 threads and 50 connections Thread Stats Avg Stdev Max +/- Stdev Latency 226.32ms 392.76ms 1.72s 93.48% Req/Sec 20.02 10.84 59.00 65.91% 15045 requests in 1.00m, 58.86GB readRequests/sec: 250.57Transfer/sec: 0.98GB

На интерфейсе сервера:

Тестовый клиент:

Page 29: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Трафик Задержки Запросов секунду

Было ~1 Гбит/c 7.42 сек 8

Стало 9,5 Гбит/c 226.32 мс 250

Прирост в 9.5 раз в ~33 раза в ~31 раз

Результаты

Page 30: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Рабочие процессы nginx большую часть времени спят в ожидании событий.

Пулы потоков задействованы

Page 31: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Недостатки

• Накладные расходы на добавление заданий

• Операции с файлами, которые могут быть обработаны сразу, всё ещё ждут в очереди

• Отсутствует возможность узнать где находятся данные: в кэше ОС или на диске

• Системные вызовы fincore() (предложен в 2010 году) и preadv2(RWF_NONBLOCK) до сих пор отсутствуют в ядре

Page 32: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

reuseport

Page 33: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

reuseport

workerkernel

master

worker

listen socket

Page 34: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

reuseport

worker

master

workerlisten socket

listen socketkernel

Page 35: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

reuseport• Linux 3.9

• setsockopt(SO_REUSEPORT)

• listen reuseport (1.9.1)

Page 36: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript

Page 37: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• Альтернативы

• Perl

• Lua

• JavaScript

Page 38: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• Странности Lua

• begin .. end

• Индексы в массивах начинаются с 1

• Регулярные выражения“%w+%d” vs “\w+\d”

Page 39: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript

Page 40: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• JavaScript

• Google V8

• Mozilla SpiderMonkey

• Apple JavaScriptCore

Page 41: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• Google V8

• Переносимость

• Проблемы с памятью, сборка мусора

• Прерывание исполнения 

• Погоня за изменениями API

Page 42: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript

request

bytecode

request

JS VM

request

JS VMJS VM

Page 43: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• Регистровая виртуальная машина

• Нет JIT

• Нет сборщика мусора

• Разделяемый объект для взаимодействия между виртуальными машинами

• Подмножество ECMAScript 5.1:

• нет closures

• не все встроенные объекты (Date, Math, JSON)

Page 44: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• $r

• method

• uri

• args{}

• httpVersion

• headers{}

• remoteAddress

Page 45: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScript• $r.response

• status

• headers{}

• contentType

• contentLength

• sendHeader()

• send(data)

• finish()

Page 46: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScriptlocation /hello-world {

js_run "var res = $r.response;

res.status = 200;

res.contentType = 'text/plain';

var hw = 'Hello World!\r\n';

res.contentLength = hw.length;

res.sendHeader();

res.send(hw);

res.finish();

";}

Page 47: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

nginScriptjs_set $headers "

var h, s = '';

for (h in $r.headers)

s += h + ': ' + $r.headers[h] + ‘\r\n';

s”;

location /headers {

return 200 $headers;

}

Page 48: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

HTTP/2

Page 49: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Развенчиваем мифы

Чем HTTP/2 не является: • Полной заменой HTTP/1 • Нарушением законов физики • Серебряной пулей

Что же такое HTTP/2: • Тот же SPDY с некоторыми отличиями • Транспортный слой для HTTP/1 со своими плюсами и минусами

• Экономия на хэндшейках

Page 50: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Основные особенности

• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация

Page 51: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Основные особенности

• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация

Page 52: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Бинарщина

00 00 9D 01 25 00 00 00 01 00 00 00 00 B6 41 8A ..% . .A.90 B4 9D 7A A6 35 5E 57 21 E9 82 00 84 B9 58 D3 ...z.5^W!.. ..X.3F 85 61 09 1A 6D 47 87 53 03 2A 2F 2A 50 8E 9B ?.a..mG.S.*/*P..D9 AB FA 52 42 CB 40 D2 5F A5 11 21 27 51 8B 2D ...RB.@._..!'Q.-4B 70 DD F4 5A BE FB 40 05 DE 7A DA D0 7F 66 A2 [email protected] B0 DA E0 53 FA D0 32 1A A4 9D 13 FD A9 92 A4 ....S..2........96 85 34 0C 8A 6A DC A7 E2 81 04 41 04 4D FF 6A ..4..j.....A.M.j43 5D 74 17 91 63 CC 64 B0 DB 2E AE CB 8A 7F 59 C]t..c.d.......YB1 EF D1 9F E9 4A 0D D4 AA 62 29 3A 9F FB 52 F4 .....J...b):..R.F6 1E 92 B0 D3 AB 81 71 36 17 97 02 9B 87 28 EC .......q6.....(.33 0D B2 EA EC B9

HTTP/2.0 запрос:

HTTP/1.1 запрос:

GET / HTTP/1.1Host: demo.nginx.comAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8User-Agent: Chrome/47.0.2518.0

Page 53: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Основные особенности

• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация

Page 54: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Ответ №1

Ответ №2

Ответ №3

HTTP/2

Единственное TCP соединение

Мультиплексирование

Page 55: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Основные особенности

• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация

Page 56: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Основные особенности

• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация

Page 57: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Проводим эксперимент

https://github.com/ipeychev/http2rulez.com

Содержимое

• Клиент: Chromium 45.0.2454.85 (64-bit)

• Сеть: loopback, netem, MTU 1400

Тестовая страница:

Page 58: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

0 мс

1500 мс

3000 мс

4500 мс

6000 мс

7500 мс

9000 мс

RTT, мс

0 2 4 6 10 20 30 50 60 100 150 200 250 300 400 600

HTTP HTTP/2 HTTPS

Время полной загрузки страницы

Page 59: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

0 мс

1000 мс

2000 мс

3000 мс

4000 мс

5000 мс

RTT, мс

0 2 4 6 10 20 30 50 60 100 150 200 250 300 400 600

HTTP HTTP/2 HTTPS

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

Page 60: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Подводные камни• Сложный протокол

• Обратный эффект HTTP/1 оптимизаций

• Хорошо работает в определенных условиях

• Ограничения на используемые шифры

• Для каждого сайта эффект может отличаться, необходимо тестировать

Page 61: nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)

Футболки!!!• Идём на nginx.com

• Устанавливаем Free Trial

• Показываем “nginx -V” на нашем стенде

• Получаем футболку (PROFIT!!!)