NSURLSessionDataTask 导致高 CPU 使用率

Posted

技术标签:

【中文标题】NSURLSessionDataTask 导致高 CPU 使用率【英文标题】:NSURLSessionDataTask causes high CPU usage 【发布时间】:2015-10-28 17:34:30 【问题描述】:

我正在使用NSURLSessionDataTask 将数据馈送到后台的音频流中(在这种情况下并不真正相关)。

我遇到的问题仅发生在下载代码上 - 我已将其隔离并简单地丢弃数据,因此系统的其他部分不会影响它。

我观察到,如果我使用 backgroundSessionConfigurationWithIdentifier 创建的配置 (NSURLSessionConfiguration) 创建 NSURLSession,则下载时的 CPU 使用率很低 (

因此,相反,我使用使用ephemeralSessionConfiguration 创建的配置创建NSURLSession,这也会阻止它使用磁盘作为后台缓存,因此应该使用最少的 CPU。但是,在这种情况下,CPU 使用率会飙升至 70% 到 80% 之间。

使用defaultSessionConfiguration 创建的配置甚至使用[NSURLSession sharedSession] 获取共享的NSURLSession 也会出现同样的高CPU 使用率。

每个场景之间的数据吞吐量都没有变化——只是不在后台运行会导致 CPU 使用率很高。

我正在使用 SDK 9.1 在 ios 9.1 上运行。它发生在模拟器和设备上。

11 月 16 日更新 - 正如 George 指出的那样,didReceiveData 方法似乎被破坏了。我发现解决此问题的唯一方法是添加对

的调用
[NSThread sleepForTimeInterval:0.25];

这似乎相当激烈,但下载时 CPU 占用率从 60-80% 左右增加到 10-12% 左右。下载在它自己的线程中运行,因此只有下载速度变慢。事实上,它并没有真正放慢速度——didReceiveData 只是接收更大块的数据。在我的应用中,这无关紧要。

【问题讨论】:

我在 Mac OS 10.11 上看到了同样的问题。下载单个文件占用了一个内核的 30-50%。使用情况取决于网络性能。看来,当使用默认或临时配置时,委托方法 ``URLSession:dataTask:didReceiveData:`` 每 毫秒 被调用多次!切换到后台配置会大大降低。我已经尝试过使用任务的优先级属性,但到目前为止它对我的设置没有影响。也许如果有其他东西在争夺资源,它会。 【参考方案1】:

您可能应该将NSURLSessiondelegateQueue 设置为低优先级队列(即dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)。我认为问题不在于处理实际上占用更多CPU,而是它发生得更频繁,因为它正在调度的队列是高优先级。

【讨论】:

以上是关于NSURLSessionDataTask 导致高 CPU 使用率的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDataTask 内存警告应用程序崩溃

使用 NSURLSessionDataTask 显示文件下载进度

NSURLSessionDataTask

NSURLSessionDataTask 中的 popViewController 动画工作缓慢

iOS8:NSURLSession:NSURLSessionDataTask '客户端在收到整个响应之前关闭连接'

什么时候使用 NSURLSessionDownloadTask 和 NSURLSessionDataTask?