【问题标题】:In Java + Linux, what is the correct way to measure latency across CPU cores?在 Java + Linux 中,测量 CPU 内核延迟的正确方法是什么?
【发布时间】:2016-08-01 16:05:03
【问题描述】:

我听说System.nanoTime() 在 Java + Linux 的 CPU 内核中并不一致。那么如何测量单向消息在环回上的延迟,换句话说,在同一台机器上。流程是:

  • 客户端向服务器发送带有时间戳的消息
  • 服务器收到消息
  • 服务器从消息中解析出时间戳
  • 服务器计算单向延迟(现在 - 时间戳)

请注意,服务器和客户端在同一台机器上运行,但固定到不同的 cpu 内核。

【问题讨论】:

    标签: java linux kernel real-time benchmarking


    【解决方案1】:

    您可以使用 System.nanoTime()。这仅在运行 Windows XP 的多插槽计算机等旧操作系统上存在问题。

    在机器内。

    • 在一个线程中写入时间戳
    • 在另一个线程中读取时间戳。

    注意:以这种方式测量延迟存在严重问题,例如协调遗漏。更好的方法是

    • 根据您要测量的目标吞吐量计算应开始测试的时间。
    • 忙于等待到达该时间(如果尚未落后)。
    • 写下应该发送消息的时间,而不是实际发送的时间。
    • 读取时间戳并进行比较。
    • 记录分布。

    您甚至可以通过往返测试在机器之间使用 System.nanoTime()

    • 发送时间戳
    • 让另一端发回。
    • 与当前时间比较。

    【讨论】:

    • 谢谢!我发现协调遗漏可能是矫枉过正。我不能只计算数百万条消息的单向延迟时间,一次一条(从不同时发送两条消息),然后计算平均值、百分位数、stdev 等吗?
    • @TakeSoUp stddev 的延迟是没有意义的,因为它不遵循正态分布。当您接近最大吞吐量时,协调遗漏是一个问题。如果你说只有最大值的 10%,它可能并不那么重要。不过最好测量一下,这样您就不必猜测了。
    猜你喜欢
    • 2011-09-17
    • 2016-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多