首页 > 解决方案 > Linux bash time 命令的准确性如何?

问题描述

我想在 bash 脚本的日志文件中为一些事件加上时间戳。我需要这个时间戳尽可能准确。我看到从 bash 执行此操作的标准方法似乎是time命令,它可以生成带有+%s%N选项的纳秒时间戳。

然而,当从 CI 执行此操作时,请记住多个计时功能有多个时钟源,并且并非所有它们都同样准确或具有相同的保证(例如单调性)。我怎么知道time使用什么时钟源?

标签: linuxbashtimesh

解决方案


man 1 time是相当清楚的:

这些统计数据包括 (i) 调用和终止之间经过的实时时间,(ii) 用户 CPU 时间(由 times(2) 返回的结构 tms 中的 tms_utime 和 tms_cutime 值的总和),以及 (iii)系统 CPU 时间(times(2) 返回的 struct tms 中的 tms_stime 和 tms_cstime 值的总和)。

所以我们可以去man 3p times where is just statesThe accuracy of the times reported is intentionally left unspecified to allow implementations flexibility in design, from uniprocessor to multi-processor networks.所以我们可以去man 2 times,并了解到这一切都是用 来衡量的clock_t,也许我们应该clock_gettime改用

我如何知道使用什么时钟源时间?

通常在 GNU 系统上,所有程序都是开源的。所以你去下载内核的源代码,然后你壳并检查它们以查看它是如何工作的。我在bash time_command()中看到有很多可用的方法,现在 bash 使用rusage作为times.

Linux bash time 命令的准确性如何?

两者getrusage()times()都是自己的系统调用,因此值直接从内核返回。我的猜测是它们是用内核可以给我们的精度来测量的——所以用 jiffies/ HZ

测量的分辨率将等于 jiffies,所以如果我的数学是正确的,通常使用 300 HZ 那就是 3.333ms。准确性将取决于您的硬件,也可能取决于工作量——我高估的猜测是,这些值将达到一到两个 jiffies 的准确性,因此最高可达约 7 毫秒。


推荐阅读