每当我在家用电脑上升级 Linux 时,我都会列出一系列通常会执行的任务。多年来,这些任务已成为习惯:我备份我的文件,擦除系统,从头开始重新安装,恢复我的文件,然后重新安装我最喜欢的额外应用程序。我还会进行一些系统调整。我对其中一些调整已经进行了很长时间,以至于我最近想知道是否仍然需要这样做。
其中一项调整是 atime
,它是 Linux 上每个文件上的三个时间戳之一(稍后会详细介绍)。具体来说,我想知道在较新的 Linux 系统中禁用 atime
是否仍然值得。由于 atime
在每次文件被访问时都会更新,因此我的理解是它对系统性能有重大影响。
最近,我将我的电脑升级到 Fedora 32,并出于习惯在升级后的系统中关闭了 atime
。但我仍然需要这样做吗?我决定进一步研究一下。以下是我发现的内容。
关于文件时间戳的简要介绍
要理解 noatime
,您需要退后一步,了解一些关于 Linux 文件系统以及内核如何将时间戳应用于文件和目录的知识。您可能已经知道文件和目录的“上次修改”日期;您可以在 ls -l
(长列表)目录列表中看到它,或者如果您在文件管理器中查看文件详细信息。但在幕后,Linux 内核会跟踪文件和目录上的多个时间戳
- 文件上次修改时间 (
mtime
) - 文件上次更改时间 (
ctime
) - 文件上次访问时间 (
atime
)
您可以使用 stat
命令查看文件或目录的这些详细信息。这是一个关于我的一个测试服务器上的 /etc/fstab
文件的示例
$ stat fstab
File: fstab
Size: 261 Blocks: 8 IO Block: 4096 regular file
Device: b303h/45827d Inode: 2097285 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:etc_t:s0
Access: 2019-04-25 21:10:18.083325111 -0500
Modify: 2019-05-16 10:46:47.427686706 -0500
Change: 2019-05-16 10:46:47.434686674 -0500
Birth: 2019-04-25 21:03:11.840496275 -0500
从输出中,您可以看到此文件创建于 2019 年 4 月 25 日,当时我安装了系统。我的 /etc/fstab
文件上次修改于 2019 年 5 月 16 日,任何其他属性也在大约同一时间被更改。
如果我将 /etc/fstab
复制到一个新文件,日期会更改,表明这是一个新文件
$ sudo cp fstab fstab.bak
$ stat fstab.bak
File: fstab.bak
Size: 261 Blocks: 8 IO Block: 4096 regular file
Device: b303h/45827d Inode: 2105664 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:etc_t:s0
Access: 2020-05-12 17:53:58.442659986 -0500
Modify: 2020-05-12 17:53:58.443659981 -0500
Change: 2020-05-12 17:53:58.443659981 -0500
Birth: 2020-05-12 17:53:58.442659986 -0500
但是,如果我只是重命名文件而不更改其内容,Linux 只会更新文件的“更改时间”
$ sudo mv fstab.bak fstab.tmp
$ stat fstab.tmp
File: fstab.tmp
Size: 261 Blocks: 8 IO Block: 4096 regular file
Device: b303h/45827d Inode: 2105664 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:etc_t:s0
Access: 2020-05-12 17:53:58.442659986 -0500
Modify: 2020-05-12 17:53:58.443659981 -0500
Change: 2020-05-12 17:54:24.576508232 -0500
Birth: 2020-05-12 17:53:58.442659986 -0500
这些时间戳对于某些 Unix 程序非常有用。例如,biff 是一个程序,当您收到新的电子邮件消息时,它会通知您。现在您看不到很多人使用 biff,但在邮箱位于本地系统的时代,biff 非常常见。
程序如何知道您的收件箱中是否有新邮件?Biff 会比较“上次修改时间”(收件箱文件更新为新电子邮件消息的时间)和“上次访问时间”(您上次阅读电子邮件的时间)。如果“修改时间”比“访问时间”更新,那么 biff 就会知道自您上次阅读电子邮件以来有电子邮件消息到达,并通知您。Mutt 电子邮件客户端也做了类似的事情,以便在有新消息到达时提醒您。
如果您需要进行文件系统统计和性能调整,那么“上次访问时间”也很有用。在大型 Linux 系统上,管理员可能需要知道正在访问什么内容,以便他们可以适当地调整文件系统。
但是,大多数现代程序不再需要“上次访问时间”,因此有人认为不应该使用它。2007 年,Linus Torvalds 和其他几位内核开发人员讨论了 atime
及其性能问题。Linux 内核开发人员 Ingo Molnár 对 atime
和 ext3 文件系统做了如下 观察
有点奇怪的是,每个 Linux 桌面和服务器都因持续的 atime 更新而受到明显的 IO 性能下降的影响,而实际上只有两个真正的用户使用它:tmpwatch [可以配置为使用 ctime,所以这不是什么大问题] 和一些备份工具。(好吧,还有 mail-notify,我想也是。)在成千上万个应用程序中。
但是人们仍然使用一些需要它的程序,移除 atime
会破坏这些用户程序。而 Linux 内核开发中的规则是不破坏用户空间。
relatime 折衷方案
Linux 发行版包含许多软件应用程序,用户可以下载和安装其他程序以满足他们的特定需求。这是开源操作系统的主要优势!但这使得调整文件系统性能变得更加困难。您需要 atime
吗?或者移除它会破坏系统上的某些东西吗?
作为一种折衷方案,Linux 内核开发人员实现了一种新方法:relatime
是一种略有不同的性能度量,旨在平衡性能和兼容性。mount
手册页对 relatime
的描述如下
只有当上次访问时间早于当前修改或更改时间时,才会更新访问时间。……自 Linux 2.6.30 以来,内核默认使用此选项提供的行为(除非指定了 noatime)……此外,自 Linux 2.6.30 以来,如果文件的上次访问时间超过 1 天,则始终会更新。
简而言之:现代 Linux 系统(自 2009 年发布的 Linux 2.6.30 以来)已经使用 relatime
,这应该为您带来非常快的性能提升。这意味着您无需调整 /etc/fstab
文件,并且可以依赖 relatime
内核默认值。
使用 noatime 调整系统性能
但是,如果您希望调整系统以获得最佳性能,那么在 2020 年,禁用 atime
仍然是一个有效的选择。
这种性能调整在非常快的现代驱动器(如 NVME 或快速 SSD)上可能不是很明显,但仍然会有一些提升。
如果您知道您不使用需要 atime
的软件,那么您可以通过在 /etc/fstab
文件中设置 noatime
来获得轻微的性能提升。这会告诉内核不要跟踪“上次访问时间”,从而避免持续更新文件系统中 atime
造成的微小性能损失。将 noatime
作为选项添加到您的 Linux 文件系统,通常在 defaults 条目之后
/dev/mapper/fedora_localhost--live-root / ext4 defaults,noatime,x-systemd.device-timeout=0 1 1
UUID=be37c451-915e-4355-95c4-654729cf662a /boot ext4 defaults,noatime 1 2
UUID=C594-12B1 /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/fedora_localhost--live-home /home ext4 defaults,noatime,x-systemd.device-timeout=0 1 2
/dev/mapper/fedora_localhost--live-swap none swap defaults,x-systemd.device-timeout=0 0 0
这将在您下次重启时生效。
2 条评论