【问题标题】:In what cases CLOCK_MONOTONIC might not be available在什么情况下 CLOCK_MONOTONIC 可能不可用
【发布时间】:2018-12-22 23:53:42
【问题描述】:

在Java 中System.nanoTime() 的单调implementation on Linux 依赖于CLOCK_MONOTONIC 在操作系统上可用的事实。如果它不可用,它会退回到gettimeofday,这可能会导致在使用nanoTime 测量时间间隔时获得负时间间隔。例如,以下测试可能会失败。

long t1 = System.nanoTime();
long t2 = System.nanoTime();
assert t2 >= t1

在什么情况下CLOCK_MONOTONIC 在服务器上可能不可用?假设 CLOCK_MONOTONIC 时钟在所有现代 Linux 服务器上都可用是否合理?

【问题讨论】:

    标签: java linux time clock gettimeofday


    【解决方案1】:

    假设所有现代 Linux 服务器上都可以使用 CLOCK_MONOTONIC 时钟是否合理?

    我只能评论这个问题。是的,你使用的所有生产级系统都有一个 Linux 知道如何访问的单调时钟是合理的。虚拟服务器和容器服务器也是如此。

    良好的工程要求您对此进行检查并在假设被打破时排除错误,但我会在设计时指望这一点。

    【讨论】:

      【解决方案2】:

      假设所有现代 Linux 服务器上都可以使用 CLOCK_MONOTONIC 时钟是否合理?

      是的。假设是合理的。

      从gettime手册条目的措辞中,我们可以推断出真正老版本的glibc不支持CLOCK_MONOTONIC。 (我仍在试图弄清楚有多老......但可能是当 glibc 声称符合 POSIX 1003.1 时。)

      CLOCK_MONOTONIC 已在 IEEE Std 1003.1, 2004 版中指定(至少),但兼容的 libc 实现仍有可能不支持 CLOCK_MONOTONIC

      至少从 Linux 3.0 (2011) 开始,Linux 内核源代码就支持 CLOCK_MONOTONIC 时钟。

      从其他来源来看,这也取决于您系统的 glibc 是如何构建的。 (使用“模拟计时器”构建时,不支持CLOCK_MONOTONIC。)

      以下是一些不支持的情况:


      CLOCK_MONOTONIC 也有可能被支持但有问题:

      【讨论】:

      • 不管怎样,我刚刚遇到了一个问题,即我的 JVM 抱怨没有可用的单调时钟。我正在运行一个 docker 容器,其中 armv7 的采用 openjdk:15.0.1_9-jre-hotspot 作为基本映像。主机系统是运行最新的树莓派操作系统(内核 5.4)的树莓派模型 4。不确定是否相关,但在警告之后它似乎冻结/挂起。
      • 通过恢复为采用openjdk/openjdk14:armv7l-debianslim-jre-14.0.2_12 基本映像来修复它...目前,似乎很难找到适用于 32 位 armv7 的良好工作 openjdk jre 15...
      • @PimHazebroek 伙计,您刚刚为我节省了数小时的时间来查看为什么这个单调时钟在 RPI 2 Docker for ARM v7 上不可用(并导致 Spring Boot 应用程序无法正常运行)...拿起这个 openjdk14 停止了提出这个问题。尽管如此 - 等待一些合适的 OpenJDK 15 映像。在 ARM v7 上运行 Java 真的那么小众吗?
      猜你喜欢
      • 2016-06-13
      • 2020-04-21
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      • 2012-10-21
      • 2021-12-30
      相关资源
      最近更新 更多