linux - Linux bash time 命令的准确性如何?
问题描述
我想在 bash 脚本的日志文件中为一些事件加上时间戳。我需要这个时间戳尽可能准确。我看到从 bash 执行此操作的标准方法似乎是time
命令,它可以生成带有+%s%N
选项的纳秒时间戳。
然而,当从 CI 执行此操作时,请记住多个计时功能有多个时钟源,并且并非所有它们都同样准确或具有相同的保证(例如单调性)。我怎么知道time
使用什么时钟源?
解决方案
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 毫秒。
推荐阅读
- c# - 事件处理程序内部的 C# 锁
- node.js - 如何使用 MERN Stack 发出 GET 请求
- maven - 如何只运行一个 Maven 子模块的所有测试?
- ios - 登录 Swift 后如何关闭视图控制器
- java - Android 应用程序壁纸功能未实现;不知道为什么?
- python - 如何使用 Selenium 从 FileExplorer 上传文件
- android - Recyclerview 不显示项目(没有适配器,附加的跳过布局)
- c++ - GetKeyState 是否生成输入消息?
- bluetooth - 与多个外围蓝牙设备建立连接后,Bluezero / BlueZ 变慢
- authentication - 使用所有权用户策略通过 KeyCloak 保护资源端点