如何测量请求在两台机器之间花费的时间?

网络工程 潜伏 日志记录
2022-02-25 16:29:57

我需要计算两者之间的时间:

  1. 从机器发送的请求
  2. 请求在另一台机器上收到

我可以通过记录来做到这一点,但是这两台机器上的时钟可能有时间间隔,所以我不能只减去:(Time_Received - Time_Sent) - 需要注意延迟机器时钟。

计算这个的最佳实践是什么?(这只是来自部署在多台机器上的 Spring Boot 应用程序的 REST 请求,使用 slf4j 库堆栈)

2个回答

单向延迟问题多年来备受关注。这对于分析非对称路径尤其重要,但对于许多应用程序也很重要。

基本思想始终相同:建立一个参考时钟(例如 NTP),然后进行测量。

显然,第一个驱动因素是您需要什么精度:10 毫秒是您在评论中所说的。NTP 可以在良好的条件下提供 1 毫秒。

你没有说的关键是你的主机相距多远——如果它们都在本地网络上,你的结果将比分布在互联网上要好得多。LAN 上共享同一 NTP 主机的主机将比通用 NTP 主机更接近同步。相邻的主机可以使用相同的主时钟每秒脉冲信号,并且比主机可以测量的更好地同步。如果主机在您的物理控制下但不相邻,您可以考虑向它们添加参考时钟(GPS、原子),否则通过仔细的 NTP 配置进行一些工作会有很长的路要走。如果可行,一个示例想法是通过 NTP 将客户端同步到服务器。

要考虑的另一件事是您是否需要持续测量,或者只是定期测量平均值. 在某些情况下,我只是将每小时的 NTP 偏移量放入系统日志中,并在需要时手动解决。假设您控制应用程序和客户端请求,我会考虑将客户端时钟时间戳添加到请求中,并允许服务器计算估计值;为了更复杂,添加客户端的时钟和 NTP 统计信息(尤其是抖动)并允许服务器提供带有错误估计的答案。普通的公共客户端(假设是这样的)可能不会发送信息,服务器可以简单地省略计算。(或者,有一些其他方法来通知服务器单向延迟,并以几乎相同的方式使用此信息。)这种方法意味着您不必将任何日志基础设施更改为具有更高精度的时间戳。

如果您只需要平均值,显然统计数据可以使您的答案变得比直接 NTP 准确度要好得多。

其他需要注意的事项:

  • RFC 4656中定义的“单向主动测量协议”是一种用于在服务器之间建立单向网络时间的协议。开源实现是可用的。
  • 对于更广泛的互联网,有许多大型测量网络。一个很好的概述会议演示文稿是:“Measurement Networks and deployment status”,2015 SANOG,Herath。https://www.sanog.org/resources/sanog25/Measurement_Networks_Herath_SANOG25.pdf
  • 特别值得注意的是RIPE AtlasNLNOG RingPerf Sonar这是一个比较页面
  • 从历史上看,RIPE 在 2014 年之前一直运行测试交通测量服务,其单元包含 GPS 接收器,您可能会从中找到有用的材料。
  • 有很多关于单向测量的学术研究。您可能会感兴趣的几篇论文:“Time Weaver: Opportunisctic One Way Delay Measurement via NTP”,Durairajan 等人,2018 年,https: //arxiv.org/pdf/1801.02123.pdf和
  • 如果您需要比 NTP 更好的准确度,请考虑使用精确时间协议,但它比 NTP 更加努力。
  • 大型云服务有相当不错的时钟可用于 NTP,例如AWS

使用基于 HTTP/TCP 的 RESTful 接口,您可以使用数据包跟踪器并停止发送请求和相应 TCP ACK 之间的时间。这当然包括 ACK 需要返回的时间,但它会给出一个精确的数字 - 通常,往返延迟是一个比单向延迟更有用的数字。

另一种方法是使用具有低开销协议 (UDP) 的第二个连接,并来回发送带时间戳的 ID 以计算时间间隔。

编辑评论

请注意,即使您使用 NTP 或类似方法同步两个机器时钟,协议也需要考虑 RTT - 因此“同步”时间精度取决于它。

唯一物理上精确的方法是在机器之间(或到进行测量的第三台机器,例如使用数据包捕获)之间有一个已知的延迟路径,并将其用作参考。但是,这通常不实用。