По какой причине неудобно использование файловой системы
У каждого иногда встает вопрос какую же файловую систему выбрать и для чего? У меня тоже был выбор конфигурации, и после прогона тестов стало интересно, чем же отличается одна файловая система от другой? В чем различие? Каковы их плюсы и минусы? В чем преимущество одной файловой системы перед другой?
К сожалению, информации по этой теме крайне мало, тем более на русском языке. Поэтому я решила рассмотреть этот вопрос и собрать все воедино.
Рассматриваются только файловые системы семейства linux. Так что, кого это также заинтересовало, прошу под кат.
Прежде всего, разные тесты показывают разные результаты(так как разные тесты и проводятся по-разному), поэтому нельзя быть полностью обьективной, ссылаясь на цифры. Это необходимо учесть.
Были иcпользованы bonnie++ и postmark. Я не буду приводить результаты, так как мне делать этого не следует (это не паблик тесты, я не думаю, что имею право их выкладывать, прошу меня извинить). Поэтому ограничусь небольшими выводами.
Лидирует по производительности ext2, несильно отстает jfs, затем идет reiserfs, ext3, и с небольшим отрывом xfs.
Если сравнивать наиболее распространенные файловые системы между собой, то выходит следующее:
потеря производительности для xfs по мере добавления промежуточных уровней device mapper'a менее существенна, чем для ext3.
ext3 — обычная, вылизанная до блеска, файловая система, сравнительно простая во внутренней организации, за счет чего не особо эффективная. Поддерживается всем, чем угодно, совместима с ext2. Обычно ставится по умолчанию именно по этим причинам. К тому же, невелик риск потерять что-либо.
xfs — более сложная, более эффективная в работе с большими по размеру файлами, хорошо работает с большими по объему каталогами на чтение и поиск в них. Эффективно реализована поддержка ACL. Невысокая нагрузка на процессор.
Особенности при работе LVM2 — размер файловой системы ext3 можно как увеличивать, так и уменьшать, но лишь при отмонтированной файловой системе, в отличии от xfs, которую можно лишь увеличивать, но на смонтированной файловой системе, то есть, не прерывая работу с ней.
При работе с xfs жизненно необходим ups, и не рекомендуется держать на ней корневую файловую систему, так как xfs считает, что содержимое находившихся открытыми на запись файлов при некорректном прерывании работы системы не определено, и она заполняет эти файлы нулями. (смертельно для базы данных)
ext2 — та же ext3, только без поддержки журналирования, за счет чего работает быстрее.
jfs дает хороший прирост в скорости работы. Плюс этой файловой системы в том, что возможно восстановить данные с поврежденного тома, или же стертые данные, в отличии от ext3, но при этом, jfs не сохраняет данные о стертых каталогах а файлах, что затруднит поиск. Нет ограничений на количество файлов. Одинаково производительна как на файлах малого обьема, так и на файлах большого обьема. fsck работает очень быстро. Минимальная нагрузка на процессор, оптимизирована для работы в многопроцессорной среде. Раздел можно лишь увеличить. Идеально подходит для хранения корневой файловой системы.
reiserfs — не доработанная до конца, и нынче не развиваемая, файловая система, т.к. ее разработчик находится в тюрьме. reiserfs достаточно быстрая файловая система, но при условии, что файлы будут иметь небольшой размер. Недостатки — высокая нагрузка на процессор, нередки случаи безвозвратной потери информации при крахе файловой системы. Можно использовать для какого-нибудь кэша.
На этом, в общем-то, все. Приятного всем дня
ps: адекватные люди подсказали, что на хабре уже был краткий обзор фс. Выкладываю его ссылку сюда.
Рядовому пользователю компьютерных электронных устройств редко, но приходится сталкиваться с таким понятием, как «выбор файловой системы». Чаще всего это происходит при необходимости форматирования внешних накопителей (флешек, microSD), установке операционных систем, восстановлении данных на проблемных носителях, в том числе жестких дисках. Пользователям Windows предлагается выбрать тип файловой системы, FAT32 или NTFS, и способ форматирования (быстрое/глубокое). Дополнительно можно установить размер кластера. При использовании ОС Linux и macOS названия файловых систем могут отличаться.
Возникает логичный вопрос: что такое файловая система и в чем ее предназначение? В данной статье дадим ответы на основные вопросы касательно наиболее распространенных ФС.
Практический пример использования файловых систем
Владельцы мобильных гаджетов для хранения большого объема информации используют дополнительные твердотельные накопители microSD (HC), по умолчанию отформатированные в стандарте FAT32. Это является основным препятствием для установки на них приложений и переноса данных из внутренней памяти. Чтобы решить эту проблему, необходимо создать на карточке раздел с ext3 или ext4. На него можно перенести все файловые атрибуты (включая владельца и права доступа), чтобы любое приложение могло работать так, словно запустилось из внутренней памяти.
Операционная система Windows не умеет делать на флешках больше одного раздела. С этой задачей легко справится Linux, который можно запустить, например, в виртуальной среде. Второй вариант - использование специальной утилиты для работы с логической разметкой, такой как MiniTool Partition Wizard Free . Обнаружив на карточке дополнительный первичный раздел с ext3/ext4, приложение Андроид Link2SD и аналогичные ему предложат куда больше вариантов.
Флешки и карты памяти быстро умирают как раз из-за того, что любое изменение в FAT32 вызывает перезапись одних и тех же секторов. Гораздо лучше использовать на флеш-картах NTFS с ее устойчивой к сбоям таблицей $MFT. Небольшие файлы могут храниться прямо в главной файловой таблице, а расширения и копии записываются в разные области флеш-памяти. Благодаря индексации на NTFS поиск выполняется быстрее. Аналогичных примеров оптимизации работы с различными накопителями за счет правильного использования возможностей файловых систем существует множество.
Надеюсь, краткий обзор основных ФС поможет решить практические задачи в части правильного выбора и настройки ваших компьютерных устройств в повседневной практике.
Сегодня при инсталляции Windows 2000, или Windows XP перед тобой неизменно встает вопрос: "Какую файловую систему предпочесть - FAT 32 или NTFS?". И многие, решив, что "с FAT я уже знаком" останавливают свой выбор именно на FAT32. Да что далеко ходить - даже в X в одной из статей автор писал, что "при установке Win 2000 я оставил FAT32, потому что на ней система работает быстрее"… Что здесь неправильно? Да то, что быстрее она работать попросту не может… Так что тебе, чтобы не повторять подобных ошибок, было бы полезно хотя бы понимать "как все устроено". Надеюсь этот краткий обзор тебе поможет - мы рассмотрим FAT16, FAT32 и NTFS.(FAT16 полезно рассмотреть по той
причине, что от FAT32 ее отличает очень не многое и полезно эти отличия хотя бы знать).
Файловая система FAT работает с единицами дискового пространства, называемыми кластер. Каждый кластер может включать один или несколько секторов жесткого диска (твой хард обычно разбит на сектора по 512 байт). Из чего следует, что минимальный размер кластера - 512 байт. Для хранения одного файла можно использовать один или несколько кластеров. Каждому кластеру диска в таблице FAT соответствует отдельная запись, которая либо указывает на следующий кластер файла, либо содержит метку конца файла. В составе каждого каталога хранятся имена входящих в него файлов. Вместе с именем файла хранится указатель на первый кластер этого файла. Помимо этого в каталоге хранится дата создания файла, его размер и атрибуты. Атрибуты могут указывать на то, что файл является скрытым, зарезервированным для использования операционной системой, требует архивирования (резервного копирования) или предназначен только для чтения.
Это теория, а теперь недостатки: ты никогда не задумывался, что значит "16" в названии файловой системы? А значат они то, что таблица размещения файлов FAT (File Allocation Table) идентифицирует записи, соответствующие дисковым кластерам, при помощи 16-разрядных чисел. Таким образом, в таблице можно разместить не более 65 536 записей (2 в 16-ой степени). А если учитывать то, что максимальный размер кластера - 32 Кбайта, то выходит, что максимальный раздел дискового тома - 2 Гбайта. У тебя логические диски на винте наверное ГОРАЗДО большего размера? Это недостаток номер "раз"(хотя надо отметить, что FAT32 этот недостаток почти что преодолела). Недостаток номер два - это то, что для хранения ВСЕХ файловых атрибутов система FAT использует всего 1 байт. Как ты думаешь много ли можно засунуть в один байт? Правильно именно по этой причине нельзя хранить ни сведения о праве доступа к файлу, ни о его владельце… Недостаток номер "три" кроется в том, что при использовании FAT больший размер дискового тома означает больший размер кластера, а одна из главных "невкусностей FAT" - это то, что один файл = как минимум один кластер. Пример: имеем размер кластера 32 Кбайта и файл размером в 2 Кбайта - в результате файл занимает весь кластер, т.е. мы теряем 30 Кбайт…Примерно тоже самое получится, если файл будет размером 34 Кбайта - тогда он займет два кластера и во втором мы опять потеряем 30 Кбайт… Недостатки номер "четыре и пять" - сведения о физическом расположении файлов хранятся в одном месте - таблице размещения файлов FAT, что: а) увеличивает вероятность повреждения и потери всей информации; б) снижает скорость поиска, т.к. для поиска определенного файла нужно обработать всю таблицу.
Нужно признать, что FAT16 создавалась давно, во времена MS-DOS и требованиям того времени вполне удовлетворяла…
Эта файловая система пришла на смену FAT16. Если ты внимательно читал предыдущий параграф, то уже понял, что ее отличие в том, что таблица размещения файлов FAT (File Allocation Table) идентифицирует записи, соответствующие дисковым кластерам, при помощи 32-разрядных чисел. В соответствии с этим максимальное количество записей становится равным 4 294 967 296 (2 в 32-ой степени). В связи с чем максимальный размер дискового тома существенно увеличивается (до 2 Тбайт). Однако это позволяет преодолеть лишь недостаток номер "раз", однако все остальные - увы остаются… И что особенно обидно для владельцев небольших винтов - нерациональное расходование дискового пространства… а также частые повреждения разнообразной природы и т.д. Скандиск у любителей FAT не знает, что такое отдых….
Расшифровывается как New Technology File System - как ты наверное понял из названия - это круто и здорово… и причем это не только слова! По сравнению с FAT файловая система NTFS обладает куда более сложной структурой и куда более широкими
возможностями. В отличии от FAT, файловая система NTFS не хранит всю информацию о расположении файлов в одном месте. Вместо этого сведения о распределении дискового пространства между файлами сохраняются в составе специальных пакетов, которые могут располагаться в любом месте раздела
(помнишь недостаток "четыре" у системы FAT?). Структура каталогов NTFS также отличается от структуры каталогов FAT. Дисковые каталоги NTFS лучше приспособлены для осуществления поиска файлов, так как записи о файлах сохраняются с использованием бинарного дерева, а не простого линейного списка (как это было в FAT). Это означает, что для того, чтобы обнаружить файл, требуется проанализировать меньшее количество записей (теперь подумай прав ли автор, которого я упомянул вначале статьи). А если к этому еще прибавить возможность индексирования, то система будет просто летать!
Файловая система NTFS обладает встроенной поддержкой длинных имен и расширяемых файловых атрибутов. Благодаря этому разделы NTFS могут хранить информацию, связанную с защитой файлов (например, списки ACL), аудитом доступа к файлам, а также сведения, связанные с правами на владение файлами. (теперь, ты можешь поставишь запрет на доступ к каталогу с порнушкой для всех, кроме себя и тебя не
понадобиться для этого какие-либо дополнительные проги, которых так много расплодилось для Win9X c ее FAT32!)
Если при использовании FAT самое лучшее на что ты мог рассчитывать - это то, что файл будет занимать на диске не более, чем собственный размер, то при использовании NTFS можешь об этом забыть! В NTFS минимальная единица равна сектору жесткого диска и один файл не означает один кластер! Помимо этого файловая система поддерживает атрибут, позволяющий осуществлять индивидуальную компрессию файлов и каталогов. Пример: У меня есть каталог размером 80 мегабайт. После компрессии он занимает на диске 30 мегабайт "c кепкой"…
Новые возможности NTFS5 и Windows 2000 позволяют
задействовать архитектуру открытых ключей
для шифрования файлов, каталогов или томов
с помощью EFS. Кроме того наверняка всех
порадует возможность монтирования. С
помощью данной фишки можно подсоединить
любой диск/хард в любое место файловой
системы - например папку C:\XXX\ назначить на
твой логический диск Р: (что значит порно :).
Ну и в довершение всего NTFS поддерживает ОЧЕНЬ большие диски - до 16 экзабайт. (экзабайт - это 1 073 741 824 Гигабайт). Простой пример: Если жесткий диск способен записать 1 мегабайт данных в секунду, то для того, чтобы записать один экзабайт (заметь один, а не шестнадцать), ему потребуется 1000 миллиардов секунд. В одном году 3 миллиона секунд. Следовательно, чтобы сохранить один экзабайт данных потребуется 300 000 лет… Я тут слышал, что собираются запустить корабль к ближайшей звезде - Альфа-Центавра. Предполагают, что он долетит туда за 200 лет…
Итак, если ты идешь в ногу со временем, то твой выбор - NTFS. Но не забывай, что за всеми ее "вкусностями" таится одна проблема - ее из под DOS не видно. Поэтому раньше те, кто боялся падения системы на NTFS не переходили. Но это было раньше! Теперь с приходом Windows 2000 появилась новая возможность - "консоль восстановления", которая позволить тебе получить доступ к разделу NTFS, даже если операционка повреждена. Установить сие чудо довольно просто: после установки ОСи, просто запусти программу установки заново с ключом "/cmdcons", после чего консоль восстановления добавится в меню выбора операционной системы.
Ну а если тебе по душе старое и простое - то FAT создан именно для тебя….
Если карта вообще хоть где-то работает (т. е. исправна физически), проблема может быть в файловой системе. Дело в том, что стандартной для SD-карт (не SDHC) является FAT16, и большинство устройств, рассчитанных на эти карты, никаких других «не понимают». Впрочем, обычно они при этом хотя бы сообщают, что карта не отформатирована, и предлагают выполнить означенную операцию, но если это не получается, придется воспользоваться картоводом и отформатировать карту при помощи компьютера.
Недавно купил б/у внешний винчестер. Он прекрасно работает на всех компьютерах с Windows Seven, но виден лишь на части машин с Windows Vista и Windows XP. Почему?
Судя по всему, предыдущий владелец отформатировал накопитель под exFAT. Поддержка этой системы является штатной для Seven, а вот для Vista требует наличия как минимум первого сервис-пака. На XP же нужно ставить опциональный апдейт KB955704 (приведена ссылка на английскую версию — для систем с русским или иным базовым языком его можно выбрать самостоятельно). Учтите, что способов «увидеть» накопитель с exFAT под более старыми версиями Windows нет (по крайней мере, нам они не известны), да и с другими операционными системами или бытовой техникой дело обстоит немногим лучше, так что если вопрос совместимости для вас важен, лучше выбрать другую файловую систему.
Внешний винчестер прекрасно работает (по крайней мере, читается) на всех компьютерах с Windows 2000/XP/Vista, Linux, MacOS, но у моих родственников есть старый компьютер с Windows ME — он этот накопитель вообще не видит. Почему?
Судя по симптомам, ВЖД отформатирован под NTFS, а все системы линейки Windows 9x понимают только FAT32 (оригинальная Windows 95 — так и вовсе только FAT16). В данном случае у вас два пути. Первый: если компьютеры со старыми версиями Windows на вашем пути встречаются лишь эпизодически, и все места, где они встречаются, вам известны, на них можно установить специальный драйвер для работы с NTFS (особенно это удобно, если данные нужно переносить только на эти компьютеры, но не обратно — драйверы с поддержкой только чтения бесплатны, да и по вполне понятным причинам ничего на внешнем диске не испортят). Второй: если просто нужна совместимость с Windows 9x везде и всюду, накопитель стоит отформатировать под FAT32. Учтите только, что если его емкость более 120 ГБ, делать это нужно исключительно на компьютере с новой версией Windows, причем на этом пути есть некоторое количество подводных камней, рассмотренных в следующих вопросах. Да, и еще — если речь идет не о МЕ, а о Windows 98/98SE, то для начала вам придется установить на компьютер отдельный драйвер для поддержки USB-накопителей, поскольку эти системы изначально протокол UMS не поддерживают. Если это 98SE, а накопитель снабжен не только USB, но и FireWire, имеет смысл использовать именно этот интерфейс — дополнительные драйверы не потребуются.
Попробовал записать файл размером 4,7 ГБ (ISO-образ DVD-диска) на свежекупленный USB-винчестер. Информации на нем нет, емкость 500 ГБ, однако система сообщает, что места недостаточно для завершения операции. Почему?
По-видимому, вы столкнулись с ограничением FAT32 на размер файлов. Проверьте — какая файловая система на винчестере (под Windows для этого выберите его в папке «Мой компьютер», нажмите правую кнопку мыши и выберите «Свойства»). Если это FAT32, то записать такой большой файл не получится — нужно либо разбивать файл на части (например, при помощи архиватора), либо переформатировать накопитель под другую файловую систему.
Хочу отформатировать внешний винчестер под FAT32, дабы его увидел DVD-плеер, однако система предлагает только NTFS (или NTFS и exFAT). Почему?
Политика компании Microsoft такова — FAT32 только для дисков, меньших чем 32 ГБ. Поэтому штатными средствами Windows 2000 и более новых отформатировать больший накопитель под FAT32 не получится, хотя сама система спокойно работает с томами FAT32 емкостью до 2 ТБ. Очень часто производители винчестеров и флэш-накопителей предлагают для скачивания утилиты форматирования, лишенные этого ограничения. Если для вашего устройства таковой нет, поможет бесплатная консольная программа fat32format, которую несложно найти в интернете.
Купил флэш-накопитель на 64 ГБ, подключил к компьютеру с Windows XP. Хочу его отформатировать, однако при выборе из контекстного меню опции «Форматировать» мне не предлагают никакой файловой системы, так что выполнить операцию невозможно. Почему?
Немного смешная, но вполне реальная ситуация :) Дело в том, что, с точки зрения Microsoft, форматировать устройство емкостью более 32 ГБ под FAT32 нельзя, а под NTFS по умолчанию нельзя форматировать сменное устройство — других же файловых систем Windows XP по умолчанию «не знает». Соответственно, у вас три варианта действий: воспользоваться советом по форматированию большого накопителя под FAT32, воспользоваться расположенным ниже советом по форматированию флэшки под NTFS или установить на компьютер обновление с поддержкой exFAT и отформатировать устройство под эту файловую систему.
Как отформатировать флэшку под NTFS на компьютере под управлением Windows XP?
По умолчанию штатные утилиты не поддерживают форматирование сменных накопителей под NTFS, если для них включена оптимизация для быстрого удаления (извлечения устройства). Для изменения политики откройте свойства накопителя в диспетчере устройств, выберите там закладку «Политика» и установите переключатель в положение «Оптимизировать для выполнения» — после этого NTFS появится в списке доступных файловых систем в диалоге форматирования. Альтернативный вариант — воспользоваться сторонней утилитой, однако переключить политику рекомендуется все равно: без этого кэширование записи полноценно работать не будет, что уменьшит производительность. Заметим, что Windows Vista или Seven такого ограничения не накладывают, всегда предлагая NTFS в качестве возможного способа форматирования (причем любые другие варианты при определенных типе и емкости накопителя могут и отсутствовать).
Как отформатировать устройство под exFAT на компьютере с Windows XP? Обновление стоит, однако найти такую возможность не могу.
К сожалению, выпущенное компанией Microsoft обновление для Windows XP нельзя назвать совсем полноценным — оно не заменяет консольную программу format и не модифицирует стандартное средство «Управление дисками». Поэтому форматировать накопитель под exFAT можно только при помощи контекстного меню диска, причем даже в этом случае нет возможности вручную выбрать размер кластера.
Как отформатировать под exFAT внешний винчестер или флэшку с интерфейсом eSATA на компьютере под управлением Windows Vista/Seven?
По неизвестной прогрессивной науке причине, компания Microsoft оставила в GUI-утилитах этих систем возможность форматирования под exFAT только для сменных устройств, но не для внутренних винчестеров, а eSATA-устройства рассматриваются системой как внутренние. Варианта два: либо подключите накопитель к USB, если есть такая возможность, либо воспользуйтесь утилитой format с ключом /FS:exFAT из командной строки (выполняться сеанс должен обязательно с правами администратора — UAC не поможет).
Недавно купил себе MacBook. Подключил к нему внешний винчестер. Все файлы видны, скопировать их на Mac могу, но ничего записать не получается. Почему?
Судя по всему, винчестер отформатирован под NTFS — MacOS работает с такими накопителями только на чтение. Вы можете либо установить специальный драйвер с поддержкой записи (например, выпущенный компанией Paragon), либо переформатировать винчестер под другую файловую систему.
Почему-то не работает Time Machine с USB-винчестером. Мне нужно поменять его на специальную версию «for Mac» или есть другие варианты?
Time Machine совместима только с дисками, отформатированными под HFS+. Менять винчестер не обязательно — достаточно его просто переформатировать подобающим образом (что по умолчанию выполнено для «маковских» версий). Если необходимо будет получить доступ к винчестеру и на компьютере с Windows, следует установить туда один из имеющихся драйверов для поддержки HFS+.
ОС Windows долгое время попрекали за медлительность её файловых операций и медленное создание процессов. А почему бы не попробовать сделать их ещё более медленными? Эта статья покажет способы замедления файловых операций в Windows примерно в 10 раз от их нормальной скорости (или даже больше), причём способы эти практически не поддаются отслеживанию обычным пользователем.
А ещё, конечно же, мы научимся подобные ситуации обнаруживать и исправлять. Весь текст написан на основе проблемы, с которой я столкнулся пару месяцев назад, так что всё, написанное ниже, полностью реально.
Зачем такой большой буфер?
Документация для FileSystemWatcher рекомендует не использовать большой буфер, но не вдаётся в подробности о том, чем это грозит. На машинах разработчиков Chrome достаточно много оперативной памяти, так что когда однажды очень частые файловые операции (баг в ядре Windows, о котором я писал ранее) привели к переполнению ранее использованного буфера в 16 КВ, его просто значительно увеличили. И это, на первый взгляд, помогло. По крайней мере тогда, для решения той проблемы. Хотя и замедлило файловые операции во много раз.
Когда автор расширения VsChromium узнал о проблеме, он решил уменьшить буфер обратно и обрабатывать ошибки его переполнения более изящно (временно приостанавливая мониторинг).
Ирония данной ситуации состоит в том, что большинство затрат ресурсов здесь (вызовы memset, отказы страниц, обнуление) случаются потому, что две разных части ядра ОС не достаточно хорошо общаются друг с другом. Система нотификаций запрашивает память, получает её (уже обнулённую) и снова пытается её обнулить. Если бы она знала, что память уже обнулена — то не пыталась бы сделать это во второй раз, и не было бы лишних отказов страниц, и жизнь была бы куда лучше. Эй, Microsoft, у меня есть классная идея о том, как сделать систему нотификаций об изменениях файловой системы лучше!
Медленное удаление файлов
Снова и снова собирая из исходников Chromium, я заметил, что очистка директории с результатами сборки стала занимать несколько минут — это довольно значительная часть цикла сборки. Я был уверен, что это должно происходить быстрее. Я также заметил, что данной проблемы не случается, если в момент удаления данных файлов не запущена Visual Studio.
Профилирование с помощью ETW не показало явного виновника происходящего, но дало несколько подсказок, которые привели меня к мысли, что дело может быть в VsChromium — расширении для Visual Studio, которое делает работу над проектом Chromium в Visual Studio несколько удобнее. Одной из важных его фич является загрузка всего исходного кода проекта в оперативную память (для дальнейшего быстрого поиска). В случае Chromium это несколько гигабайт RAM, но зато поиск работает за милисекунды. Мне это расширение очень помогает в работе, но десятикратное замедление файловых операций — не та цена, которую я готов за это платить.
Другие полезные ссылки
Увеличение размера буфера в VsChromium случилось вот в этом коммите, который вошел в билд 0.9.26. Обратное уменьшение случилось вот в этом комите, который вошел в версию 0.9.27.
Я рекомендую всем пользователям VsChromium обновиться до последней версии.
ETW-трейсы и упомянутый в статье скрипт на Python можно скачать вот здесь. Он создаёт и удаляет файлы дважды, один раз в директории под наблюдением VsChromium, и второй раз в ненаблюдаемой директории, с полусекундной паузой. Для воспроизведения эксперимента из статьи вам, конечно, понадобиться соответствующая версия VsChromium, настроенная на мониторинг нужной папки.
А в следующей статье я расскажу о том, как Microsoft позволяет вам иногда случайно создать N процессов за O(N^2) времени.
Что такое файловая система
Обычно вся информация записывается, хранится и обрабатывается на различных цифровых носителях в виде файлов. Далее, в зависимости от типа файла, кодируется в виде знакомых расширений – *exe, *doc, *pdf и т.д., происходит их открытие и обработка в соответствующем программном обеспечении. Мало кто задумывается, каким образом происходит хранение и обработка цифрового массива в целом на соответствующем носителе.
Операционная система воспринимает физический диск хранения информации как набор кластеров размером 512 байт и больше. Драйверы файловой системы организуют кластеры в файлы и каталоги, которые также являются файлами, содержащими список других файлов в этом каталоге. Эти же драйверы отслеживают, какие из кластеров в настоящее время используются, какие свободны, какие помечены как неисправные.
Запись файлов большого объема приводит к необходимости фрагментации, когда файлы не сохраняются как целые единицы, а делятся на фрагменты. Каждый фрагмент записывается в отдельные кластеры, состоящие из ячеек (размер ячейки составляет один байт). Информация о всех фрагментах, как части одного файла, хранится в файловой системе.
Файловая система связывает носитель информации (хранилище) с прикладным программным обеспечением, организуя доступ к конкретным файлам при помощи функционала взаимодействия программ A PI. Программа, при обращении к файлу, располагает данными только о его имени, размере и атрибутах. Всю остальную информацию, касающуюся типа носителя, на котором записан файл, и структуры хранения данных, она получает от драйвера файловой системы.
На физическом уровне драйверы ФС оптимизируют запись и считывание отдельных частей файлов для ускоренной обработки запросов, фрагментации и «склеивания» хранящейся в ячейках информации. Данный алгоритм получил распространение в большинстве популярных файловых систем на концептуальном уровне в виде иерархической структуры представления метаданных (B-trees). Технология снижает количество самых длительных дисковых операций – позиционирования головок при чтении произвольных блоков. Это позволяет не только ускорить обработку запросов, но и продлить срок службы HDD. В случае с твердотельными накопителями, где принцип записи, хранения и считывания информации отличается от применяемого в жестких дисках, ситуация с выбором оптимальной файловой системы имеет свои нюансы.
Воспроизведение проблемы
Для написания данной статьи я сэмулировал проблему, написав скрипт на Python, который создаёт и удаляет тысячи файлов в папке, которая находится под наблюдением VsChromium. Запустив данный скрипт, я собрал трейс событий с помощью ETW. Вот график использования процессора в WPA (Windows Performance Analyzer) и таблица с временем (в милисекундах). Всего скрипт работал около 5 секунд:
Кажется обоснованным, что процесс python.exe, который выполняет мой скрипт, использует значительную часть ресурсов CPU. Также понятно, что процесс System тоже будет занят кое-какой работой, поскольку мы занимаемся добавлением и удалением файлов. Кроме того, мы видим в таблице работу расширения VsChromium, поскольку оно наблюдает за той самой папкой, в которой мы создаём и удаляем файлы, а значит должно реагировать на это (добавлять и удалять файлы из индекса). Ну и, наконец, SearchIndexer.exe использует немного ресурсов для индексации новых файлов. Вроде бы всё выглядит неплохо. И всё же — мы знаем, что код работает слишком медленно.
Вот, для контраста, график использования процессора в случае создания и удаления файлов в директории, которая не находится под наблюдением VsChromium. Производительность поднялась почти в 10 раз! Понятное дело, что загрузка от VsChromium.Server.exe и devenv.exe исчезла полностью, но на этом всё не заканчивается. Сам python, выполняющий мой скрипт, также стал работать намного быстрее (время выполнения скрипта упало с 4888 мс до 561 мс). Процесс System вообще ускорился с 2604 мс до 42 мс. Что же здесь происходит?
График CPU Usage (Precise), который основывается на информации о переключении контекстов, даёт хорошую возможность сказать, сколько именно процессорных ресурсов использует тот или иной процесс. Но чтобы понять, на что именно процесс тратит время, нужно воспользоваться графиком CPU Usage (Sampled). Он основан на «снимках» стека вызовов функций (по-умолчанию, сделанным с частотой 1000 раз в секунду).
Этот вид представления данных группирует данные по процессам, затем по потокам, затем по модулям и, наконец, по функциям. В данном случае для процесса python.exe мы видим, что в 4637 снимках из 4904 какая-то работа происходила в модуле ntoskrnl.exe. Это намного больше, чем время выполнения кода в python27.dll (им вообще можно пренебречь).
Углубляясь в исследование того, что делал ntoskrnl.exe, мы видим какие именно функции в нём вызывались:
Чаще всего вызывалась функция выделения памяти MiAllocatePagedPoolPages и функции очистки памяти memset, MiCompletePrivateZeroFault, а также ассоциированные с ними отказы страниц. Кажется немного странным, что в тесте работы файловой системы больше всего ресурсов занимают задачи выделения и очистки памяти, правда? Но подождите, это ещё не всё. Вторым по занятости в системе является процесс System, и занят он (чем бы вы думали?) обнулением только что освобождённых страниц памяти. Что же, всё-таки, происходит?
Вернувшись к анализу снимков колстека процесса python.exe, я поискал функцию memset и нашел её где-то на 70 уровней ниже по колстеку (не удивительно, что раньше я её пропустил). Правый клик на ней, выбираем View Callers-> By Function и видим, что общие затраты на её вызов (включая время выполнения «дочерних функций») составляют примерно половину всей загрузки процессора — 2971 снимок из 4904 сделанных.
Вызывающей функцией практически всегда была FsRtlNotifyFilterReportChangeLiteEx. Правый клик на ней, View Callees-> By Function. Это показало мне, что данная функция выделяла память, вызывала memset для неё и потребляла около 83% процессорного времени в процессе python.exe.
В поисках проблемы
В этом месте моего исследования у меня было несколько, как позже оказалось, неверных догадок. Одна из них касалась частых вызовов wcifs.sys!WcGenerateFileName — я подумал, что генерация имён файлов в формате «8.3» работает слишком медленно, но её отключение ничего не изменило. В конце-концов я остановил свои попытки постичь непостижимые колстеки и вместо этого задумался о том, как работает расширение VsChromium. При загрузке оно просто должно прочесть и загрузить в память всё содержимое файлов в контролируемой папке. Но после этого ему нужно всего лишь отслеживать изменения и я предположил, что оно имеет что-то типа монитора изменений файловой системы. Я знал, что расширение недавно получило обновление и в нём автор увеличил буфер, в котором хранились нотификации об изменениях файлов, с 16 KB до 2 MiB. И почему-то операционной системе это очень не понравилось. Я попробовал откатиться к предыдущей версии расширения (с меньшим буфером) — и это действительно исправило проблему.
Данный буфер выделялся с помощью функции ExAllocatePoolWithTag, а затем заполнялся информацией об изменениях в файловой системе. Для избежания утечки данных из ядра ОС, вся неиспользуемая часть буфера обнулялась. Если буфер достаточно большой, а объём пересылаемой информации относительно мал — обнуление будет занимать большую часть времени. Я добавил провайдер данных ALL_FAULTS (который я нашел, просматривая результат вызова “xperf -providers k”) к моей ETW-сессии чтобы увидеть как часто случались отказы страниц. И это было впечатляюще! Случилось 2,544,578 отказов страниц при попытках обнуления данных, что соответствует 9.7 GiB данных или около 4970 раз по буферу в 2 MiB. Это 4.97 буфера на каждую тысячу созданных и удалённых файлов. Мне подсказали, что VsChromium должен создавать около 5 событий на каждый созданный и удалённый файл, а значит большинство буферов с нотификациями будут содержать лишь одну запись. Вот отказы страниц по процессам и типам:
Файловые системы Windows
Исходный код файловой системы, получившей название FAT, был разработан по личной договоренности владельца Microsoft Билла Гейтса с первым наемным сотрудником компании Марком Макдональдом в 1977 году. Основной задачей FAT была работа с данными в операционной системе Microsoft 8080/Z80 на базе платформы MDOS/MIDAS. Файловая система FAT претерпела несколько модификаций – FAT12, FAT16 и, наконец, FAT32, которая используется сейчас в большинстве внешних накопителей. Основным отличием каждой версии является преодоление ограниченного объема доступной для хранения информации. В дальнейшем были разработаны еще две более совершенные системы обработки и хранения данных – NTFS и ReFS.
FAT (таблица распределения файлов)
Числа в FAT12, FAT16 и FAT32 обозначают количество бит, используемых для перечисления блока файловой системы. FAT32 является фактическим стандартом и устанавливается на большинстве видов сменных носителей по умолчанию. Одной из особенностей этой версии ФС является возможность применения не только на современных моделях компьютеров, но и в устаревших устройствах и консолях, снабженных разъемом USB.
Пространство FAT32 логически разделено на три сопредельные области:
- зарезервированный сектор для служебных структур;
- табличная форма указателей;
- непосредственная зона записи содержимого файлов.
К недостатком стандарта FAT32 относится ограничение размера файлов на диске до 4 Гб и всего раздела в пределах 8 Тб. По этой причине данная файловая система чаще всего используется в USB-накопителях и других внешних носителях информации. Для установки последней версии ОС Microsoft Windows 10 на внутреннем носителе потребуется более продвинутая файловая система.
С целью устранения ограничений, присущих FAT32, корпорация Microsoft разработала обновленную версию файловой системы exFAT (расширенная таблица размещения файлов). Новая ФС очень схожа со своим предшественником, но позволяет пользователям хранить файлы намного большего размера, чем четыре гигабайта. В exFAT значительно снижено число перезаписей секторов, ответственных за непосредственное хранение информации. Функция очень важна для твердотельных накопителей ввиду необратимого изнашивания ячеек после определенного количества операций записи. Продукт exFAT совместим с операционными системами Mac, Android и Windows. Для Linux понадобится вспомогательное программное обеспечение.
NTFS (файловая система новой технологии)
Стандарт NTFS разработан с целью устранения недостатков, присущих более ранним версиям ФС. Впервые он был реализован в Windows NT в 1995 году, и в настоящее время является основной файловой системой для Windows. Система NTFS расширила допустимый предел размера файлов до шестнадцати гигабайт, поддерживает разделы диска до 16 Эб (эксабайт, 10 18 байт ). Использование системы шифрования Encryption File System (метод «прозрачного шифрования») осуществляет разграничение доступа к данным для различных пользователей, предотвращает несанкционированный доступ к содержимому файла. Файловая система позволяет использовать расширенные имена файлов, включая поддержку многоязычности в стандарте юникода UTF, в том числе в формате кириллицы. Встроенное приложение проверки жесткого диска или внешнего накопителя на ошибки файловой системы chkdsk повышает надежность работы харда, но отрицательно влияет на производительность.
ReFS (Resilient File System)
Последняя разработка Microsoft, доступная для серверов Windows 8 и 10. Архитектура файловой системы в основном организована в виде B + -tree. Файловая система ReFS обладает высокой отказоустойчивостью благодаря реализации новых функций:
- Copy-on-Write (CoW) – никакие метаданные не изменяются без копирования;
- данные записываются на новое дисковое пространство, а не поверх существующих файлов;
- при модификации метаданных новая копия хранится в свободном дисковом пространстве, затем система создает ссылку из старых метаданных на новую версию.
Все это позволяет повысить надежность хранения файлов, обеспечивает быстрое и легкое восстановление данных.
Что-то пошло не так
Иногда наиболее ценной информацией, которая у вас есть при попытке что-то ускорить, есть само знание того, что это точно можно ускорить. Ну, знаете, как в школе — задача решается потому, что это задача, а значит у неё точно должно быть решение.
Когда дело касается кода, который находится полностью под вашим контролем — здесь проще. Можно сравнить быстродействие различных версий, покопаться, поговорить с его авторами, с какого-то этапа также начинает работать ведомая опытом интуиция.
Когда же речь идёт о «чёрном ящике», каким, например, является реализация файловой системы NTFS от Microsoft, становится сложнее. Но и здесь можно найти кое-какие подсказки:
- Вы замечаете, что некоторые файловые операции, которые раньше работали быстро, вдруг стали работать медленно. Вероятно, их можно снова заставить работать быстро.
- Одни и те же файловые операции иногда работают быстро, а иногда — медленно. Возможно, их можно заставить работать быстро всегда.
- При профилировании своего приложения вы видите хорошую производительность файловых операций в большинстве случаев, кроме нескольких «горячих» мест, где всё почему-то работает значительно хуже среднего. Возможно, вы можете изменить свой код так, чтобы избежать данной проблемы.
Задачи файловой системы
Функционал файловой системы нацелен на решение следующих задач:
- присвоение имен файлам;
- программный интерфейс работы с файлами для приложений;
- отображение логической модели файловой системы на физическую организацию хранилища данных;
- поддержка устойчивости файловой системы к сбоям питания, ошибкам аппаратных и программных средств;
- содержание параметров файла, необходимых для правильного взаимодействия с другими объектами системы (ядро, приложения и пр.).
В многопользовательских системах реализуется задача защиты файлов от несанкционированного доступа, обеспечение совместной работы. При открытии файла одним из пользователей для других этот же файл временно будет доступен в режиме «только чтение».
Вся информация о файлах хранится в особых областях раздела (томах). Структура справочников зависит от типа файловой системы. Справочник файлов позволяет ассоциировать числовые идентификаторы уникальных файлов и дополнительную информацию о них с непосредственным содержимым файла, хранящимся в другой области раздела.
Вооружимся этим знанием
ETW-трейсы позволяют достаточно просто понять, что буферы для нотификаций являются проблемой — каждый процесс, выполняющий какие-то файловые операции будет показывать крайне много времени, потраченного в ntoskrnl.exe!FsRtlNotifyFilterReportChangeLiteEx. Это показывает, что кто-то использует очень большой буфер для нотификаций, но как нам найти процесса-виновника? Очень просто — поскольку память в нашем случае выделялась с помощью ntoskrnl.exe!ExAllocatePoolWithTag, то освобождаться она будет с помощью ntoskrnl.exe!ExFreePoolWithTag. Мы можем поискать вызовы этой функции в имеющихся у нас коллстеках и найти тот, где их много.
Файловые системы macOS
Для операционной системы macOS компания Apple использует собственные разработки файловых систем:
- HFS+, которая является усовершенствованной версией HFS, ранее применяемой на компьютерах Macintosh, и ее более соверешенный аналог APFS. Стандарт HFS+ используется во всех устройствах под управлением продуктов Apple, включая компьютеры Mac, iPod, а также Apple X Server.
- Кластерная файловая система Apple Xsan, созданная из файловых систем StorNext и CentraVision, используется в расширенных серверных продуктах. Эта файловая система хранит файлы и папки, информацию Finder о просмотре каталогов, положениях окна и т.д.
Основные функции файловых систем
Файловая система отвечает за оптимальное логическое распределение информационных данных на конкретном физическом носителе. Драйвер ФС организует взаимодействие между хранилищем, операционной системой и прикладным программным обеспечением. Правильный выбор файловой системы для конкретных пользовательских задач влияет на скорость обработки данных, принципы распределения и другие функциональные возможности, необходимые для стабильной работы любых компьютерных систем. Иными словами, это совокупность условий и правил, определяющих способ организации файлов на носителях информации.
Основными функциями файловой системы являются:
- размещение и упорядочивание на носителе данных в виде файлов;
- определение максимально поддерживаемого объема данных на носителе информации;
- создание, чтение и удаление файлов;
- назначение и изменение атрибутов файлов (размер, время создания и изменения, владелец и создатель файла, доступен только для чтения, скрытый файл, временный файл, архивный, исполняемый, максимальная длина имени файла и т.п.);
- определение структуры файла;
- поиск файлов;
- организация каталогов для логической организации файлов;
- защита файлов при системном сбое;
- защита файлов от несанкционированного доступа и изменения их содержимого.
Файловые системы Linux
В отличие от ОС Windows и macOS, ограничивающих выбор файловой системы предустановленными вариантами, Linux предоставляет возможность использования нескольких ФС, каждая из которых оптимизирована для решения определенных задач. Файловые системы в Linux используются не только для работы с файлами на диске, но и для хранения данных в оперативной памяти или доступа к конфигурации ядра во время работы системы. Все они включены в ядро и могут использоваться в качестве корневой файловой системы.
Основные файловые системы, используемые в дистрибутивах Linux:
Ext2, Ext3, Ext4 или Extended Filesystem – стандартная файловая система, первоначально разработанная еще для Minix. Содержит максимальное количество функций и является наиболее стабильной в связи с редкими изменениями кодовой базы. Начиная с ext3 в системе используется функция журналирования. Сегодня версия ext4 присутствует во всех дистрибутивах Linux.
JFS или Journaled File System разработана в IBM в качестве альтернативы для файловых систем ext. Сейчас она используется там, где необходима высокая стабильность и минимальное потребление ресурсов (в первую очередь в многопроцессорных компьютерах). В журнале хранятся только метаданные, что позволяет восстанавливать старые версии файлов после сбоев.
ReiserFS также разработана в качестве альтернативы ext3, поддерживает только Linux. Динамический размер блока позволяет упаковывать несколько небольших файлов в один блок, что предотвращает фрагментацию и улучшает работу с небольшими файлами. Недостатком является риск потери данных при отключении энергии.
XFS рассчитана на файлы большого размера, поддерживает диски до 2 терабайт. Преимуществом системы является высокая скорость работы с большими файлами, отложенное выделение места, увеличение разделов на лету, незначительный размер служебной информации. К недостаткам относится невозможность уменьшения размера, сложность восстановления данных и риск потери файлов при аварийном отключении питания.
Btrfs или B-Tree File System легко администрируется, обладает высокой отказоустойчивостью и производительностью. Используется как файловая система по умолчанию в OpenSUSE и SUSE Linux.
Другие ФС, такие как NTFS, FAT, HFS, могут использоваться в Linux, но корневая файловая система на них не устанавливается, поскольку они для этого не предназначены.
Дополнительные файловые системы
В операционных системах семейства Unix BSD (созданы на базе Linux) и Sun Solaris чаще всего используются различные версии ФС UFS (Unix File System), известной также под названием FFS (Fast File System). В современных компьютерных технологиях данные файловые системы могут быть заменены на альтернативные: ZFS для Solaris, JFS и ее производные для Unix.
Кластерные файловые системы включают поддержку распределенных хранилищ, расширяемость и модульность. К ним относятся:
- ZFS – «Zettabyte File System» разработана для распределенных хранилищ Sun Solaris OS;
- Apple Xsan – эволюция компании Apple в CentraVision и более поздних разработках StorNext;
- VMFS (Файловая система виртуальных машин) разработана компанией VMware для VMware ESX Server;
- GFS – Red Hat Linux именуется как «глобальная файловая система» для Linux;
- JFS1 – оригинальный (устаревший) дизайн файловой системы IBM JFS, используемой в старых системах хранения AIX.
Операционные системы и типы файловых систем
Существует три основных вида операционных систем, используемых для управления любыми информационными устройствами: Windows компании Microsoft, macOS разработки Apple и операционные системы с открытым исходным кодом на базе Linux. Все они, для взаимодействия с физическими носителями, используют различные типы файловых систем, многие из которых дружат только со «своей» операционкой. В большинстве случаев они являются предустановленными, рядовые пользователи редко создают новые дисковые разделы и еще реже задумываются об их настройках.
В случае с Windows все выглядит достаточно просто: NTFS на всех дисковых разделах и FAT32 (или NTFS) на флешках. Если установлен NAS (сервер для хранения данных на файловом уровне), и в нем используется какая-то другая файловая система, то практически никто не обращает на это внимания. К нему просто подключаются по сети и качают файлы.
На мобильных гаджетах с ОС Android чаще всего установлена ФС версии ext4 во внутренней памяти и FAT32 на карточках microSD. Владельцы продукции Apple зачастую вообще не имеют представления, какая файловая система используется на их устройствах – HFS+, HFSX, APFS, WTFS или другая. Для них существуют лишь красивые значки папок и файлов в графическом интерфейсе.
Более богатый выбор у линуксоидов. Но здесь настройка и использование определенного типа файловой системы требует хотя бы минимальных навыков программирования. Тем более, мало кто задумывается, можно ли использовать в определенной ОС «неродную» файловую систему. И зачем вообще это нужно.
Рассмотрим более подробно виды файловых систем в зависимости от их предпочтительного использования с определенной операционной системой.
Читайте также: