【发布时间】:2010-11-17 12:44:05
【问题描述】:
更新:原来我很愚蠢。当我应该检查访问时间时,我正在检查修改时间。无法重现的原因是测试文件是用dd if=/dev/urandom of="$target" bs='1K' count=1 || exit 1制作的,大部分时间太快了,以至于新文件的修改时间(dd结束)与访问时间(开始dd 的时间)。另一件需要注意的事情。
我正在编写一个脚本,将一个文件的访问时间加上两年时间应用于另一个文件。这使用stat -c %x、date --rfc-3339=ns 和touch -a --date="$result"。 stat 和 date 都输出以纳秒为单位的日期字符串,比如
2012-11-17 10:22:15.390351800+01:00
,info coreutils 'touch invocation' 表示它支持纳秒。但有时在应用触摸时,应用的时间戳与 stat 之后返回的时间戳之间存在微小差异。以下是实际运行的数据:
$ for i in {1..100}; do ./t_timecopy.sh 2>/dev/null| grep ASSERT; done
ASSERT:Expecting same access time expected:<2012-11-17 10:58:40.719320935+01:00> but was:<2012-11-17 10:58:40.723322203+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:00:04.342346275+01:00> but was:<2012-11-17 11:00:04.346358718+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:00:39.343348183+01:00> but was:<2012-11-17 11:00:39.347351686+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:01:08.655348312+01:00> but was:<2012-11-17 11:01:08.659347625+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:01:37.930346876+01:00> but was:<2012-11-17 11:01:37.934347311+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:02:16.939319832+01:00> but was:<2012-11-17 11:02:16.943323061+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:02:46.456443149+01:00> but was:<2012-11-17 11:02:46.458379114+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:03:15.487339595+01:00> but was:<2012-11-17 11:03:15.491341426+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:04:04.646335863+01:00> but was:<2012-11-17 11:04:04.650346634+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:04:14.410326608+01:00> but was:<2012-11-17 11:04:14.414331233+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:04:24.159367348+01:00> but was:<2012-11-17 11:04:24.163352418+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:04:33.931387953+01:00> but was:<2012-11-17 11:04:33.935350115+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:05:03.394361030+01:00> but was:<2012-11-17 11:05:03.398320957+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:05:42.054317430+01:00> but was:<2012-11-17 11:05:42.059106497+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:06:40.346320820+01:00> but was:<2012-11-17 11:06:40.350346956+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:08:17.194346778+01:00> but was:<2012-11-17 11:08:17.198338832+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:08:27.102347603+01:00> but was:<2012-11-17 11:08:27.106320380+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:09:16.247322948+01:00> but was:<2012-11-17 11:09:16.251347966+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:09:55.191325266+01:00> but was:<2012-11-17 11:09:55.195320672+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:12:09.915318301+01:00> but was:<2012-11-17 11:12:09.919334099+01:00>
ASSERT:Expecting same access time expected:<2012-11-17 11:12:28.906346914+01:00> but was:<2012-11-17 11:12:28.910348186+01:00>
因此,100 次测试中有 21 次失败,平均为 3.938 毫秒,中位数为 4.001 毫秒。有什么想法会导致这种情况吗?
$ uname -a
Linux user 2.6.32-22-generic #33-Ubuntu SMP Wed Apr 28 13:27:30 UTC 2010 i686 GNU/Linux
【问题讨论】:
-
如果您提供您正在使用的测试脚本的代码,这将对我们有所帮助。另外,您是否绝对确定在您执行此操作时没有任何内容读取(注意:atime)文件?
-
这就解释了:-)。您还应该记住两件事: 1. 仅仅因为 FS 支持纳秒分辨率,并不意味着内核实际上使用这种分辨率对任何事情进行计时。 2. 时间是一件敏感的事情。您需要使用 strictatime 挂载选项显式打开它们,这将显着降低 FS(通常默认为 relatime)的性能。它们还容易受到任何可以访问您正在观看的文件的随机应用程序的攻击。