![]() |
1
1
首先,试图确定“最快的CDN镜像”是一门不精确的科学。对于“最快”的含义,没有一个普遍接受的定义。在这里,人们最希望的是为“最快”的含义选择一个合理的启发式,然后在这种情况下尽可能精确地测量这种启发式。 在这里的代码示例中,所选择的试探似乎是通过HTTP从每个镜像下载一个示例文件所需的时间。 实际上,这并不是一个糟糕的选择。你可以合理地提出一个论点,认为其他一些启发式方法可能稍微好一点,但我认为,从每个候选镜像中传输样本文件所需时间的基本测试是一个非常合理的启发式方法。 我在这里看到的一个很大的问题是这个启发式的实际实现。在这里,这种尝试——对样本下载进行计时——的方式似乎不太可靠,它最终将测量一大堆与网络带宽无关的不相关因素。 我在这里看到了至少几个机会,在这些机会中,与网络吞吐量完全无关的外部因素会弄乱所测量的时间,并使其不如应有的可靠。 所以,让我们来看看代码,看看它是如何尝试测量网络延迟的。这是它的肉:
…和gettimeofday()用于对前后的系统时钟进行采样,以计算这需要多长时间。好的,太好了。但这实际上能衡量什么呢?
在这里很有用,拿一张空白纸,把这里发生的一切都写下来,作为
1) 新的子进程是
2) 新的子进程
3) 操作系统内核加载“/bin/bash”作为新的子进程。内核加载并打开系统shell通常需要运行的所有共享库。
4) 系统外壳进程初始化。它读取
5) …解析最初作为参数接收的“wget”命令,以及
6) 操作系统内核现在加载“wget”作为新的子进程。内核加载并打开所有共享库
7) 在
现在,有一刻……我似乎忘记了我们在这里要做什么……哦,我记得:通过从每个镜像下载一个示例文件,哪个CDN镜像“最快”,对吗?是的,一定是这样! 现在,上面所做的所有工作和所有这些工作与确定哪个内容镜像最快有什么关系??? 呃……从我的角度来看,这不算什么。现在,以上这些都不应该是令人震惊的消息。毕竟,所有这些都在popen()的手册页中进行了描述。如果你阅读波本的手册页,它会告诉你这就是它的作用。启动新的子进程。然后执行系统shell,以便执行请求的命令。等等。。。
现在,我们不是在讨论测量持续数秒或数分钟的时间间隔。如果我们试图测量需要很长时间才能执行的东西
正如我在开头提到的,鉴于这是在试图确定“最快的镜子”这一模糊的概念,这已经是一门不精确的科学了,在我看来,你真的希望尽可能多地去掉这里完全不相关的开销,以便得到尽可能准确的结果。 所以,在我看来,除了你想测量的网络带宽之外,你不想在这里测量任何东西。而且,你肯定不想在任何网络活动发生之前衡量发生了什么。
我仍然认为尝试对样本下载进行计时是一个合理的建议。这里不合理的是
1) 新建 socket (). 2) 使用 getaddrinfo ()执行DNS查找,并获取候选镜像的IP地址。 3) connect ()连接到镜像的HTTP端口。 4) 设置适当的格式 HTTP GET request ,并将其发送到服务器。 到目前为止,上面所做的与popen/wget所做的差不多。
只有现在,我才会抓住电流开始计时
只有这样,我才会有一些合理的信心,我会真正测量从CDN镜像接收样本文件所需的时间,而完全忽略执行一堆完全不相关的进程所需要的时间;然后,通过从多个CDN镜像中获取相同的样本,尽可能多地使用合理的启发式方法来选择一个。 |
![]() |
Sean · OCaml二叉树镜像 7 年前 |
![]() |
Volkan Åahin · 如何在本地主机上运行html文件? 8 年前 |
![]() |
Narek · git将所有远程分支推送到新的原点 9 年前 |
![]() |
AquaVitae · ThreeJS中的镜像反射怪癖 9 年前 |
|
Devorak · SQL SERVER复制或镜像配置以实现以下场景? 10 年前 |