Linux EXT4上的时间戳精度(亚毫秒)

Linux EXT4上的时间戳精度(亚毫秒),linux,bash,ext4,Linux,Bash,Ext4,我正在用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.

我正在用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支持高达纳秒的精度。访问和修改时间戳的行为方式相同。

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

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

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

试试这个,看看你是否也得到了与统计调用类似的结果:

while true; do date --rfc-3339=ns; done
在我的机器上(amd64,intel virtualbox),没有量化

乙二醇

更新


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

为真;do日期——rfc-3339=ns;我干得不错:2013-01-18 17:38:33.288373231+11:00 2013-01-18 17:38:33.288966248+11:00 2013-01-18 17:38:33.289559102+11:00 2013-01-18 17:38:33.290142562+11:00我只需要微秒的分辨率,因此,我想知道我的系统的哪个组件需要更正。因为我想要获得准确时间戳的文件不在我的控制范围内,也就是说,我没有创建它们,所以上述建议实际上不是一个选项。然而,关于缓存内核时间的最新解释确实解释了我所看到的。是否有任何内核参数来调整此行为?如果没有,那么在我看来,这种额外的精度几乎是无用的。有关于这一现象的文章吗?谢谢。由于ext4fs驱动程序正在选择使用时间,如果不想修改驱动程序,您没有太多选择。精度与计时器滴答声频率有关。根据您的输出,您的内核HZ值似乎在300左右。我的分辨率是250赫兹,所以没有比4毫秒更好的分辨率了。您可以使用更高的HZ值重新编译内核,但这只能使您在1000Hz时获得1ms的分辨率。如果这很关键,请更改ext4内核代码。我怀疑使用了缓存时间,因为读取缓存非常快。更改以获得纳秒分辨率可能很容易,但代价是计算文件系统时间的性能较差,第219页之后,对内核计时器系统进行了一些深入的讨论。没有直接关系,但提供了一些背景。
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