当我执行以下命令时
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_REALTIME
和CLOCK_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 年的正常运行时间。