关于 systemd 服务,时间戳单调是什么意思?

关于 systemd 服务,时间戳单调是什么意思?

当我执行以下命令时

systemctl show --all tomcat

我得到了很多属性,包括“ActiveEnterTimestampMonotonic”之类的属性。该属性的值非常大,例如“14786979371795”。这似乎太大,不可能是自服务进入活动状态以来的纪元以来的毫秒数。自服务进入活动状态以来,这似乎也小到纳秒。那么它是什么?什么是“时间戳单调”?

答案1

Afreedesktop.org 上关于 systemd 的 D-Bus ABI 的描述时间戳描述如下:

InactiveExitTimestamp、InactiveExitTimestampMonotonic、ActiveEnterTimestamp、ActiveEnterTimestampMonotonic、ActiveExitTimestamp、ActiveExitTimestampMonotonic、InactiveEnterTimestamp、InactiveEnterTimestampMonotonic包含单元上次离开非活动状态、进入活动状态、退出活动状态或进入非活动状态的 CLOCK_REALTIME 和 CLOCK_MONOTONIC 64 位 usec 时间戳。这些是单位转换的时间点不活动/失败→激活,激活→活动,活动→停用,最后停用 → 不活动/失败。如果此引导上尚未记录此类转换,则这些字段为 0。

它有点隐藏,但中间写着“usec 时间戳”,即微秒(μs)。

systemd 从 Linux 获取时间戳,Linux 提供了一个系统 API 函数,用于clock_gettime()从多个替代“时钟”之一获取时间。正如其文档所述,它要求所谓的CLOCK_REALTIMECLOCK_MONOTONIC

该功能的手册(强调我的)

CLOCK_MONOTONIC
无法设置的时钟,表示单调时间因为一些未指定的起点。该时钟不受系统时间不连续跳跃的影响(例如,如果系统管理员手动更改时钟),但受 adjtime(3) 和 NTP 执行的增量调整的影响。

在我的系统上,这些值似乎对应于系统启动时间的起点,但我们可能不应该依赖于此。 (请注意 Linux 手册还说明了CLOCK_BOOTTIME和之间的区别CLOCK_MONOTONIC。)

这些*TimestampMonotonic值可用于计算间隔,或者如果您需要日期和时间,也可以使用实时时间戳。如果您有计时器单位,请注意它们的相对时间设置以单调时间为单位。


作为一个实证实验,我刚才重新启动了一个特定的服务,然后刷新了时间戳。我得到的值是:

ActiveEnterTimestamp=Tue 2018-07-03 18:37:31 EEST
ActiveEnterTimestampMonotonic=14341647533587

ActiveEnterTimestamp=Tue 2018-07-03 19:03:04 EEST
ActiveEnterTimestampMonotonic=14343180833503

差异为14343180833503 - 14341647533587、 或1533299916,大约是 25.5 分钟(以微秒为单位)的间隔。

答案2

Solaris 已有gethrtime()28 年的功能,并且自启动以来返回单调纳秒。

您的数字将匹配 4 小时的正常运行时间,并且由于 systemd 的作者确实研究了 Solaris,因此很有可能这是自启动以来的纳秒。

确认:

14786979371795除以十亿结果是14786.979371795

14786.979371795秒除以60秒结果246.4496561965分钟

246.4496561965分钟是4.1074942699小时

由于反馈结果的正常运行时间为 172 天,很明显,该数字是自上次启动以来的微秒数,如果该数字基于来自以下位置的单调时钟:clock_gettime()

顺便说一句:计算纳秒的单调计数器使用带符号的 64 位数字可以实现长达 1696 年的正常运行时间。

相关内容