Я пытаюсь загрузить файлы большого размера (50–32 ГБ) на Google.Drive. Я использую google-api-dotnet, который обеспечивает логику загрузки и поддержку шифрования. Основная проблема - низкая скорость загрузки.
Я просмотрел api исходный код. Каждый файл загружается фрагментами (я установил размер фрагмента 4 МБ). Каждый фрагмент загружается через новый экземпляр HttpRequestMessage. HttpClient создается после запуска службы api и повторно используется для всех запросов.
Скорость загрузки составляет 600 кбайт / с и стабильна, в то время как мой аплинк в 10 раз быстрее.
Я захватил трафик с помощью Wireshark: Каждый фрагмент разделен на сотни или тысячи небольших пакетов TLS. И для каждого упакованного маленького TLS ожидается подтверждение. Таким образом, итоговая скорость очень мала.
Но когда я запускаю прокси-сервер Fiddler, скорость становится такой же, как у моего восходящего канала. Пакеты TLS идут очень быстро параллельно, а подтверждения принимаются позже:
Я пробовал свой код на 5 ПК с Win7, и все они показали одинаково низкую скорость загрузки. Но когда я попробовал на ПК Win10 - скорость была очень хорошей. Также я попробовал клиентское приложение Google.Drive, и у него были такие же проблемы со скоростью. Я попытался найти информацию об этом поведении, но ничего не нашел.
- Почему блоки размером 4 МБ разделены на пакеты TLS по 4 КБ? Могу ли я увеличить размер пакетов TLS?
- Как я могу сделать так, чтобы пакеты TLS отправлялись параллельно, как это делает Fiddler?
- Или есть другие способы увеличения скорости отдачи?