今天我注意到运行 redhat 7.3 的 Linux 机器中的时间戳存在问题。 dmesg 中显示的时间戳落后于 /proc/uptime 中显示的时间戳
# echo TEST > /dev/kmsg && dmesg | tail -1 && cat /proc/uptime
[661503.956980] TEST
661301.99 15107232.56
据我了解,它们都显示自内核初始化以来经过的秒数。那么是什么导致了这里的差异呢?
dmesg 时间戳显示 CLOCK_MONOTONIC,而 /proc/uptime 显示 CLOCK_BOOTTIME。
有关 CLOCK_* 是什么的详细信息,请参阅“man timer_create”。
它们是不同的时钟。
内核 dmesg 的时间戳由内核内部检索 local_clock(),不导出到用户空间。它不是 CLOCK_MONOTONIC 或 CLOCK_MONOTONIC_RAW。
/proc/uptime 中显示的时间是 CLOCK_BOOTTIME。 CLOCK_BOOTTIME 是 与 CLOCK_MONOTONIC 相同,只是它还包括任何时间 系统已暂停。