Chrome 在传输一定数量的数据后挂起 - 等待可用的套接字

Posted

技术标签:

【中文标题】Chrome 在传输一定数量的数据后挂起 - 等待可用的套接字【英文标题】:Chrome hangs after certain amount of data transfered - waiting for available socket 【发布时间】:2014-07-04 00:04:05 【问题描述】:

我有一个浏览器游戏,我最近开始在游戏中添加音频。

Chrome 无法加载整个页面并卡在"91 requests | 8.1 MB transferred" 并且不再加载任何内容;它甚至在所有其他选项卡中都破坏了网站,说Waiting for available socket

5 分钟后(确切地说)加载数据。

这不会发生在任何其他浏览器上。

删除一个 MP3 文件(最新添加的一个)解决了这个问题,所以可能是数据限制问题?

【问题讨论】:

您是否为此归档或找到了错误报告?我们看到了完全相同的行为(需要检查请求数或传输的字节数是否匹配,否则行为和错误完全匹配) 这看起来像是一个已知问题 - 请参阅 code.google.com/p/chromium/issues/detail?id=324653 看看 code.google.com/p/chromium/issues/detail?id=324653 到底发生了什么。但是,如果您达到了打开套接字的限制,那么实际上甚至其他浏览器也会限制到单个域的连接数。您有两个选择 - 要么确保只有少数同时请求处于活动状态(序列化它们;不要并行化);或将您的服务器拆分为子域并向不同的子域发出请求。 小众案例,但如果您最近重新启动了 Chrome 并且有多个标签页打开到需要基本 HTTP 身份验证的服务器,您可能会收到这些错误,因为您的一个后台标签页弹出了一个身份验证对话框。检查相关站点的所有其他打开选项卡,根据需要登录,然后查看问题是否已解决。 有人知道这是什么扩展来跟踪他在屏幕截图中提供的这些数据吗? @NathanielHeinrichs +1 表示过去两周一直困扰着我的“利基案例”。这正是发生在我身上的事情,现在我知道为什么了!谢谢。 【参考方案1】:

说明:

出现此问题的原因是 Chrome 默认最多允许 6 个打开的连接。因此,如果您同时从 6 个 <video><audio> 标签流式传输多个媒体文件,则第 7 个连接(例如,图像)将挂起,直到其中一个套接字打开。通常,打开的连接会在 5 分钟不活动后关闭,这就是您看到 .png 最终在此时加载的原因。

解决方案 1:

您可以通过尽量减少保持打开连接的媒体标签的数量来避免这种情况。如果您需要超过 6 个,请确保最后加载它们,或者它们没有像 preload="auto" 这样的属性。

解决方案 2:

如果您想为网页游戏使用多种音效,您可以使用Web Audio API。或者为了简化操作,只需使用像 SoundJS 这样的库,它是同时播放大量音效/音乐曲目的好工具。

解决方案 3:强制打开套接字(不推荐)

如果必须,您可以在浏览器中强制打开套接字(仅限 Chrome):

    在地址栏输入chrome://net-internals。 从菜单中选择Sockets。 点击Flush socket pools按钮。

不建议使用此解决方案,因为您不应期望访问者遵循这些说明才能查看您的网站。

【讨论】:

