Всё внутри kubernetes, но в целом он тут, кажется, не очень важен, я грешу на nginx. В качестве ингресса - ingress-nginx.
Общая архитектура: на входе стоит ingress-nginx, за ним несколько сервисов. Статика в отдельном контейнере с nginx, также есть несколько сервисов.
Сейчас ingress-nginx настроен с отключенным HTTP/2. Загрузка выглядит так. Сгруппированные ресурсы начинают загружаться одновременно.
/researches 2.4 kB 24 ms
/static/js/main.dea63410.chunk.js 124 kB 108 ms
/static/js/4.596e458a.chunk.js 1700 kB 1070 ms
/api/dictionaries/recommendationsWithServiceNames 3.8 kB 40 ms
/api/dictionaries/structuredConclusionResults 1.6 kB 36 ms
/api/dictionaries/structuredDescriptions 2.4 kB 47 ms
/static/js/10.8d651677.chunk.js 15.6 kB 59 ms
...
Как видно, в этом примере основное время уходит на /static/js/4.596e458a.chunk.js
, остальное грузится условно-моментально. Дальше грузятся другие ресурсы, но пока остановимся тут, для демонстрации проблемы этого достаточно.
Я включаю http-2 в ingress-nginx, больше ничего не делаю. Насколько я понимаю, это добавляет директиву http2 on
во все локации сгенерированного nginx.conf.
И теперь смотрю загрузку:
/researches 2.2 kB 34 ms
/static/js/main.dea63410.chunk.js 124 kB 778 ms
/static/js/4.596e458a.chunk.js 1700 kB 732 ms
/api/dictionaries/recommendationsWithServiceNames 3.6 kB 832 ms
/api/dictionaries/structuredConclusionResults 1.4 kB 832 ms
/api/dictionaries/structuredDescriptions 2.2 kB 832 ms
/static/js/10.8d651677.chunk.js 15.5 kB 975 ms
Первое, что заметно - размер загрузки чуть поменьше у каждого ресурса. Вероятно заголовки чуть меньше весят.
Второе, что заметно - файл /static/js/main.dea63410.chunk.js
грузится очень долго. В целом это не проблема, т.к. грузится параллельно со /static/js/4.596e458a.chunk.js
но всё же отличие большое.
И самая фатальная проблема - мелкие эндпоинты и мелкие статические файлики начинают грузиться очень долго.
Суммарно с HTTP/1.1 страница появляется примерно через 2-3 секунды, с HTTP/2 через 10-15 секунд.
Собственно всё время теряется непонятно где - в мелких файликах, которые реально из проксируемого сервиса отдаются абсолютно моментально.
Все вышеперечисленные измерения проведены на практически неиспользуемом сайте, кеширование отключено, замеры произведены многократно и тд и тп, воспроизводится в 100% случаев.
Я это явление увидел примерно год назад, разбираться не стал, просто отключил HTTP/2. Сейчас всё же хочу разобраться, т.к. версия с тем, что в какой-то версии nginx был какой-то баг, уже не принимается, с той поры обновлялся не раз и постоянно пробую включать HTTP/2 и постоянно наблюдаю эту ситуацию.
Размер сгенерированного файла nginx.conf больше 3000 строк, полагаю, никто его читать не будет, если интересуют конкретные директивы - спрашивайте, посмотреть недолго.
Если я из пода с ingress-nginx-ом дёргаю curl-ом запрашиваемые URL-ы у проксируемых сервисов, всё отрабатывает абсолютно моментально. В тех местах тормозить просто нечему.
Честно говоря я пока не понимаю, в чём может быть проблема. Я бы понял, если бы разница была в десятки процентов даже, но когда время загрузки файла вырастает с 40 ms до 840 ms, это мне непонятно.
Никаких особых настроек у ingress-nginx я не делал, практически все настройки «по умолчанию», те, что не по умолчанию - я пробовал менять.
allow-snippet-annotations: "false"
enable-brotli: "false"
proxy-buffering: "off"
proxy-real-ip-cidr: 10.160.32.0/20
use-gzip: "false"
use-http2: "true"
use-proxy-protocol: "true"
Вот конкретно все настройки, это я пробую без сжатия и буферизации, обычно оно включено. Без них время загрузки вообще по несколько секунд на каждый ресурс. Какое-то безумие.
Сайт за HTTPS, терминируется в самом ingress-nginx, поэтому грешить на что-либо до него я тоже не могу, перед ним, конечно, стоит балансировщик нагрузки, но для него это просто бинарный непрозрачный поток.