【问题标题】:How do you measure latency in low-latency environments?您如何测量低延迟环境中的延迟?
【发布时间】:2010-11-17 04:14:59
【问题描述】:

设置如下...您的系统正在接收包含离散消息的数据流(通常每条消息在 32-128 字节之间)。作为处理管道的一部分,每条消息都会通过两个物理上独立的应用程序,这些应用程序使用低延迟方法(例如通过 UDP 的消息传递)或 RDMA 交换数据,最后通过相同的机制到达客户端。

假设您可以在任何级别注入自己,包括有线协议分析,您将使用哪些工具和/或技术来测量系统的延迟。作为其中的一部分,我假设传递到系统的每条消息都会导致相应的(尽管不等效)消息通过系统推送并传递给客户端。

我在市场上见过的唯一这样的工具是 TS-Associates TipOff。我敢肯定,通过正确的访问权限,您可能可以使用电线分析工具 (ala wireshark) 和正确的解剖器测量相同的信息,但这是正确的方法还是有任何我可以使用的商品解决方案?

【问题讨论】:

  • 与编程无关,在 serverfault 上可能更好,但仍然很有趣。

标签: latency measurement


【解决方案1】:

您的最后一段是需要完成的典型方式。该领域的常见嫌疑人(至少据我所知的市场数据(华尔街)延迟)是:

  • TSA (TS Associates)
  • Correlix
  • 科维尔
  • Napatech(硬件捕获设备)
  • Endace(硬件捕获设备)

最近有另一家经营不善的公司烧光了他们的风险投资资金(400 万?)。

对于被处理成不同格式的数据(比如在直接交换提要或 RMDS 或其他更改协议的服务器上),您需要能够解析有效负载以关联消息。这可能具有挑战性,因为有时数据供应商不会公开消息定义。

我认为有些硬件设备会在其中注入带有时间戳的有效负载信息,以便客户端可以看到这些信息。当然,正如另一位发帖人指出的那样——时间问题非常重要。所有设备和客户端都必须具有相同的时间参考点。一定要准确……

我上次与 TSA 交谈时,一个带有 4 个观察点的装置大约需要 15 万美元。我怀疑上面列出的其他价格都差不多。

上面列出的硬件卡的起价约为 2000 美元(对于一个基本卡),然后(显着)从那里上涨。

要在软件中执行此操作,您需要让客户端使用 pcap(或类似的东西)并查看有效负载并尝试匹配它们。在某些情况下,很难让它具有确定性——尤其是在“会话”开始时,或者如果一个管道中缺少消息。通常在某个阈值之后,如果你不匹配某些东西,你就放弃它。

编辑: 免责声明: 我现在也是合资企业的一部分,应该披露这一点。

【讨论】:

  • ++ TipOff 一旦调整到细节就可以很好地工作。您可以使用原始捕获自己完成,但他们的硬件可以更轻松地获取数据并有效地对其进行时间戳。一旦你完成了初始阶段,自动完成某件事就很棒了。
【解决方案2】:

A recent paper 可能有一些用处(并且也比基于硬件的解决方案便宜得多)。还有一些方法可以相当准确地解释时钟偏差;上次我认真研究单向延迟测量研究时(几年前),最准确的技术是 Sue Moon 的 linear programming algorithm(参考代码方便地获得 here),但是如果不使用一些相当现代的线性规划技术,作为在线算法是相当不切实际的;最好只记录时间戳,而不是全天定期进行任何计算,然后对累积的数据运行 LP 算法。还有一些其他技术足够快,可以在线完成(包括 Vern Paxson 的 seminal paper),但它们都不太准确。

【讨论】:

    【解决方案3】:

    如果每条消息多几个字节对您来说不会是多余的,我建议只在源处使用完整时间戳(64 位)标记消息,并在每个跃点添加进入/离开时间戳增量(每个标记一个字节) .通过分析双向流,您将找出框之间的时钟偏差,然后您将能够获得完整的实时延迟信息供您考虑或发布到监控工具。

    【讨论】:

    • 很多时候,在这种类型的环境中,您无法控制消息的内容——这意味着您不能只在其中插入信息。一些交易所在消息中添加了时间戳,但我不确定你是否可以指望它。另请注意,这依赖于准确的时钟同步。另外 - “...分析双向流...”我认为并非易事。
    • “分析双向流”可以是内置心跳的一部分。如果您无法修改消息但可以在流中可靠地识别它,您可以在每个跃点使用 snoop/tcpdump 生成转储,然后对转储进行后处理以识别匹配的消息并计算时间增量
    【解决方案4】:

    这样做的问题与在太空中测量“速度”非常相似:您必须询问延迟与什么相关?如果您尝试在线测量它,您将错过交换中的任何额外延迟,或接收端的协议堆栈中的任何额外延迟。你不能真正端到端地测量它,因为计算机将有两个不同的时钟,如果不引入小错误几乎不可能协调(而且它们会相互漂移!)

    唯一真正有希望的方法是测量往返延迟,假设您有从一端返回的消息确认收到。 UDP 在堆栈中没有 ACK,因此必须将它们编码到应用程序的某个地方。您所做的是使用 x86 的 high-resolution timer 之类的东西来测量从发送消息到出现响应之间的时间。

    【讨论】:

    • 我认为他想要跨两点的延迟。这很高兴知道,因为如果该值发生变化,那么它与光速无关 - 它与运输中的某些瓶颈有关。
    • 当您说唯一有希望的方法是往返延迟时,我不明白您的意思。你能详细说明一下吗?
    • 对不起蒂姆。有时我说话就像在和我的同事说话,他们和我在做同样的事情,并且知道我指的是什么。我在最后添加了一个句子,可能会更清楚一点。
    • 同意你们俩的观点,但正如你们可能猜到的那样,我正在处理以一种方式传递数据的系统。尝试使用 rtt 来处理偏差和延迟已经够糟糕了,但是当时间以微秒为单位时,我可以开始做的最好的事情是监控延迟的增量,以了解随着时间的推移和负载下我们是变得更好还是更糟状况。至于测量,我们已经使用高分辨率计时器来测量时间,但是从 2 个参考点测量会受到时钟偏差的影响。从 1 点开始测量会受到传输损耗的影响。你们两个都很好。
    猜你喜欢
    • 2015-01-23
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2021-01-02
    相关资源
    最近更新 更多