Почему HTTP/2 медленнее обычного HTTPS?
Я оцениваю, что могу получить для своего веб-сайта от HTTP2 с точки зрения производительности и получения странного результата - сайт в Европе загружен из США:
- с HTTP/2 - через 6-7 секунд
- с обычным HTTPS - через 5-6 секунд (примерно на 1 секунду быстрее)
У меня есть скриншоты из сетевого монитора Chrome, и похоже, что с HTTP/2 большинство ресурсов загружаются один за другим, а не параллельно, как в случае простого SSL.
Для тестирования я использую свое веб-приложение Apache 2.4.17 (Win32) в качестве прокси (для применения поддержки протоколов SSL и HTTP/2). Клиентский браузер Chrome 46.0.2490.86 на Windows 7.
Захваченные сетевые запросы приведены ниже. Краткое содержание:
1. Fist one - HTML-страница
2. Следующая группа - 6 запросов - ресурсы, объявленные непосредственно в HTML
3. Остальные - ресурсы добавляются динамически через теги script ('script' и 'link/css' в документе/голове).
Левая часть изображения - HTTP/2, правая сторона - тот же персонал через простой SSL (http2_module выключен).
![введите описание изображения здесь]()
Обновление. Я протестировал "что-то еще", что поддерживает HTTP/2 как обратный прокси. Это nginx 1.9.7.1 Kitty из http://nginx-win.ecsds.eu - вилка оригинального nginx 'для окон'. HTTP/2 в оригинальном nginx доступен только в коммерческой версии, поэтому я не мог попробовать. И похоже, что нет других серверов для реализации HTTP/2 + обратного прокси доступного для Windows, или я просто не мог их найти (список здесь и здесь).
Результат, который у меня есть с Китти, еще более вводит в заблуждение - в Apache нет "последовательной нагрузки" ресурсов, но скорость передачи данных в два раза медленнее по HTTP/2, чем по сравнению с обычным SSL. Конечный результат - HTTP/2 значительно медленнее обычного SSL. Ниже они все рядом.
Из всего этого я могу только предположить, что производительность сильно зависит от реализации, а доступная в настоящий момент реализация выполняет странно, чтобы сделать какое-либо последовательное заключение о HTTP/2.
![введите описание изображения здесь]()
Ответы
Ответ 1
Итак, наконец, мое решение - нет ничего плохого в самом HTTP/2, что-то не так с имеющимися в настоящее время реализациями.
- Apache HTTPD 2.4.17/Win32 - имеет некоторый странный эффект "последовательной нагрузки"
- nginx Kitty - обеспечивает странно медленную скорость передачи
- официальный бесплатный nginx не имеет модуля http2, встроенного в
но
обе показывают ожидаемую производительность. Вот скриншот для того же теста, выполненного в "вопросе", но с обратным прокси Apache, размещенным на компьютере Linux другого парня.
![введите описание изображения здесь]()
Ответ 2
Мы запускаем последний nginx с http/2
nginx version: nginx/1.9.10
built with OpenSSL 1.0.2e 3 Dec 2015
TLS SNI support enabled
Мы сделали то же самое наблюдение. Мы регистрируем $request_time и $upstream_time. Хотя upstream_time равно независимо от протокола, общее время request_time отличается:
# grep ' 443 ' access.log|grep 'HTTP/1.1'| cut -d ' ' -f 3,4 | awk '{r+=$1; u+=$2} END {print r/NR; print u/NR}'
0.0116887 # HTTP/1.1 request_time in seconds
0.00673473 # HTTP/1.1 upstream_time in seconds
# grep ' 443 ' access.log|grep 'HTTP/2.0'| cut -d ' ' -f 3,4 | awk '{r+=$1; u+=$2} END {print r/NR; print u/NR}'
0.0363673 # HTTP/2.0 request_time in seconds
0.00695812 # HTTP/2.0 upstream_time in seconds
Таким образом, общее время запроса для http/1.1 в три раза лучше! Возможно, что-то не работает с ведением журнала request_time и http/2 из-за потоков. Я действительно не знаю, но обещание заключалось в том, что http/2 быстрее, чем http/1.1, если обе работают на TLS.
Но я продолжу расследование этого.
Ответ 3
Посмотрите на это, это модифицированная версия nginx, разработанная с Taobao.org, и используемая AliExpress и многие другие занятые сайты. Он поддерживает HTTP2 из коробки, а также некоторые другие функции, доступные только в коммерческом nginx, например, управление вверх по течению.
http://tengine.taobao.org/