How and why the noatime option improves Linux system performance
Whenever I update Linux on my home computer, I have to solve certain problems. Over the years, this has become a habit: I make backup copies of my files, erase the system, install everything from scratch, restore my files, then reinstall my favorite applications. I also change the system settings for myself. Sometimes it takes too much time. And recently, I wondered if I needed this headache.
atime is one of three timestamps for files on Linux (more on this later). In particular, I wondered if it would still be worthwhile to disable atime on later Linux systems. Since atime is updated every time a file is accessed, I realized that it has a significant impact on system performance.
I recently upgraded to Fedora 32 and out of habit started by disabling atime. I thought: do I really need it? I decided to study this issue and that's what I dug up.
A bit about file timestamps
To figure it out, you need to take a step back and recall a few things about Linux file systems and how the kernel assigns timestamps to files and directories. You can see the date of the last change of files and directories by running the ls -l (long) command or just by looking at the information about this in the file manager. But behind the scenes, the Linux kernel keeps track of several timestamps for files and directories:
- When was the last time the (mtime) file was modified
- When was the last time the properties and file metadata (ctime) were changed
- When was the last time they accessed the file (atime)
- You can use the stat command to view file or directory information. Here is the /etc/fstab file from one of my test servers:
$ 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
Here you can see that this file was created on April 25, 2019, when I installed the system. My /etc/fstab file was last modified on May 16, 2019, and all other attributes were changed at about the same time.
If I copy /etc/fstab to a new file, the dates change, indicating that this is a new file:
$ 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
But if I just rename the file without changing its contents, Linux will only update the file modification time:
$ 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
These timestamps are very useful for certain Unix programs. For example, biff is a program that notifies you of a new message in an email. Now few people use biff , but in those days when mailboxes were local to the system, biff was quite wide common.
How does the program know if you have new mail in your inbox? biff compares the last modified time (when the incoming mail file was updated with a new email message) and the last access time (the last time you read your email). If the change occurred later than access, then biff will understand that a new letter has arrived and will notify you of this. Mutt's email client works similarly.
The last access timestamp is also useful if you need to collect statistics on file system usage and tune performance. System administrators need to know which objects are being accessed in order to properly configure the file system.
But most modern programs no longer need this label, so there was a proposal not to use it. In 2007, Linus Torvalds and several other kernel developers discussed atime in the context of a performance issue. Linux kernel developer Ingo Molnar made the following remark about atime and the ext3 file system:
"It’s rather strange that every desktop and Linux server suffers from a noticeable decrease in I/O performance due to constant updates of atime, although there are only two real users: tmpwatch [which can be configured to use ctime, so it’s not big problem] and some backup tools. "
But people still use some programs that need this label. So removing atime will disrupt their work. Linux kernel developers should not infringe on user freedom.
Linux distributions include many applications, and users can also download and install other programs according to their needs. This is a key advantage of an open source OS. But this makes it difficult to optimize the performance of your file system. Removing resource-intensive components can disrupt the system.
As a compromise, Linux kernel developers have introduced the new relaytime option, which aims to strike a balance between performance and compatibility:
atime is updated only if the previous access time is less than the current time for modifying or changing status... Starting with Linux 2.6.30, the kernel uses this option by default (if noatime is not specified)... Also, starting since Linux 2.6.30, the last file access time is always updated if it is more than 1 day old.
Modern Linux systems (starting with Linux 2.6.30, released in 2009) already use relaytime, which should give a really big performance boost. This means that you do not need to configure the /etc/fstab file, and with relaytime you can rely on the default value.
Improving system performance with noatime
But if you want to tune your system to get maximum performance, disabling atime is still possible.
The performance change may not be noticeable on very fast modern drives (such as NVME or Fast SSD), but there is a slight increase.
If you know that you are not using software that requires atime, you can slightly improve performance by including the noatime option in the /etc/fstab file. After that, the kernel will not constantly update atime. Use the noatime option when mounting a file system:
/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
Changes will take effect the next time you reboot.
Need a server to host the site? Our company offers reliable servers with daily or one-time payment, each server is connected to an Internet channel of 500 Megabits and is free of DDoS protection -attack!