nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
-
Upload
ontico -
Category
Engineering
-
view
1.179 -
download
6
Transcript of nginx.CHANGES.2015 / Игорь Сысоев, Валентин Бартенев (Nginx)
nginx.CHANGES.2015
Игорь Сысоев Валентин Бартенев
NGINX, Inc.• 2011 год
• Офисы
• San Francisco, 50 человек. Управление, маркетинг, продажи.
• Москва, 24 человека. Разработка, поддержка.
• Продукты
• nginx open source
• NGINX Plus
Безопасность• Бекэнды
• Поддержка SNI (1.7.0)
• Проверка сертификатов (1.7.0)
• Клиентские сертификаты (1.7.8)
• Шифрование ключа сертификата,ssl_password_file (1.7.3)
Бекэнды• Балансировка по хэшу (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)
Кэш• Ревалидация кэша (1.7.3)
• Поддержка Vary в кэше (1.7.7)
• proxy_force_ranges (1.7.7)
• proxy_cache_lock_age (1.7.8)
Прочее• JSON и XML в autoindex (1.7.9)
• add_header always (1.7.5)
• Несколько sub_filter’s в одном location иподдержка переменных (1.9.4)
Логи• Параметр "if" в "access_log" (1.7.0)
• Логирование в syslog (1.7.1)
Stream• Проксирование (1.9.0)
• Поддержка SSL (1.9.0)
• Ограничение доступа (1.9.2)
• Ограничение числа соединений (1.9.3)
Пулы потоков
Традиционная архитектура
Рабочий процесс nginx
Переключение задач Запрос №1 Запрос №2 Запрос №3
Кирил Георгиев на турнире в Болгарии сыграл параллельно 360 партий. Его итоговый результат: 284 победы, 70 вничью и 6 поражений.
nginx как безупречный гроссмейстер
Асинхронный подход
Плюсы: • Эффективное использование системных ресурсов
• Предсказуемая масштабируемость под высокими нагрузками
Минусы:
• Сложность программирования
• Сложность отладки
• Блокирующие операции могут нивелировать все плюсы
Цикл обработки событий nginx
Ожидание событий на соединениях
Получение очереди
новых событий
Обработка очереди в цикле
Ядро ОС
Обработка очереди событий
Начало
Конец Очередь пуста?
НетДаИзвлечь событие
Обработать
Важные особенности
• Обработка в одном потоке
• События обрабатываются «мгновенно»
• Время обработки событий суммируется
• Одно событие задерживает обработку последующих
На складе. Через час вернусь.
№4
Блокирующая операция
Ожидание...
Единственная блокирующая операция существенно задерживает обработку остальных запросов
Блокирующие операции в nginx
● Сторонние модули, работающие синхронно с различными библиотеками и базами данных
● Операции с жестким диском
Задержка (µc)Память < 0,1Диск 100-1000+
● FreeBSD — есть неплохая поддержка AIO ● Linux требует флага O_DIRECT
Доставка оформлена.Следующий!
Пул потоков
Цикл обработки событий
Новое задание Очередь заданий
Обработанные задания
Генератор рандомизированной нагрузки
Генератор тестовой нагрузки
Тестовая система с nginx 1.9.0
12 ЦПУ-ядер
10 Гбит/с сеть
48 Гб ОЗУ
256 Гб данных
• 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)
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
Результаты первого теста (без пулов потоков):
% 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
На интерфейсе сервера:
Тестовый клиент:
Наблюдения
• Сервер отдает только ~1 Гбит/c
• Существенные задержки даже для данных, которые отдаются из памяти
• Запросы случайных файлов со второго клиента блокируют рабочие процессы nginx
Рабочие процессы nginx большую часть времени заблокированы на I/O.
Пулы потоков не используются
А теперь включим пул потоков и повторим тест.
location / { root /storage; aio threads;}
Результаты второго теста (пул потоков включен):
% 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
На интерфейсе сервера:
Тестовый клиент:
Трафик Задержки Запросов секунду
Было ~1 Гбит/c 7.42 сек 8
Стало 9,5 Гбит/c 226.32 мс 250
Прирост в 9.5 раз в ~33 раза в ~31 раз
Результаты
Рабочие процессы nginx большую часть времени спят в ожидании событий.
Пулы потоков задействованы
Недостатки
• Накладные расходы на добавление заданий
• Операции с файлами, которые могут быть обработаны сразу, всё ещё ждут в очереди
• Отсутствует возможность узнать где находятся данные: в кэше ОС или на диске
• Системные вызовы fincore() (предложен в 2010 году) и preadv2(RWF_NONBLOCK) до сих пор отсутствуют в ядре
reuseport
reuseport
workerkernel
master
worker
listen socket
reuseport
worker
master
workerlisten socket
listen socketkernel
reuseport• Linux 3.9
• setsockopt(SO_REUSEPORT)
• listen reuseport (1.9.1)
nginScript
nginScript• Альтернативы
• Perl
• Lua
• JavaScript
nginScript• Странности Lua
• begin .. end
• Индексы в массивах начинаются с 1
• Регулярные выражения“%w+%d” vs “\w+\d”
nginScript
nginScript• JavaScript
• Google V8
• Mozilla SpiderMonkey
• Apple JavaScriptCore
nginScript• Google V8
• Переносимость
• Проблемы с памятью, сборка мусора
• Прерывание исполнения
• Погоня за изменениями API
nginScript
request
bytecode
request
JS VM
request
JS VMJS VM
nginScript• Регистровая виртуальная машина
• Нет JIT
• Нет сборщика мусора
• Разделяемый объект для взаимодействия между виртуальными машинами
• Подмножество ECMAScript 5.1:
• нет closures
• не все встроенные объекты (Date, Math, JSON)
nginScript• $r
• method
• uri
• args{}
• httpVersion
• headers{}
• remoteAddress
nginScript• $r.response
• status
• headers{}
• contentType
• contentLength
• sendHeader()
• send(data)
• finish()
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();
";}
nginScriptjs_set $headers "
var h, s = '';
for (h in $r.headers)
s += h + ': ' + $r.headers[h] + ‘\r\n';
s”;
location /headers {
return 200 $headers;
}
HTTP/2
Развенчиваем мифы
Чем HTTP/2 не является: • Полной заменой HTTP/1 • Нарушением законов физики • Серебряной пулей
Что же такое HTTP/2: • Тот же SPDY с некоторыми отличиями • Транспортный слой для HTTP/1 со своими плюсами и минусами
• Экономия на хэндшейках
Основные особенности
• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация
Основные особенности
• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация
Бинарщина
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
Основные особенности
• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация
Ответ №1
Ответ №2
Ответ №3
HTTP/2
Единственное TCP соединение
Мультиплексирование
Основные особенности
• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация
Основные особенности
• Бинарный протокол • Мультиплексирование • Компрессия заголовков HPACK • Приоритезация
Проводим эксперимент
https://github.com/ipeychev/http2rulez.com
Содержимое
• Клиент: Chromium 45.0.2454.85 (64-bit)
• Сеть: loopback, netem, MTU 1400
Тестовая страница:
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
Время полной загрузки страницы
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
Время отрисовки страницы
Подводные камни• Сложный протокол
• Обратный эффект HTTP/1 оптимизаций
• Хорошо работает в определенных условиях
• Ограничения на используемые шифры
• Для каждого сайта эффект может отличаться, необходимо тестировать
Футболки!!!• Идём на nginx.com
• Устанавливаем Free Trial
• Показываем “nginx -V” на нашем стенде
• Получаем футболку (PROFIT!!!)