当前位置: 首页 > 面试题库 >

EXT4的时间戳准确度(毫秒)

袁赞
2023-03-14
问题内容

我在Vala中编写一些代码,在那里我将首先获取系统时间,然后创建一个文件,然后检索该文件的时间戳。时间戳记总是早于系统时间,介于500到1500微秒之间,这没有任何意义。

然后,我编写了一个简单的shell脚本:

while true; do
touch ~/tmp/fred.txt
stat ~/tmp/fred.txt|grep ^C
done

结果如下:

Change: 2013-01-18 16:02:44.290787250 +1100
Change: 2013-01-18 16:02:44.293787250 +1100
Change: 2013-01-18 16:02:44.296787250 +1100
Change: 2013-01-18 16:02:44.298787248 +1100
Change: 2013-01-18 16:02:44.301787248 +1100
Change: 2013-01-18 16:02:44.304787248 +1100
Change: 2013-01-18 16:02:44.306787248 +1100
Change: 2013-01-18 16:02:44.309787248 +1100
Change: 2013-01-18 16:02:44.312787248 +1100
Change: 2013-01-18 16:02:44.315787248 +1100

如您所见,小数点后的前3位(毫秒)似乎可以正常显示,因为它们正在按预期的顺序递增,但是第4位及其后的数字看起来不正确。倒数第4至9位似乎在变慢。我有什么理由吗,尽管ext4的精度高达纳秒。访问和修改时间戳的行为相同。


问题答案:

如果inode足够大以支持扩展时间信息(256字节或更大),则ext4文件系统确实支持存储时间的纳秒分辨率。在您的情况下,由于分辨率大于第二个分辨率,因此这不是问题。

在内部,ext4文件系统代码调用current_fs_time(),这是当前缓存的内核时间,该时间被截断为文件系统的超级块中指定的时间粒度,对于ext4,该粒度为1ns。

Linux内核中的当前时间被缓存,并且通常仅在计时器中断时才更新。因此,如果您的计时器中断以10毫秒的速度运行,则缓存的时间将仅每10毫秒更新一次。当确实发生更新时,结果时间的准确性将取决于硬件上可用的时钟源。

试试看,看看您是否也获得了与统计调用相似的结果:

while true; do date --rfc-3339=ns; done

在我的机器(amd64,intel virtualbox)上没有量化。

例如

2013-01-18 17:04:21.097211836+11:00
2013-01-18 17:04:21.098354731+11:00
2013-01-18 17:04:21.099282128+11:00
2013-01-18 17:04:21.100276327+11:00
2013-01-18 17:04:21.101348507+11:00
2013-01-18 17:04:21.102516837+11:00

更新

上面使用的检查date在这种情况下并没有显示任何内容。这是因为date将调用gettimeofday系统调用,该系统调用将始终根据缓存的内核时间返回最准确的可用时间,并根据CPU周期时间进行调整(如果可以提供纳秒分辨率)。但是,存储在文件系统中的时间戳仅基于缓存的内核时间。即在上一个定时器中断处计算的时间。



 类似资料:
  • 我需要使用格式“m-d-Y H:I:s.u”(包括毫秒)在laravel应用程序上以高精度的时间戳存储更新的_ 根据laravel文档,我可以通过在类上设置$dateFormat属性来自定义日期格式,但是。。。 主要问题是Laravel的模式生成器在数据库中添加了一列类型时间戳,当我使用$table- 有什么办法可以做到这一点吗?

  • 创建了两个虚拟示例项目(dummy1.jmx和dummy2.jmx),并使用默认设置执行以下命令(JMeter 5.3默认安装,安装了所有必需的插件)。 > # 生成的报告和时间戳在仪表板和图形中看起来都很完美 **# # 生成的报告和时间戳在仪表板和图形中看起来都很完美 # 使用MergeResults插件将上述CSV文件合并为一个文件并生成HTML报告 # 发现合并的时间戳标签无效,并且生成的

  • 问题内容: 我必须使用MySQL开发应用程序,并且必须保存“ 1412792828893”之类的值,该值代表时间戳,但精度为毫秒。即,自1970年1月1日以来的毫秒数。我声明该行为,但不幸的是,这行不通。所有值均设置为 为了能够以这种精度保存时间戳记值,如何声明? 问题答案: 您需要使用MySQL 5.6.4或更高版本,才能声明具有小数秒时间数据类型的列。不确定您使用的版本正确吗?尝试。如果遇到错

  • 我有一个Unix历元时间戳(以毫秒为单位),需要获取本地时间的日期字符串。 这是我的代码: 由上述函数生成的原始时间戳和结果日期、小时和所有其他值均以UTC为单位。如何更改代码以在当地时间获取它?

  • 本文向大家介绍php生成毫秒时间戳的实例讲解,包括了php生成毫秒时间戳的实例讲解的使用技巧和注意事项,需要的朋友参考一下 php时间函数time()生成当前时间的秒数,但是在一些情况下我们需要获取当前服务器时间和GMT(格林威治时间)1970年1月0时0分0秒的毫秒数,与Java中的currentTimeMilis()函数一样。 例子: 以上就是小编为大家带来的php生成毫秒时间戳的实例讲解的全

  • 我想把UTC的时间戳转换成Postgres中的毫秒。我在Ruby控制台上使用这个查询(使用Postgres)。我的问题是: 以上查询结果, 2018年7月5日星期四05:05:39 UTC 00:00至1530767139732.35 输出看起来不错,但在“.”之后我不需要35岁。有没有办法得到13位毫秒的输出。 我会很感激你的帮助。