Обновление atime влияет на производительность системы. Что же там происходит и что с этим делать — читайте в статье.
Всякий раз, когда я обновляю Linux на своем домашнем компьютере, мне приходится решать определённые задачи. С годами это вошло в привычку: я делаю резервные копии своих файлов, стираю систему, устанавливаю всё с нуля, восстанавливаю свои файлы, затем заново устанавливаю свои любимые приложения. Я также меняю под себя настройки системы. Порой на это уходит слишком много времени. И недавно я задумался, нужна ли мне эта головная боль.
atime — одна из трех временных меток для файлов в Linux (подробнее об этом позже). В частности, я задавался вопросом, стоит ли по-прежнему отключать atime в более поздних системах Linux. Поскольку atime обновляется каждый раз, когда к файлу обращаются, я понял, что он оказывает значительное влияние на производительность системы.
Недавно я обновился до Fedora 32 и по привычке начал с отключения atime. Я задумался: а нужна ли мне она в принципе? Решил изучить этот вопрос и вот что накопал.
Немного про временные метки файлов
Чтобы разобраться, вам нужно сделать шаг назад и вспомнить несколько вещей о файловых системах Linux и о том, как ядро присваивает временные метки файлам и каталогам. Вы можете увидеть дату последнего изменения файлов и каталогов, запустив команду ls -l (long) или просто посмотрев на информацию о об этом в файловом менеджере. Но за кулисами ядро 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
Здесь видно, что этот файл был создан 25 апреля 2019 года, когда я установил систему. Мой файл /etc/fstab был последний раз изменён 16 мая 2019 года, и все остальные атрибуты были изменены примерно в то же время.
Если я копирую /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 работает примерно так же.
Метка времени последнего доступа также полезна, если вам необходимо собрать статистику использования файловой системы и настроить производительность. Системным администраторам нужно знать, к каким объектам осуществляется доступ, чтобы соответствующим образом настроить файловую систему.
Но большинству современных программ эта метка больше не нужна, поэтому поступило предложение не использовать её. В 2007 году Линус Торвальдс и несколько других разработчиков ядра обсуждали atime в контексте проблемы с производительностью. Разработчик ядра Linux Инго Молнар сделал следующее замечание о atime и файловой системе ext3:
«Довольно странно, что каждый рабочий стол и сервер Linux страдают от заметного снижения производительности ввода-вывода из-за постоянных обновлений atime, хотя реальных пользователей всего два: tmpwatch [который можно настроить на использование ctime, так что это не является большой проблемой] и некоторые инструменты резервного копирования».
Но люди по-прежнему используют некоторые программы, которым нужна эта метка. Так что, удаление atime нарушит их работу. Разработчики ядра Linux не должны ущемлять свободу пользователя.
Соломоново решение
В дистрибутивы Linux включено множество приложений, и кроме того, пользователи могут загружать и устанавливать другие программы в соответствии со своими потребностями. Это ключевое преимущество ОС с открытым исходным кодом. Но это усложняет оптимизацию производительности вашей файловой системы. Удаление ресурсоёмких компонентов может нарушить работу системы.
В качестве компромисса разработчики ядра Linux внедрили новую опцию relaytime, которая призвана обеспечить баланс между производительностью и совместимостью:
atime обновляется только в том случае, если предыдущее время доступа меньше, чем текущее время модификации или изменения статуса … Начиная с Linux 2.6.30, ядро по умолчанию использует эту опцию (если не указано noatime)… Кроме того, начиная с Linux 2.6.30, время последнего доступа к файлу всегда обновляется, если ему более 1 дня.
Современные системы Linux (начиная с Linux 2.6.30, выпущенной в 2009 году) уже используют relaytime, что должно дать действительно быстрый прирост производительности. Это означает, что вам не нужно настраивать файл /etc/fstab, и с relaytime вы можете положиться на значение по умолчанию.
Повышение производительности системы с помощью noatime
Но если вы хотите настроить свою систему, чтобы получить максимальную производительность, отключение atime всё ещё возможно.
Изменение производительности может быть не сильно заметно на очень быстрых современных дисках (таких как NVME или Fast SSD), но там есть небольшой прирост.
Если вы знаете, что не используете программное обеспечение, для которого требуется atime, вы можете слегка повысить производительность, включив опцию noatime в файле /etc /fstab. После этого ядро не будет постоянно обновлять atime. Используйте опцию noatime при монтировании файловой системы:
/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
Изменения вступят в силу при следующей перезагрузке.
На правах рекламы
Необходим сервер для размещения сайта? Наша компания предлагает надёжные серверы с посуточной или единоразовой оплатой, каждый сервер подключён к интернет-каналу в 500 Мегабит и бесплатно защищён от DDoS-атак!
Автор: Mikhail