У меня есть приложение на 2 экземплярах EC2, сидящих за ELB. ELB выполняет завершение HTTPS, а затем сообщает экземплярам HTTP.
При загрузке через HTTPS передача, похоже, ограничена ~ 10 Мбит / с на файл (например, 2 файла будут загружены со скоростью 20 Мбит / с, 3 - со скоростью 30 Мбит / с и т. Д.), Тогда как если я передаю через HTTP, я могу легко заполнить ссылку для загрузки 100 Мбит / с. одним файлом.
Я попытался перенести завершение HTTPS на экземпляры (nginx), и мои тесты дали те же результаты.
Я пробовал использовать разные клиенты (ОС и браузер) и разные сети восходящей связи. Результаты всегда одни и те же.
Я действительно не знаю, с чего начать устранение этой проблемы, поэтому я буду очень признателен за любые рекомендации.
Я предполагаю, что ELB разработан для горизонтальной масштабируемости, не обязательно для высокой пропускной способности однопотока. Это то, что вы также заметили - многие параллельные потоки работают хорошо, но каждый из них ограничен некоторой максимальной пропускной способностью.
Если вы хотите ускорить загрузку в AWS, взгляните на S3 Ускорение передачи - это, вероятно, будет намного быстрее, и ваши файлы будут сохранены непосредственно в корзине S3, откуда они могут быть обработаны вашим приложением. Вы даже можете получить Уведомления в социальных сетях всякий раз, когда завершается загрузка нового файла, чтобы вы могли начать, он обрабатывается немедленно.
Конечно, это зависит от вашего варианта использования, но загрузка больших файлов через ELB и Nginx не похоже на то, что вы используете для этой цели лучшие доступные сервисы. Они больше подходят для работы с большим количеством одновременных пользователей, а не с небольшим количеством активных пользователей.
Надеюсь, это поможет :)
Оказывается, это проблема HTTP2.
Ссылаясь на представителя службы поддержки AWS:
Хотя ALB поддерживает передачу данных с использованием протокола HTTP 2.0 при подключении через HTTPS, загрузка файла может быть медленнее, чем HTTP1.1, если клиент использует один поток в соединении для его загрузки.
В общем случае HTTP2 представляет дополнительный уровень управления потоком поверх управления потоком TCP, который предназначен для того, чтобы позволить приложениям контролировать пропускную способность для каждого потока HTTP2.0, позволяя приложениям обеспечивать равное обращение со всеми потоками в соединении или, наоборот, чтобы сделать один или несколько потоков приоритетными над другими.
В ALB обновление окна HTTP / 2.0 для одного потока ограничено до 64 КБ. Клиенты должны последовательно объявлять кадр WINDOW_UPDATE для каждых 64 КБ, в противном случае, если он медленный, это отрицательно повлияет на пропускную способность, когда только один поток используется для выполнения больших загрузок в сетях с относительно высокой задержкой по сравнению с HTTP / 1.1 или более ранними версиями, в которых эта функция отсутствует. .
Обычно клиенты в Интернете, такие как Chrome, Firefox и другие, предназначены для медленной рекламы, учитывая, что сервер имеет большее ограничение на фрейм, испытывая задержку.
Мы отключили HTTP2, и загрузка стала молниеносной!