错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo = _kCFStreamErrorCodeKey = 28,_kCFStreamErrorD

Posted

技术标签:

【中文标题】错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo = _kCFStreamErrorCodeKey = 28,_kCFStreamErrorDomainKey = 1【英文标题】:Error Domain=NSPOSIXErrorDomain Code=28 “No space left on device” UserInfo=_kCFStreamErrorCodeKey=28, _kCFStreamErrorDomainKey=1错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo = _kCFStreamErrorCodeKey = 28,_kCFStreamErrorDomainKey = 1 【发布时间】:2021-04-29 13:57:30 【问题描述】:

最近从我们的 ios 设备发出的许多使用 Alamofire 的网络请求都失败并出现以下错误:

Error Domain=NSPOSIXErrorDomain Code=28 "设备上没有剩余空间" UserInfo=_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask ., _kCFStreamErrorDomainKey=1, _NSURLErrorRelatedURLSessionTaskErrorKey=("LocalDataTask."), _kCFStreamErrorCodeKey=28

如果用户移动了 +- 10 米,我们的应用程序具有发送网络请求的机制。这是每 5 秒检查一次,因此理论上每 5 秒可以进行一次呼叫。网络请求偶尔失败并显示此消息,不返回任何状态代码和上述错误。

该消息暗示错误与设备上的可用磁盘/内存空间有关。但是,在检查两者之后,没有找到链接,因为有足够的可用空间。此外,该错误发生在多台设备上,均运行 iOS 14.4 或更高版本。

是否有关于错误代码 28 的信息以及 iOS 设备上的罪魁祸首?更好;如何防止这个错误?

【问题讨论】:

【参考方案1】:

回答错误本身的发生:

NSPOSIXErrorDomain Code=28 "设备上没有剩余空间"

在 Xcode 终端中使用日志:

2021-05-07 15:56:50.873428+0200 MYAPP[21757:7406020] [] nw_path_evaluator_create_flow_inner NECP_CLIENT_ACTION_ADD_FLOW 05CD829A-810D-412F-B86E-7524369359E8 [28:设备上没有剩余空间]

2021-05-07 15:56:50.877243+0200 MYAPP[21757:7400322] 任务 . 完成错误 [28] 错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo=_NSURLErrorFailingURLSessionTaskErrorKey=LocalUploadTask ., _kCFStreamErrorDomainKey=1, _NSURLErrorRelatedURLSessionTaskErrorKey=( “本地上传任务 .” ), _kCFStreamErrorCodeKey=28

当创建太多 NSURLSession 时,它似乎会被调用,达到(在我们的测试中)600-700 个会话的限制,这些会话没有正确维护或关闭。从 iOS 14 开始就开始抛出该错误,因此看看是否引入了限制很有趣。

Linked 是一个 github 问题,它指出了 JetBrains 在 ktor 微服务框架上的相同问题,指向相同的方向,提到了会话无效以防止此问题: https://github.com/ktorio/ktor/issues/1341

在我们自己的项目中,问题的根源原来是我们对 StarScream websocket 库的实现。这可能与其他人遇到的问题无关,但无论如何都要解释以创建问题的完整图景。这是我们具体情况的原因和解决方法。

起初我们认为它与 Alamofire(使用的网络库)创建的 URLSession 有关,因为 POST 请求开始被取消,并且杀死应用程序似乎是再次发出请求的唯一解决方案。

然而,我们也使用了使用 StarScream 库的 websocket 连接,它会尝试连接到一个套接字,如果失败,则每两秒重试一次连接,最长为两小时。这意味着在两个小时内,每两秒,我们连接到套接字 -> 收到连接失败 -> 断开套接字 -> 再次连接。使用单例的套接字被认为不可能创建多个 URLSession,因为套接字只启动一次。然而,再次调用连接到套接字会创建一个新的 nw_connection 对象,因为库没有正确处理断开连接。

image of NWConcrete_nw_connection objects generated in socket connection

验证的方法是使用工具应用程序检查新 nw_connection 对象的创建。在那里记录为“内存泄漏”,nw_connection 对象的创建被记录下来,解决方案是确保我们在再次连接之前正确断开套接字(使会话无效)。

我希望在这里回答大部分问题,并且我会标记我自己的问题已回答,因为这是手头问题的解决方案。我认为 Apple 应该考虑提供关于创建的对象数量有限的准确报告,而不是给出错误“设备上没有剩余空间”。

【讨论】:

您好,您使用的是哪个版本的 StarScream 库?您是如何使会话无效的?【参考方案2】:

只是想提供更多信息,因为我们遇到了同样的问题。

根据我们的分析,此问题仅在 iOS 14 之后才开始发生。我们已验证它在 14.2、14.4 和 14.5 上发生。自然,导致此错误的最直接原因是内存或磁盘存储不足。我们已经通过额外的日志记录排除了此选项,您似乎也这样做了。

可能是related SO post 将该问题归因于在其发布版本中启用的网络检查框架。如果您使用类似的工具,值得检查一下。

Another report 这个问题,这次是在 AFNetworking 的 Github 上(您使用的 Alamofire 库的前身),说他们能够通过限制 URLSession 对象的创建来解决它。

对我们个人而言,这些都没有奏效。我们与 Apple 创建了支持票,但这并没有导致解决方案。他们请求了一个重现该问题的小型示例项目,但该错误仅在我们的应用程序连续使用 7 天后才出现。如果您有更快的方法来重现此内容,提交your own support ticket 可能是值得的。

希望这可以帮助您找到解决方案,如果您这样做,请将其添加到您的帖子中以帮助其他人!

【讨论】:

添加了从我们的项目中收集的信息作为答案。我认为可以得出结论,在创建太多 URLSession 后会引发错误。操作系统允许的数量存在真实但“不可见”的限制,并且错误本身“设备上没有剩余空间”并未描述问题的真正根本原因。确保在创建新会话之前使会话无效,这似乎对我们有用。

以上是关于错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo = _kCFStreamErrorCodeKey = 28,_kCFStreamErrorD的主要内容,如果未能解决你的问题,请参考以下文章

错误域 = NSPOSIXErrorDomain 代码 = 28 “设备上没有剩余空间” UserInfo = _kCFStreamErrorCodeKey = 28,_kCFStreamErrorD

NSPOSIXErrorDomain 哪里下载文件

React Native 构建命令失败:PhaseScriptExecution ...(域=NSPOSIXErrorDomain,代码=2)

NSPOSIXErrorDomain:100 错误

AFNetworking/NSURLConnection 接收 NSPOSIXErrorDomain Code=9 "操作无法完成。错误的文件描述符"

NSErrorDomain 用于打包 HTTP 结果代码?