确定请求延迟

确定请求延迟

问题描述:

我正在努力在Go中本地创建一个Pastry版本。从design [PDF]:确定请求延迟

假设应用 提供了一种功能,允许每个糕点节点,以确定与给定的IP地址给其自身的一个节点 的“距离”。具有较低距离值的节点假定为更合乎需要的 。预计应用程序将根据其接近度量指标的选择,使用网络服务(如跟踪路由或Internet子网地图)和适当的缓存和近似技术来最小化开销来实现此功能。

我想弄清楚什么是最好的方式来确定两个EC2实例之间的“邻近”(即网络延迟)编程从Go。不幸的是,我对低级网络不够熟悉,无法区分我可以使用的不同类型的请求。谷歌搜索没有提出任何关于测量Go延迟的建议,而一般的延迟技术似乎总是Linux二进制文件,我希望以更少的依赖性为名避免。任何帮助?

另外,I note表示两个EC2实例之间的延迟应该在1ms的范围内。虽然我计划在EC2上使用这个实现,但它可以假设在任何地方都可以使用。延迟通常非常糟糕,我应该花费精力确保两个节点的网络接近度?请记住,大多数Pastry请求可以以群集中服务器数量的16位为单位(对于10,000台服务器,平均需要大约3次请求才能找到要搜索的密钥)。例如,从EC2的亚太地区到EC2的美国东部地区的延迟是否足以证明增加节点时增加的复杂性和延迟检查带来的开销?

+1

如果不知道自己的目标,就不可能回答这些问题是否有必要/值得。你有特定的延迟目标吗?您是否想尽量减少EC2区域之间的通信带宽成本? – 2012-04-19 02:55:10

+0

我试图在通信延迟和带宽使用之间做出智能权衡。没有超出“合理”范围的延迟目标。这很复杂,因为我想将其作为通用包发布,因此它不能是EC2特定的。 – Paddy 2012-04-22 20:31:37

网络中的公共距离度量是计算数据包需要到达目的地的跳数(节点跳数)。这个指标在您引用的文字中也有提及。即使您提到的低延迟环境(EC2“本地”),这也可以为您提供足够的距离值。

对于go逻辑本身,人们会认为net是您正在寻找。事实上,对于延迟测试(ICMP PING),你可以用它来创建一个IP连接

conn, err := net.Dial("ip4", "127.0.0.1") 

创建ICMP包结构和数据,并发送。 (请参阅Wikipedia page on ICMP; IPv6需要不同的格式。)不幸的是,您不能直接创建ICMP连接,就像使用TCP和UDP一样,因此您必须自己处理包结构。

由于conn的类型ConnWriter,您可以将它传递给您的数据,您定义的ICMP数据。

ICMP类型字段中,您可以指定消息类型。值8,1和30是你正在寻找的。 8为您的回声请求,答复将是类型1.也许30给你一些更多的信息。

不幸的是,对于计数网络跳数,您将需要IP数据包头字段。这意味着,您将必须构建您自己的IP数据包,其中net似乎不允许。

检查source of Dial(),它使用internetSocket,这是不导出/公开。我不确定我是否缺少某些东西,但似乎没有简单的方法来构建自己的IP数据包来发送,并具有可定制的标题值。您需要进一步检查DialIP如何使用internetSocket发送软件包,并复制并修改该代码/概念。另外,你可以使用cgo和一个系统库来构建你自己的包(尽管这会增加更多的复杂性)。

如果您打算使用IPv6,您将(也)必须考虑ICMPv6。两个软件包的v4版本都有不同的结构。


所以,我建议使用简单的延迟(定时平)作为一个简单的(R)执行,然后在以后的时间/添加节点跳之后,如果你需要它。如果你们有两个,也许你们也想把这两个结合起来(跳少跳并不自动意味着更好;认为长期的海外电缆等)。

+0

考虑使用原始系统调用。 – 2012-04-18 09:20:06

+0

@ElazarLeibovich你可以扩展吗? – Paddy 2012-04-22 20:31:58

+2

@PaddyForan调用'syscall.Socket(syscall.AF_INET,syscall.SOCK_RAW,port)',那么你应该可以自己构造ICMP数据包。 – 2012-04-23 08:57:42