2

如果计算机必须获取一些信息,网络请求通常是最慢的可能来源之一。我的理解是,总的来说:

  • 网络访问比磁盘慢得多
  • 磁盘访问比 RAM 慢得多
  • RAM 访问比 CPU 寄存器慢得多

我的问题是:平均而言,是什么让网络访问比磁盘慢得多

显然,这并不总是正确的:您可能拥有与同一房间内的服务器的超快网络连接和缓慢的硬盘驱动器。但就这个问题而言,请想象一个普通用户在网上冲浪:从磁盘读取数据将比从 Google 获取相同数据更快。

我能想到的一些与 HTTP 请求有关的部分是:

  • IP的DNS查找
  • 建立 TCP 连接的三次握手
  • 打包:将 HTTP 请求分解为 TCP 数据包,然后将它们放入 IP 数据包中,并使用所有必要的计数器和校验和等
  • 传输:电信号穿过导线所需的时间
  • 路由:发生在路由器内部的决策、缓冲等
  • 处理:服务器对响应的制定
  • 响应的所有传输和路由,包括重新发送丢失的数据包
  • 排序和组装 TCP 数据包的内容并将 HTTP 响应返回给客户端

如果我错过了任何主要步骤,请告诉我。

在这些步骤中,忽略服务器处理(这实际上不是网络问题),是否有任何部分特别慢?它们中的任何一个都解释了网络请求中的大部分固有延迟吗?

更新:一些数字

平均 DNS 查找需要 60~120 毫秒,然后是完整的往返 (RTT) 来执行 TCP 握手 - 加起来,这会在我们发送请求之前产生 100 到 200 毫秒的延迟!

4

4 回答 4

2

物理传输延迟(即每个请求的开销至少为 2 *距离/光速)往往胜过任何其他性能因素。您可以通过将本地系统的请求时间与远程系统的请求时间进行比较来检查。例如,在极快的互联网连接上,我得到以下结果:

$ /usr/bin/time --quiet -f %e wget -q -O/dev/null www.google.com/404
0.05
$ /usr/bin/time --quiet -f %e wget -q -O/dev/null localhost/404
0.01
# A machine in the same LAN
$ /usr/bin/time --quiet -f %e wget -q -O/dev/null 192.168.1.42/404
0.01

假设 google 的网络服务器(在带宽、内存、缓冲、硬盘等方面)不比我正在运行的 apache 慢,这意味着即使使用这种极快和低延迟的连接,并连接到google,通过网络的时间使任何其他问题(例如本地处理)相形见绌。

现在您可以假设这是因为路由开销和缓冲区左右(让我们暂时排除丢失的数据包,因为它们高度依赖于介质)。您可以通过比较通过 Internet 发送数据包所需的时间与使用直流网络电缆所需的时间来确定这些因素的影响。

例如,对于从杜塞尔多夫到洛杉矶的数据包,Wolfram Alpha计算的物理距离为 31 毫秒(当前光纤电缆为 43)。假设电缆在两个城市之间以完美的线路运行(他们当然不会),这构成了我测量的 85 毫秒实际延迟的一半。

因此,尽可能减少对等点之间的距离以及往返次数至关重要。如果消息与可用带宽相比较小,则 TCP 和 SSL/TLS 握手将因此成为网络缓慢的主要原因。显然,对于较大的文件(或者如果存在瓶颈,这可能比您预期的更频繁地发生)带宽也成为一个问题。

于 2012-06-08T13:02:40.590 回答
0

我认为数据包传输和数据包丢失/重新发送在延迟中占最大份额

于 2012-06-08T13:01:23.720 回答
0

显然距离是一个很大的因素。

从 HDD 数据只能传输很短的距离,可能是 12 英寸。通过网络,数据将传输很远的距离。

请记住,网络传输还需要从 HDD 读取,因此它总是比直接从硬盘驱动器读取要慢。

于 2012-06-08T13:01:58.587 回答
0

There's also the fact that if you're requesting data from a server somewhere, that server needs to go through its RAM and its physical storage to grab what you need.

于 2012-06-08T13:07:39.100 回答