NSURLSession: потоковые пики задержки - PullRequest
0 голосов
/ 18 апреля 2019

У нас есть потоковое приложение, которое по существу загружает данные (видео) на сервер в очень сжатые сроки.Для этого мы используем потоковую передачу по протоколу http (через загрузку NSURLSessionTaskWithStreamedRequest), а не через веб-сокеты / прямое соединение.Размеры куска составляют около 100-300 КБ.И у нас есть проблема с загрузкой, которую трудно отследить до корней ... Любой совет, добро пожаловать.

Проблема: Время от времени возникают скачки задержки загрузки для НЕКОТОРЫХ файлов.Как 1 файл из 15-20 загружен в два раза медленнее, чем другие.Это происходит время от времени и без каких-либо видимых скороговорок.Это происходит даже при очень хорошей связи.И мы должны избавиться от этих всплесков, когда сетевые условия позволяют стабильную загрузку - так как мы выполняем потоковую передачу видео, даже 1 из 15-20 «поздних» файлов дают нашим пользователям «паузу» при воспроизведении в реальном времени.

Мы быливозможность воспроизвести эту ситуацию в деталях в локальной сети с идеальными условиями.1) Клиент (загрузчик): iPhone XR с IOS12.2) Клиент загружает один файл размером 300 КБ через локальную сеть через Wi-Fi.После успешной загрузки клиент начинает загружать его снова, чтобы мы могли измерить статистику последовательных загрузок. 3) Сервер: Node.js ничего не делает - просто получает данные и время регистрации.4) Код загрузки:

***
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
configuration.allowsCellularAccess = YES;
configuration.HTTPShouldUsePipelining = YES;
configuration.networkServiceType = NSURLNetworkServiceTypeVoice;
***
NSInputStream* inputStream = [[NSInputStream alloc] initWithFileAtPath: pathTo300KbFile ];
[httpManager setTaskNeedNewBodyStreamBlock:^NSInputStream * _Nonnull(NSURLSession * _Nonnull session, NSURLSessionTask * _Nonnull task) {
    return inputStream;
}];
***
NSMutableURLRequest *fileRequest = [NSMutableURLRequest requestWithURL:URL
                                                       cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                                   timeoutInterval:100];
[fileRequest setHTTPMethod:@"POST"];
***
NSURLSessionUploadTask* uploadTask = [httpManager uploadTaskWithStreamedRequest:fileRequest progress:... completionHandler:...];
[uploadTask resume];
***

Этот код просто начинает загрузку заново с самого начала, после uploadTask возвращает успех (через обратный вызов)

5) «Нормальный» Результаты теста.В большинстве случаев это происходит, вы можете видеть, что среднее время загрузки файла размером 300 КБ в локальной сети достаточно низкое и стабильное - около 0,5 секунд

2019-04-18 15:07:44.793512+0300 DVGCore_Example[2016:1384429] VidLib: #191:300kb-s1-7. Success: +0.54
2019-04-18 15:07:46.019874+0300 DVGCore_Example[2016:1384370] VidLib: #192:300kb-s1-8. Success: +0.67
2019-04-18 15:07:46.828315+0300 DVGCore_Example[2016:1383910] VidLib: #193:300kb-s1-9. Success: +0.37
2019-04-18 15:07:48.383446+0300 DVGCore_Example[2016:1383909] VidLib: #194:300kb-s1-10. Success: +0.83
2019-04-18 15:07:48.948218+0300 DVGCore_Example[2016:1384429] VidLib: #195:300kb-s1-1. Success: +0.29
2019-04-18 15:07:50.116136+0300 DVGCore_Example[2016:1383910] VidLib: #196:300kb-s1-2. Success: +0.37
2019-04-18 15:07:51.168454+0300 DVGCore_Example[2016:1384428] VidLib: #197:300kb-s1-3. Success: +0.33
2019-04-18 15:07:52.244631+0300 DVGCore_Example[2016:1384370] VidLib: #198:300kb-s1-4. Success: +0.33

Пример журналов сервера относительно среднего (с таймингами получения)нормальная загрузка: https://gist.github.com/IPv6/27dc7a8e4a53b5219e39cce73691c0be

6) Но для некоторых загрузок время от времени возникают скачки.В 2-3 раза длиннее

2019-04-18 15:16:50.492425+0300 DVGCore_Example[2022:1385864] VidLib: #124:300kb-s1-8. Success: +1.87
2019-04-18 15:22:06.395094+0300 DVGCore_Example[2027:1387221] VidLib: #200:300kb-s1-6. Success: +2.11
2019-04-18 15:23:28.329843+0300 DVGCore_Example[2027:1387610] VidLib: #281:300kb-s1-9. Success: +2.84

Пример журналов сервера для этой загрузки: https://gist.github.com/IPv6/8d92b3899682c4cf697dbfb64a1b752c

В нижней части: нет причин для этого (нет проблем с сетью и т. Д.) ИПохоже, IOS должен уметь выполнять потоковую передачу без задержек в течение нескольких часовНо этого не происходит.

Мы видим это в идеальной локальной среде, а в "реальном мире" такие же всплески встречаются еще чаще.

Вопрос в том, как от них избавиться?есть идеи?

1 Ответ

0 голосов
/ 23 апреля 2019

Хорошая статья, которая помогла отследить причину https://forums.developer.apple.com/thread/45210

в нашем случае используемый в тесте маршрутизатор Wi-Fi имеет проблемы с получением трафика

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...