Данная статья является переводом той части статьи
на KernelNewbies, которая описывает особенности файловой системы Ext4.
Последний раздел статьи, об использовании Ext4, уже на Хабре публиковался.

Ext4 — это результат эволюции Ext3, наиболее популярной файловой
системы в Linux. Во многих аспектах Ext4 представляет собой больший шаг
вперёд по сравнению с Ext3, чем Ext3 была по отношению к Ext2. Наиболее
значительным усовершенствованием Ext3 по сравнению с Ext2 было
журналирование, в то время как Ext4 предполагает изменения в важных
структурах данных, таких как, например, предназначенных для хранения
данных файлов.

Это позволило создать файловую систему с более продвинутым дизайном,
более производительную и стабильную и с обширным набором функций.
в этом документе.

6. Отложенное распределение

Отложенное распределение
представляет собой способ повышения производительности, не влияющий на
формат данных и представленный в современных файловых системах, таких
как XFS, ZFS, btrfs и Reiser 4.

Суть этого метода состоит в отсрочке выделения блоков насколько это
возможно — по контрасту с подходом, применямым в традиционных файловых
системах (таких как Ext3, reiser3 и т. д.): распределять блоки сразу,
при первой возможности. Например, если процесс осуществляет запись
вызовом write(), файловая система распределит блоки под запись
немедленно — даже если данные пока не будут записываться на диск, а
будут находиться какое-то время в кэше. Недостатки такого подхода,
например, в том, что, если процесс непрерывно осуществляет запись в
растущий файл, последовательные вызовы write() постоянно распределяют
блоки данных, и при этом неизвестно, будет ли файл расти далее.

При использовании отложенного распределения блоки сразу не выделяются
при обращении к write(). Вместо этого распределение откладывается до
момента, когда файл будет записан из кэша на диск. Благодаря этому
механизм получает возможность оптимизировать процесс распределения.
Наибольший выигрыш получается при использовании двух ранее упомянутых
возможностей — экстентов и многоблочного распределения, поскольку часто
встречается ситуация, когда окончательный файл пишется на диск в виде
экстентов, распределённых с помощью mballoc. Это даёт существенный
прирост производительности, и иногда сильно снижает фрагментированность
данных.

7. Быстрый fsck

Fsck — это очень медленная операция, особенно это касается её первой стадии, проверки всех inodes в файловой системе.

