当我执行以下
systemctl show --all tomcat
Run Code Online (Sandbox Code Playgroud)
我得到了一堆属性,包括像“ActiveEnterTimestampMonotonic”这样的属性。此属性具有非常大的值,例如“14786979371795”。这似乎太大了,无法成为自服务进入活动状态以来的纪元以来的毫秒数。自服务进入活动状态以来,这似乎也小到几纳秒。那是什么?什么是“时间戳单调”?
甲上的systemd上freedesktop.org的d-总线ABI描述描述如下时间戳:
InactiveExitTimestamp、InactiveExitTimestampMonotonic、ActiveEnterTimestamp、ActiveEnterTimestampMonotonic、ActiveExitTimestamp、ActiveExitTimestampMonotonic、InactiveEnterTimestamp、InactiveEnterTimestampMonotonic包含 CLOCK_REALTIME 和 CLOCK_MONOTONIC 64 位使用c时间戳,进入活动状态、进入活动状态、进入活动状态或离开活动状态的最后一次活动状态的单元。这些是单元转换为非活动/失败的时间点?激活,激活?主动,主动?停用,最后停用?无效/失败。如果在本次启动时尚未记录此类转换,则字段为 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
Run Code Online (Sandbox Code Playgroud)
和
ActiveEnterTimestamp=Tue 2018-07-03 19:03:04 EEST
ActiveEnterTimestampMonotonic=14343180833503
Run Code Online (Sandbox Code Playgroud)
差异是14343180833503 - 14341647533587, 或1533299916,大约是那些以微秒为单位的 25.5 分钟。
sch*_*ily -3
Solaris 已有gethrtime()28 年的功能,并且自启动以来返回单调纳秒。
您的数字将匹配 4 小时的正常运行时间,并且由于 systemd 的作者确实研究了 Solaris,因此很有可能这是自启动以来的纳秒。
确认:
14786979371795除以十亿结果需要14786.979371795秒
14786.979371795秒除以60秒得到246.4496561965分钟
246.4496561965分钟等于4.1074942699小时
由于反馈结果的正常运行时间为 172 天,很明显,该数字是自上次启动以来的微秒数,如果该数字基于来自以下位置的单调时钟:clock_gettime()
顺便说一句:计算纳秒的单调计数器使用带符号的 64 位数字可以实现长达 1696 年的正常运行时间。