Как и почему опция noatime повышает производительность Linux-систем

Автор оригинала: Jim Hall
  • Перевод
Обновление atime влияет на производительность системы. Что же там происходит и что с этим делать — читайте в статье.


Всякий раз, когда я обновляю Linux на своем домашнем компьютере, мне приходится решать определённые задачи. С годами это вошло в привычку: я делаю резервные копии своих файлов, стираю систему, устанавливаю всё с нуля, восстанавливаю свои файлы, затем заново устанавливаю свои любимые приложения. Я также меняю под себя настройки системы. Порой на это уходит слишком много времени. И недавно я задумался, нужна ли мне эта головная боль.

atime — одна из трех временных меток для файлов в Linux (подробнее об этом позже). В частности, я задавался вопросом, стоит ли по-прежнему отключать atime в более поздних системах Linux. Поскольку atime обновляется каждый раз, когда к файлу обращаются, я понял, что он оказывает значительное влияние на производительность системы.
Недавно я обновился до Fedora 32 и по привычке начал с отключения atime. Я задумался: а нужна ли мне она в принципе? Решил изучить этот вопрос и вот что накопал.

Немного про временные метки файлов


Чтобы разобраться, вам нужно сделать шаг назад и вспомнить несколько вещей о файловых системах Linux и о том, как ядро присваивает временные метки файлам и каталогам. Вы можете увидеть дату последнего изменения файлов и каталогов, запустив команду ls -l (long) или просто посмотрев на информацию о об этом в файловом менеджере. Но за кулисами ядро ​​Linux отслеживает несколько временных отметок для файлов и каталогов:

  1. Когда в последний раз был модифицирован файл (mtime)
  2. Когда в последний раз были изменены свойства и метаданные файла (ctime)
  3. Когда в последний раз обращались к файлу (atime)
  4. Вы можете использовать команду 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-атак!

VDSina.ru — хостинг серверов
Серверы в Москве и Амстердаме

Комментарии 19

    +6

    Ну так и почему?

      +3
      Ну так вот же:
      Поскольку atime обновляется каждый раз, когда к файлу обращаются, я понял, что он оказывает значительное влияние на производительность системы.

      Или вам объективные данные подавай, статистику, цифры?.. :) Человек понял, вы чего?
        +1

        Статья называется "как и почему", а по тексту этого как и почему две строчки. Я понимаю, что это перевод, но статья достаточно бесполезная. Как раз цифры были бы полезны или можно просто написать: выключайте atime если он вам не нужен — ос будет меньше долбить диск, особенно касается фс с COW.

          0
          Я на это и намекал, в общем-то — потому что лично мне, например, не очевиден прямо большой прирост производительности от этого, кроме конкретных случаев вроде файлов СУБД на медленном массиве.
      +17
      По традиции, критикую перевод.

      Поскольку atime обновляется каждый раз, когда к файлу обращаются, я понял, что он оказывает значительное влияние на производительность системы. Since atime is updated every time the file is accessed, my understanding was that it had a significant impact on system performance.


      Неточно передано время и степень уверенности. В оригинале понимание было подано как статус-кво и как нечто теоретически опровержимое, в переводе — как внезапно случившееся событие и как истина в последней инстанции. Гугловый перевод грешит тем же. Может быть, «я полагал, что»…?

      Разработчики ядра Linux не должны ущемлять свободу пользователя. And the rule in Linux kernel development is not to break userspace.


      Перевод не соответствует оригиналу. userspace — это не свобода пользователя. Может быть: «В то же время, разработчики ядра Linux придерживаются правила не ломать пользовательские приложения».

      Удаление ресурсоёмких компонентов может нарушить работу системы. Do you need atime, or will removing it break something on your system?


      Перевод не соответствует оригиналу буквально, но по смыслу, как ни странно, подходит.

      Глобальная опечатка: relaytime не существует, есть relatime, это сокращение от relative access time.

      Изменение производительности может быть не сильно заметно на очень быстрых современных дисках (таких как NVME или Fast SSD), но там есть небольшой прирост. This performance tweak might not be very noticeable on very fast modern drives (like NVME or a fast SSD), but there's still a little boost there.


      Fast SSD надо было перевести, а не оставлять как есть.
        +1
        Переводить userspace как «пользовательские приложения» тоже так себе идея, юзерспейс это вполне себе самостоятельный термин, не требующий перевода имхо.
          +1
          Кажется, вы сейчас попытались обучить нейросеть гуглтранслейта, а не переводчика.
          (в том смысле что в статье больше работы гугл тренслейта чем работы того, кто правил гугловый перевод)
          0
          noatime,nodiratime везде ставлю
            0
            А как удалять файлы к которым не было обращений больше некоторого времени?
              0
              logrotate [наверное] как-то разбирается, по размеру например, что ещё на ум приходит?
              в /tmp можно по mtime смотреть, что-то специфичное конечно можно придумать, что сломается…
                0
                mtime не меняется при чтении файла.
                Что специфического, к примеру, в кеше? В файлах сессий на диске? Ну и тд.
                С одной стороны это все мелочи, с другой стороны когда кеш занимает 5-6Т или файлы сессий исчисляются сотнями тысяч наличие возможности чистить по активности приобретает некоторую полезность.
                  0
                  Да я не спорю, на отдельном разделе под нужды смысл может и есть. Пытался тут вспомнить, что может ещё отвалиться на системе дома? ccache другой механизм вроде использует, squid вспомнился — у него пишут, что тоже другой механизм.
                    0
                    Так и я не ради спора. Тоже интересно что может отвалиться.
                    Вариант файловой свалки для себя или локалки, это можно счить для дома?
                      0
                      за много лет всё цело, но у меня и разнообразия не много) кстати раньше вспоминается, что с atime updatedb прямо так тяжко пыхтел…
              0
              Если указан noatime, то нет смысла указывать nodiratime — до него просто не дойдёт проверка.
              +2
              Спасибо за перевод.

              Статья вредная конечно. Были бы бенчмарки, статьи бы не было. Давным-давно noatime действительно имел смысл, но не сейчас.
                0

                А он вообще не по умолчанию ставится (в debian) к примеру?

                  0
                  noatime? В debian точно нет.
                +1

                Прямо первый абзац выглядит как антиреклама дистрибутиву, каждый раз всё стираю и ставлю заново :) вот зачем? Ладно я не в курсе как там в fedora (и rhel) но выглядит очень странно, вот за всё те годы что на домашнем компе стоит debian (лет 10) он не разу не переустанавливался, при этом менялись загрузочные диски (по пути hdd -dmraid hdd — ssd ) менялись окружения рабочего стола менялись пользователи но как была та первая установка так и осталась, и да конечно уже не помню был ли там noatime сразу или нет, но почему-то кажется что он был из коробки :)

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое