确定请求延迟

Pad*_*ddy 3 latency amazon-ec2 go

我正在Go中本地创建一个Pastry版本.从设计 [PDF]:

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

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

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

Kis*_*aki 5

网络中的常见距离度量是计算数据包到达其目的地所需的跳数(节点间跳数).您引用的文字中也提到了此指标.即使对于您提到的低延迟环境(EC2"本地"),这也可以为您提供足够的距离值.

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

conn, err := net.Dial("ip4", "127.0.0.1")
Run Code Online (Sandbox Code Playgroud)

创建您的ICMP包结构和数据,并发送它.(请参阅ICMP上的Wikipedia页面 ; IPv6需要不同的格式.)遗憾的是,您无法直接创建ICMP连接,就像使用TCP和UDP一样,因此您必须自己处理包结构.

由于conn类型Conn是a Writer,您可以将您的数据传递给您,即您定义的ICMP数据.

ICMP类型字段中,您可以指定消息类型.值8,1和30是您要查找的值.8为您的回应请求,回复将是类型1.并且可能30为您提供更多信息.

不幸的是,为了计算网络跃点,您将需要IP数据包标头字段.这意味着,您将不得不构建自己的IP数据包,这net似乎不允许.

检查它使用的Dial(),它internetSocket不是导出/公开的.我真的不知道,如果我失去了一些东西,但似乎没有简单的方法来构建自己的IP数据包的发送,可定制的标头值.您必须进一步检查如何DialIP发送包internetSocket以及复制和调整该代码/概念.或者,您可以使用cgo和系统库来构建自己的包(这会增加更多的复杂性).

如果您打算使用IPv6,您(也)必须查看ICMPv6.两个软件包的结构都与v4版本不同.


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

  • @PaddyForan调用`syscall.Socket(syscall.AF_INET,syscall.SOCK_RAW,port)`,然后你应该能够自己构建ICMP包. (2认同)