确定请求延迟

时间:2012-04-17 08:44:47

标签: amazon-ec2 go latency

我正在Go中创建一个Pastry版本。来自design [PDF]:

  

假设应用程序   提供允许每个Pastry节点确定节点“距离”的功能   给定自己的IP地址。假设具有较低距离值的节点   更可取的。应用程序应根据其实现此功能   使用traceroute或Internet子网等网络服务选择邻近度量   地图,以及适当的缓存和近似技术,以最大限度地减少开销。

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

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

1 个答案:

答案 0 :(得分:5)

网络中的常见距离指标是计算数据包到达目的地所需的跳数(节点间跳数)。您引用的文字中也提到了此指标。即使您提到的低延迟环境(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版本不同。


所以,我建议使用简单的延迟(定时ping)作为简单的(r)实现,然后在以后/之后添加节点跳转,如果需要的话。如果你有两个,也许你也想要结合这两个(少跳不自然意味着更好;想想长海外电缆等)。