В Ext4 после inode-таблицы каждой группы хранится список
неиспользованных inodes (снабжённый для надёжности контрольной суммой),
поэтому fsck такие inodes не будет проверять. Результатом является
уменьшение времени проверки от 2 до 20 раз, что зависит от количества
используемых inodes (см. http://kerneltrap.org/Linux/Improving_fsck_Speeds_in_Ext4).

То, что список неиспользуемых inodes составляется fsck, а не Ext4,
будет хорошо заметно, если вы запустите fsck, чтобы он построил список
неиспользуемых inodes, и когда только следующий запуск fsck пройдёт
быстрее (запуск fsck всё равно необходим при конвертировании Ext3 в
Ext4).

Кроме того, на ускорение fsck влияет и другая особенность — «гибкие
группы блоков», также они ускоряют и другие файловые операции.

8. Контрольные суммы журнала

Журнал является наиболее часто используемой частью диска, вследствие
чего блоки, из которых он состоит, становятся особенно чувствительными
к отказам оборудования. Более того, попытка восстановления при
повреждённом журнале может привести к ещё более массовым повреждениям в
данных. Ext4 подсчитывает контрольные суммы журнальных данных, что
позволяет определить факт их повреждения. У этого есть и ещё одно
преимущество: благодаря контрольным суммам можно превратить систему
двухфазной фиксации журнала Ext3 в однофазную, что ускоряет файловые
операции в отдельных случаях до 20 %, таким образом, улучшаются
одновременно и надёжность, и производительность.

Примечание: часть, отвечающая за производительность — асинхронное
протоколирование, — сейчас по умолчанию отключена, и будет включена в
одном из последующих релизов, когда удастся добиться надёжной его
работы.

9. Режим без журналирования

Журналирование обеспечивает целостность файловой системы путём
протоколирования всех происходящих на диске изменений. Но оно также
вводит дополнительные накладные расходы на дисковые операции. В
некоторых особых ситуациях журналирование и предоставляемые им
преимущества могут оказаться излишними. Ext4 позволяет отключить
журналирование, что приводит к небольшому приросту производительности.

10. Онлайн-дефрагментация

Эта функция пока в разработке и будет включена в один из будущих релизов.

Хотя отложенное и многоблочное распределение и экстенты помогают
уменьшить фрагментированность файловой системы, со временем она
всё-таки может вырасти.

Например: вы создаёте три файла в одном каталоге и они расположены на
диске друг за другом. Потом, однажды вы решаете обновить второй файл, и
при этом файл становится несколько больше — так, что места для него
становится недостаточно. При этом нет никаких других решений, кроме как
отделить не вмещающийся фрагмент файла и положить его на другое место
диска или выделить файлу последовательную область диска большего
размера в другом месте, вдалеке от первых двух файлов, что приведёт к
перемещениям головки диска, если приложению потребуется считать все
файлы в каталоге (скажем, менеджер файлов будет создавать эскизы для
файлов изображений).

Помимо этого, файловая система может заботиться только об определённых
типах фрагментации и она не может знать, например, что она должна
хранить все файлы, требуемые при загрузке, рядом друг с другом,
поскольку она просто не знает, какие из них требуются при загрузке.
Чтобы решить эту проблему, Ext4 будет поддерживать
онлайн-дефрагментацию.

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

11. Улучшения, связанные с inode

Бóльшие inodes, наносекундные временные метки, быстрые расширенные атрибуты, резервирование inodes…

  • Бóльшие inodes: Ext3 поддерживает inodes настраиваемого размера
    (путём указания mkfs параметра -I), однако размер inode по умолчанию —
    128 байт. В Ext4 он будет 256 байт. Это потребовалось, чтобы вместить
    несколько дополнительных полей (таких как наносекундные временные метки
    и версии inode), а оставшееся в inode место будет использовано для
    хранения тех расширенных атрибутов, которые достаточно малы, чтобы там
    поместиться. Это позволит сделать доступ к таким атрибутам намного
    быстрее и улучшит производительность приложений, использующих их, в
    3­—7 раз.
  • Суть резервирования inode состоит в выделении нескольких inodes при
    создании каталога в ожидании того, что они будут использованы в
    будущем. Это улучшает производительность, потому что вновь создаваемые
    в этом каталоге файлы смогут использовать зарезервированные inodes.
    Поэтому создание и удаление файлов производится более эффективно.
  • Наносекундные временные метки (nanosecond timestamps) означают, что
    такие поля inode как, например, время модификации получают
    наносекундную точность (в Ext3 она была равна секунде).

12. Устойчивое прераспределение

Эта возможность, доступная уже в Ext3 в последних версиях ядра и
эмулируемая glibc в файловых системах, которые её не поддерживают,
позволяет приложениям заранее распределять дисковое пространство,
сообщая о своих потребностях файловой системе. Та, в свою очередь,
выделяет необходимое количество блоков и структур данных, но они пусты
до тех пор, пока приложение в реальности не осуществит в них запись.

Это именно то, что делают, например, P2P-приложения, выделяя место для
данных, которые появятся там только спустя часы или дни. Однако
реализовано это намного более эффективно — на уровне файловой системы и
с универсальным API.

Применений этому несколько: во-первых, чтобы предотвратить выполнение
того же самого приложениями (такими как P2P), неэффективно заполняющими
файлы нулями — нужные блоки будут выделены разом.

Во-вторых, чтобы снизить фрагментацию — опять же потому, что блоки
выделяются однократно, настолько непрерывно, насколько это возможно.

В-третьих, чтобы гарантировать, что приложение будет иметь столько
места, сколько ему требуется, что особенно важно для приложений,
работающих в реальном времени, поскольку файловая система может вдруг
переполниться в процессе выполнения важной операции.

Эта возможность доступна через интерфейс libc posix_fallocate().

13. Механизм «шлагбаумов» по умолчанию включен

Это опция, обеспечивающая целостность файловой системы ценой некоторой
потери производительности (её можно отключить с помощью «mount -o
barrier=0», рекомендуется сделать это при замерах производительности).

Выдержка из статьи LWN:
«Код файловой системы обязан перед созданием записи фиксации [журнала]
быть абсолютно уверенным, что вся информация о транзакции помещена в
журнал. Просто делать запись в правильном порядке недостаточно;
современные диски имеют кэш большого объёма и меняют порядок записи для
оптимизации производительности. Поэтому файловая система обязана явно
сообщить диску о необходимости записать все журнальные данные на
носитель перед созданием записи фиксации; если сначала будет создана
запись фиксации, журнал может быть повреждён. Блокирующая система
ввода-вывода ядра предоставляет такую возможность благодаря
использованию механизма «шлагбаумов» (barriers); проще говоря,
«шлагбаум» запрещает запись любых блоков, посланных после него, до того
момента, как всё, что было прислано перед «шлагбаумом», будет
перенесено на носитель. При использовании «шлагбаумов» файловая система
может гарантировать, что всё, что находится на диске, целостно в любой
момент времени».

Комментарии закрыты.

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 Текст перед ссылками: французская рулетка онлайн в лучшем казино . Текст после ссылок: