上EXT4时间戳精度(子millsecond)(timestamp accuracy on EXT4

2019-07-18 09:03发布

我写在瓦拉一些代码,我将首先把系统时间,然后创建一个文件,然后检索该文件的时间戳。 时间戳将永远是前面的系统时间,地方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达精密纳米第二支持。 访问和修改时间戳的行为以同样的方式。

Answer 1:

ext4文件系统不支持纳秒精度的存储时间,如果索引节点是大到足以支持较长时间信息(256个字节或更大)。 在你的情况,因为还有比第二分辨率更大,这是没有问题的。

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

在Linux内核中的当前时间被缓存,并且一般只更新一个定时器中断。 所以,如果你的定时器中断在10毫秒运行,缓存时间将只一次每10毫秒更新。 当确实发生更新时,得到的时间精确度将取决于您的硬件提供的时钟源。

试试这个,看看是否你也可以得到类似的结果在您的stat调用:

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

在我的机器(AMD64,英特尔的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周期时间调整(如果可用)给纳秒的分辨率。 在存储但是文件系统中的时间戳,仅基于缓存的内核时间。 即在最后的定时中断计算时间。



文章来源: timestamp accuracy on EXT4 (sub millsecond)
标签: linux bash ext4