对于我们的游戏,我们将静态资产托管在刚刚安装并运行 httpd 的 VM 上(当然还有一些原生 Linux 的东西),以便提供 Web 内容。MPM 配置为具有 MaxClients 6400、ServerLimit 100 和 ThreadsPerChild 64 的工作程序。内存为 4 GB。使用上述配置,提供的静态内容总大小约为 20 MB,并且在我的国家(保加利亚)以及其他不同的国家/地区提供。经检查并确认,国内和国际带宽速度没有差异。然而,在高峰时刻,当带宽达到最大值时,我们开始收到来自远程用户(例如来自俄罗斯)的大量投诉,称游戏完全下载需要 2-3 分钟。任何时候我们从这里检查禁用缓存的情况下加载游戏,每次尝试时,从任何计算机都需要大约 10 秒。我们从原始 VM 的映像中添加了另外 2 个 VM(相同的配置和内容),并进行了最快的负载平衡 - DNS 循环到总共三个 IP。投诉减少了,但俄罗斯用户的加载时间仍然超过 1 分钟。当我们再次尝试从这里下载游戏多次时,仍然需要 10 秒,对我们来说没有什么不同。考虑到静态内容服务器具有同等的国内和国际对等,并且当负载较低时,所有俄罗斯用户也能够下载 10 秒,但在高峰时段则不行,可能的原因是什么?所有用户不应该都一样吗?
PS 静态服务器始终有足够的内存,生成的 httpd 进程数从未超过 50 个,设置的限制为 100 个
编辑:问题的简要总结 - 在低负载下,所有客户端(本地和远程)下载客户端的时间相同(例如 15 秒)。当负载较高时,本地客户端再次加载 15 秒,而远程客户端则需要 2-3 分钟。可能的原因是什么?
答案1
按照澄清说,这种情况只会在带宽达到最大限度时发生,这听起来可能是一个完全正常的行为,那么——当你用尽你的可用带宽(达到线路速率)时,你可能会开始丢失数据包,并且TCP 窗口对于长距离客户端,永远不会扩大到最佳速度;带宽延迟积增长,通过同一管道下载同一文件的时间也增加;你必须做一些流量整形(换句话说,数据包排队和优先级)如果你想在超负荷期间让每个人都更加均衡。 – cnst 10 月 6 日 4:56
答案2
答案取决于很多因素。你不能只是说你的国际速度是恒定的。远距离用户的性能总是会较低,这取决于你和他们之间的网络以及网络负载有多大。
顺便说一句,你确实说过你的带宽已达到最大值。你的服务器网络连接的带宽是多少?那么你确实需要 CDN 或缓存反向代理。
我可以提供一些快速改进方法:
- 使用 Nginx;它可以更有效地提供静态内容。
- 使用像 Cloudflare 这样的 CDN,或者如果这太复杂,您可以在俄罗斯租用虚拟机并在其上安装缓存反向代理,使您的 DNS 地理 IP 可感知,并让俄罗斯用户重定向到那里。Cloudflare 实际上可能更容易 :)
答案3
你不能真正地说对等连接对于国内和国际流量来说是一样的。
这种情况在过去几年里可能有所改变,但在俄罗斯传统上,大多数供应商从未支付任何本地对等费用,而是直接从 MSK-IX 获取,其余流量由中转供应商处理。
各个方向的链接几乎总是具有不同的容量,并且某些链接经常会时不时地处于饱和状态(无论是由于意外的流量高峰,还是因为有人懒得更新他们的链接,或者为更多流量支付更多费用等),并且这种情况在高峰时段尤其可能更频繁地发生。
通常,在对等点或中转点,提供商会以固定费率获得无限制的 100Mbps、1Gbps 或 10Gbps。当流量超过所支付的费用时会发生什么?一些数据包被丢弃,一些数据包被减慢,并且通常只发生在高峰时段,有时只发生在一个方向上(但即使它发生在一个方向上,流量仍然会在两个方向上减慢,因为延迟会增加,并且一些ACK
拥塞控制数据包也会丢失)。
我将通过运行来解决问题mtr
向出现问题的俄罗斯主机之一发送请求,以及从俄罗斯主机之一向保加利亚服务器发送请求。我发现最有用的方法是运行每个实例 30 秒到 15 分钟(mtr 将汇总整个运行期间的统计数据),然后在前一次运行完成后立即再次运行 5 到 15 分钟。这样,您将能够准确地看到问题发生的时间。
否则,这也可能是 Apache 的问题,可能与俄罗斯主机的较高延迟有关 - nginx 通常比 Apache 更有效地提供各种内容,所以,也许这是一个尝试 nginx 的好机会?
答案4
虽然光速是恒定的,并且数据以相同的速度通过长距离光纤电缆传输,但距离源越远,数据需要经过的“跳跃”就越多。
如果您运行到 100 英里外的服务器的跟踪路由,然后将该跟踪路由与位于地球另一端的服务器进行比较,那么位于地球另一端的服务器可能会经历更多跳数。
潜伏是数据在到达目的地之前经过每个路由器(跳跃)所需的时间,而延迟就是这里的问题。