网站资源偶尔延迟:带宽限制导致丢包?

网站资源偶尔延迟:带宽限制导致丢包?

我的网站加载速度比我想象的要慢,因为一些资源从服务器下载需要很长时间。我一直在试图找出原因。根据我所做的测试,我大约 95% 确定这是一个网络问题,而不是 Apache 问题(见下文)。

这是一个Firefox 网络检查器的屏幕截图。请注意,卡住的资产通常是其中一些图像,但它也发生在其他资产上,如 Javascript 文件等。

假设与问题

我目前的理论是,当浏览器并行下载资源时,我们的 colo 的带宽限制会导致数据包丢失,可能暂时超过带宽限制。这是一个合理的理论吗?除了请求更多带宽外,我们还能做哪些改变,即使我们大多数时间不使用大部分带宽?

或者,我需要研究其他途径吗?

配置

  • Fedora 18 上的 Apache 2.4.3,具有大量可用容量的 CPU 和内存。
  • 千兆以太网通过主机托管设施连接至 4 或 5 Mbps 上行链路。
  • 该网站的访问量不是很高。很少同时有超过两个访客。

我做过的测试

  1. traceroute到服务器没有问题。traceroute从服务器到我们的办公室,比如说,在 8 个左右的跳数后就会停止。我假设这是由于traceroute流量在某处被阻塞(因为诸如wget— 见下文 — 之类的东西ssh似乎大部分都运行正常),但如果这相关的话,我可以提供更多详细信息。
  2. straceApache 上的 表示服务器立即提供整个图像,没有延迟。
  3. tcpdump/wireshark显示图像数据被立即发送,但随后,一些数据包被重新传输。特别是一条跟踪显示,资产的最后一个数据包被服务器立即传输,并被重新传输了几次,但原来的数据包是浏览器最终收到的数据包。
  4. 虽然我有时可以通过 重现下载页面时出现的问题wget,但这种情况并不像在浏览器中那样频繁发生。我的假设是,这是因为wget没有并行下载。
  5. 测试iperf很有趣。使用 的iperfUDP 模式,我发现在速度高达 4 Mbps 左右时几乎没有数据包丢失。超过这个速度后,我开始看到约 10% 的数据包丢失。同样,在 TCP 模式下,少量并行连接会合理地分配带宽。另一方面,6 个或更多并行连接开始出现“锯齿状”带宽模式,其中连接有时有带宽,有时没有。

我很乐意提供关于这些内容的更多详细信息,但我不想让这篇文章充斥着不相关的细节。我对网络的了解还不够,不知道哪些信息有用,哪些没用。:-D 任何指向其他好的网络故障排除工具的提示都会很好。

编辑1:澄清了我几乎确信 Apache 没有问题,而是网络或其他问题。

编辑2:我尝试iperf在同一个千兆交换机上测试这台服务器和另一台服务器,结果得到了相当稳定的 940+ Mbits/s。我认为这排除了我们这边的大多数硬件问题或双工不匹配问题,也许上行链路除外。

编辑3:虽然具体细节有很大不同,这篇关于 TCP incast 的文章问题听起来很相似,高带宽流量以小规模突发的方式在狭窄的管道中移动,并丢失数据包。我需要更详细地阅读它,看看是否有任何具体内容适用于我们的情况。

答案1

您是否尝试过在 Apache 前面放置代理来缓存数据?一种流行的解决方案是 Nginx,它将监听端口 80(这意味着如果 Apache 也使用 80,则您必须更改其监听端口)。

只需进行设置,Nginx 即可提供静态内容(如 JS、CSS、图像等),并通过代理将其他所有内容传递给 Apache。

我注意到,当我为我的网站执行此操作时,它提高了相当多的性能,因为 Nginx 被构建为代理或独立服务器 IIRC,而 Apache 更像是以前的 Web 服务器的一个分支,当时代理还不是很流行(如果甚至想到的话)。

答案2

终于找到了罪魁祸首。我们的托管服务器正在对我们的连接进行流量整形——当他们关闭它时,问题就完全消失了。我希望我们会做进一步的工作来缩小他们的配置范围,但幸运的是,这不是我们的配置。

相关内容