NSURLSession:流延迟峰值

NSURLSession: streaming latency spikes

我们有流媒体应用程序,它基本上是在非常紧迫的时间内在服务器上上传数据(视频块)。我们使用 http 流式处理(通过 NSURLSession uploadTaskWithStreamedRequest),而不是 websockets/direct 连接。 块大小约为 100Kb-300Kb。而且我们有一个上传问题,很难追根究底...欢迎任何建议。

问题:某些文件的上传延迟偶尔会出现峰值。 15-20 个文件中有 1 个文件的上传速度是其他文件的两倍。这种情况偶尔发生,没有任何可见的模式。即使连接非常好也会发生这种情况。 当网络条件允许稳定上传时,我们必须摆脱这种尖峰 - 因为我们进行视频流式传输,即使 15-20 "late" 个文件中的 1 个文件也会为我们的用户提供 "pause" 实时播放。

我们能够在理想条件下在本地网络中详细重现这种情况。 1) 客户端(上传者):iPhone XR 和 IOS12。 2) 客户端通过 Wi-Fi 通过本地网络上传大小为 300Kb 的单个文件。上传成功后客户端开始重新上传,这样我们就可以衡量连续上传的统计数据 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];
***

这段代码只是从头开始上传,上传任务returns成功(通过回调)

5) "Normal" 测试结果。大多数情况下都会发生这种情况,您可以看到本地网络上 300Kb 文件的平均上传时间非常短且稳定 - 大约 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 应该能够在不延迟数小时的情况下进行流式传输。但这并没有发生。

我们在理想的本地环境中看到了这一点,而在 "real world" 中,相同的尖峰甚至更频繁。

问题是 - 如何摆脱它们?有什么想法吗?

好文章,有助于追查原因 https://forums.developer.apple.com/thread/45210

在我们的案例中,测试中使用的 wifi 路由器在接收流量时出现问题