使用 noatime 提升 Linux 系统性能

关闭 atime 是提升系统性能的一个小而有效的方法。本文将介绍它是什么以及为什么它很重要。
135 位读者喜欢这篇文章。
How Linux got to be Linux: Test driving 1993-2003 distros

Internet Archive Book Images。由 Opensource.com 修改。CC BY-SA 4.0

每当我在家用电脑上升级 Linux 时,我都会列出一系列通常会执行的任务。多年来,这些任务已成为习惯:我备份我的文件,擦除系统,从头开始重新安装,恢复我的文件,然后重新安装我最喜欢的额外应用程序。我还会进行一些系统调整。我对其中一些调整已经进行了很长时间,以至于我最近想知道是否仍然需要这样做。

其中一项调整是 atime,它是 Linux 上每个文件上的三个时间戳之一(稍后会详细介绍)。具体来说,我想知道在较新的 Linux 系统中禁用 atime 是否仍然值得。由于 atime 在每次文件被访问时都会更新,因此我的理解是它对系统性能有重大影响。

最近,我将我的电脑升级到 Fedora 32,并出于习惯在升级后的系统中关闭了 atime。但我仍然需要这样做吗?我决定进一步研究一下。以下是我发现的内容。

关于文件时间戳的简要介绍

要理解 noatime,您需要退后一步,了解一些关于 Linux 文件系统以及内核如何将时间戳应用于文件和目录的知识。您可能已经知道文件和目录的“上次修改”日期;您可以在 ls -l(长列表)目录列表中看到它,或者如果您在文件管理器中查看文件详细信息。但在幕后,Linux 内核会跟踪文件和目录上的多个时间戳

  1. 文件上次修改时间 (mtime)
  2. 文件上次更改时间 (ctime)
  3. 文件上次访问时间 (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

这将在您下次重启时生效。

接下来阅读
标签
photo of Jim Hall
Jim Hall 是一位开源软件倡导者和开发者,以在 GNOME 中进行可用性测试以及作为 FreeDOS 的创始人和项目协调员而闻名。

2 条评论

atime 的最大问题是 SSD 写入周期。SSD 的寿命以写入周期数来衡量。

启用 atime 后,每次读取都会导致写入,以更新 atime。当在 SSD 上进行写入时,必须读取、更改和重写整个块。

非常符合常识,我已经关闭了我管理的每台服务器上的 atime。并且感谢 Robert Solomon,考虑到 SSD 设备的普及,这甚至更加重要。这些 atime 更新可能会损害您!

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.