我正在利用访问时间来分析一些构建过程,但它并没有按照我想要的方式工作:访问时间在我第一次读取文件时更新,然后它会长时间保持不变,或者直到下次重启。例如:
$ ll -u some_file
-rw-r--r-- 1 root root 1.3M 2010-04-07 10:03 some_file
$ grep abcdef some_file
$ ll -u some_file
-rw-r--r-- 1 root root 1.3M 2010-04-07 11:24 some_file
# The access time is updated
# waiting a few minutes...
$ grep abcdef some_file
$ ll -u some_file
-rw-r--r-- 1 root root 1.3M 2010-04-07 11:24 some_file
# The access time has not been updated :(
我想该文件是由Linux在空闲内存中缓冲的,出于速度原因,只有这个副本在随后的时间里被访问。一种解决方案是丢弃内存中的缓冲区。在搜索了一些论坛后,我发现:
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
但它不起作用,它似乎只同步写入缓冲区,而不是读取缓冲区。可能是由于我的发行版(fedora 9)上的一些自定义内核配置?
或者我在这里遗漏了什么?有没有办法实现这种访问时间刷新?
另请注意,我不想在整个文件树上模拟一些写入。因为我正在使用一些基于 makefile 的构建系统,这将导致整个项目再次被构建。
编辑:
我使用的是标准 ext3 文件系统,没有特殊选项。
/dev/sda1 on / type ext3 (rw)
我尝试使用strictatime
(未识别)和atime
(没有区别,我猜这是默认值)重新安装它。
您使用的是 noatime 还是 relatime 挂载选项?您可以查看您是否使用以下
mount
命令:如果是这样,请在没有这些选项的情况下重新安装文件系统(或者在这种情况下可能更好的是编辑选项
/etc/fstab
并重新启动)。这些选项与文件系统无关。这些选项的描述在“FILESYSTEM INDEPENDENT MOUNT OPTIONS”中man mount
,但基本上它们会阻止或限制时间被更新以提高性能。我不确定这是否是您问题的解决方案,但由于您取决于访问时间,我建议您无论如何都这样做。
顺便说一句,您可能想在这里或在 stackoverflow 上询问有关分析您的特定构建过程的问题,以确保 atime 是正确的选择。
更新:
是否
stat -c "%x" filename
显示相同的内容?(忽略我的上次更新,没有注意到该-u
选项...),但也许您的ll
别名有问题,所以我会检查 stat 以确保。另外,您说/没有noatime,但是您是在根系统上而不是在另一个文件系统上进行这些测试,例如nfs mount之类的吗?
是否
touch -a -t 199812130530
设法更改访问时间?好的,这种行为实际上是由于特定的 Fedora 9 内核出于优化原因禁用了标准访问时间更新(为每次读取写入磁盘非常耗时)。
设置了该选项
DEFAULT_RELATIME
(在我的情况下为内核 2.6.27.25),如果最后一次刷新发生在不到一天前,则禁用访问时间刷新。内核编译选项文档提供了
norelatime
禁用此功能的内核引导选项......但它不起作用!为了成功修改这种行为,我实际上做了:
这将这个间隔减少到 1 分钟。
感谢您帮助我找到这个解决方案。