虽然接受的答案通常提供了很好的信息,但这是最好的答案。 刚刚安装了 Neo4J 3.0.4 并在打开 localhost:7474 时说正在等待可用的套接字,尝试刷新仍然无法正常工作,并且在池列表中显示此站点有 6 个活动和 2 个待处理 刷新套接字池对我也不起作用(我正在玩几个 html5 <video>elements 的小片段并达到极限。 在我的情况下,打开了许多选项卡并轮询服务器,关闭了所有选项卡,现在很好。 我们的旧应用程序一直在从公共服务器请求图像(放大/缩小.png 等)(它一定已经停止支持 - 导致大量错误报告)。对该服务器的所有请求在 Chrome 中都被卡为“待处理”,大约两分钟后它只会发回 HTTP 状态代码 502。这导致应用程序挂起并且无法从我们自己的服务器请求图像,因为它在请求这些图像时被阻塞了。很好的答案 - 帮助我找到了这个!【参考方案2】:

您似乎达到了每台服务器的连接数限制。我看到您正在加载大量静态文件,我的建议是将它们分隔在子域中并直接使用 nginx 提供它们。

创建一个名为 img.yoursite.com 的子域并加载所有图片 从那里。

创建一个名为 scripts.yourdomain.com 的子域并从那里加载所有 JS 和 CSS 文件。

创建一个名为 sounds.yoursite.com 的子域,然后从那里加载所有 MP3...等等。

Nginx 在直接提供静态文件和管理静态文件缓存方面有很好的选择。

【讨论】:

这不会改变任何东西。只需在您的主机文件中放置一些假域名并使用它们而不是 localhost。 不适合我。我正在尝试通过网络从我的家庭服务器提供视频(当我在工作时)。 如果httpd(即apache)可以处理数百个sim。连接,只是 Crome 限制了它们,这不是解决方案。在我的情况下,每个配置文件有 6 个套接字,因此我可以在匿名配置文件中再打开 6 个,等等。这是一个解决方案 ***.com/a/29639535/904846,可能会被接受为最佳答案。【参考方案3】:

消息:

等待可用的套接字...

显示,因为您已达到每个主机、代理或组的 ssl_socket_pool 限制。

以下是您可以使用 Chrome 浏览器建立的最大 HTTP 连接数:

每个代理的最大连接数为 32 个连接。这可以在Policy List 中更改。

每个主机最多:6 个连接。

这很可能是硬编码在网络浏览器的源代码中,因此您无法更改。

每个浏览器共有 256 个 HTTP 连接池。

来源:Enterprise networking for Chrome devices

可以在chrome://net-internals/#sockets(或在chrome://net-internals/#events&q=type:SOCKET%20is:active实时)检查或刷新上述限制。


您的音频问题可能与Chrome bug 162627 有关,其中 HTML5 音频无法加载,并且达到每个服务器的最大同时连接数:代理。在撰写本文时(2016 年),这仍然是一个活跃的问题。

与HTML5 video request stay pending 相关的更老问题,那么它可能与已在 2014 年修复的 Issue #234779 相关。并且与可以在Issue 324653: SPDY issue: waiting for available sockets 中找到的 SPDY 相关,但这已经在 2014 年修复,所以可能是不相关。

现在标记为重复的其他相关问题可以在Issue 401845: Failure to preload audio metadata. Loaded only 6 of 10+ 中找到,这与媒体播放器代码留下一堆暂停的请求有关。


这也可能与在后台使用您的套接字的某些 Chrome 广告软件或防病毒扩展程序(如 SophosKaspersky)有关,因此请检查 Network 中的活动开发工具

【讨论】:

我如何将每台服务器 6 个更改为每台服务器 8 个,因为我使用的某些软件似乎需要 8 个,导致 2 个处于待处理状态并且永远不会加载站点 @Adeem 我不认为你可以改变它,我相信它在源代码中是硬编码的。你可以report that issue描述你的具体场景。 chrome://net-internals/#events&q=type:SOCKET%20is:活动链接在最新的 Chrome 中不是最新的【参考方案4】:

简单而正确的解决方案是推迟从设置中预加载您的音频和视频文件并重新检查您的页面,您等待可用套接字的问题将得到解决... 如果您使用 jplayer,则将 jplayer JS 文件中的 preload:"metadata" 替换为 preload:"none" ...preload:" metadata" 是在页面加载时播放音频/视频文件的默认值,这就是为什么 google chrome 显示“等待可用套接字”错误

【讨论】:

【参考方案5】:

我们的第一个想法是网站已关闭或类似情况,但事实是这不是问题或残疾。这也不是问题,因为在 Firefox、Opera 或服务资源管理器下测试时的简单连接正常打开。

Chrome 中的错误会显示“此站点不可用”的标志,并使用图例“错误 15 (net :: ERR_SOCKET_NOT_CONNECTED): Unknown error”进行说明。该错误在 Google Chrome 中很常见,更准确地说是在其更新中,其解决方法是重新启动计算机。

由于部分解决方案不多,我们提供了一个教程,让您在不到一分钟的时间内解决故障。 为避免此问题并确保服务在 Google Chrome 中正常打开,应在地址栏中插入以下内容:chrome://net-internals(然后输入“Enter”)。然后他们必须到左侧菜单中的“Socket”并选择“Flush Socket Pools”(看下面的截图来指导http://www.fixotip.com/how-to-fix-error-waiting-for-available-sockets-in-google-chrome/) 这解决了问题,并且不再会遇到访问 Gmail、Google 或山景城巨头的任何服务的问题。我希望您发现它有用并与他们需要的人或社交网络分享教程:Facebook、Twitter 或 Google+。

【讨论】:

【参考方案6】:

Chrome 是基于 Chromium 的浏览器,基于 Chromium 的浏览器一次只允许最多 6 个打开的套接字连接,当第 7 个连接启动时,它将处于空闲状态并等待正在运行的 6 个中的一个停止并然后它将开始运行。 因此错误代码 'waiting for available sockets',第 7 个将等待这 6 个套接字中的一个可用,然后它将开始运行。

你可以

    清除浏览器缓存和 cookie (https://geekdroids.com/waiting-for-available-socket/#1_Clear_browser_cache_cookies)
    刷新套接字池 (https://geekdroids.com/waiting-for-available-socket/#2_Flush_socket_pools)
    刷新 DNS (https://geekdroids.com/waiting-for-available-socket/#3_Flush_DNS)

【讨论】:

以上是关于Chrome 在传输一定数量的数据后挂起 - 等待可用的套接字的主要内容,如果未能解决你的问题,请参考以下文章

django manage.py runserver 在第二个请求后挂起(间歇性)

.NET Core Windows 服务中的并行任务在几秒钟后挂起

地理定位在 x 次尝试后挂起,在浏览器重新启动后工作

pthread_barrier_wait在创建所有线程后挂起

database/sql rows.scan 在 350K 行后挂起

MFC 应用程序在 CSingleLock Lock() 后挂起