Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
linux:zfs:deep_info [2023/10/28 07:47] admin |
linux:zfs:deep_info [2023/11/04 17:06] (текущий) admin [Производительность] |
||
---|---|---|---|
Строка 4: | Строка 4: | ||
Zettabyte File System - ФС с деревом Меркла, | Zettabyte File System - ФС с деревом Меркла, | ||
Поддерживает большие объемы данных, | Поддерживает большие объемы данных, | ||
+ | |||
+ | < | ||
+ | < | ||
На момент создания была новаторской, | На момент создания была новаторской, | ||
Обеспечивает полный контроль над физическими носителями и логическими томами и постоянное поддержание консистентности ФС.\\ | Обеспечивает полный контроль над физическими носителями и логическими томами и постоянное поддержание консистентности ФС.\\ | ||
Строка 10: | Строка 13: | ||
Собсна в открытом доступе есть именно " | Собсна в открытом доступе есть именно " | ||
По сути из-за формальностей, | По сути из-за формальностей, | ||
- | + | ||
Основные преимущества: | Основные преимущества: | ||
* объединенное хранилище | * объединенное хранилище | ||
Строка 19: | Строка 22: | ||
* Максимальный размер файла дохерарх и макс размер хранилища считай что неограничен | * Максимальный размер файла дохерарх и макс размер хранилища считай что неограничен | ||
- | + | **объединенное хранилище**\\ | |
- | < | + | |
- | < | + | |
- | === объединенное хранилище | + | |
Это про совмещение возможностей ФС и менеджера дисков\\ | Это про совмещение возможностей ФС и менеджера дисков\\ | ||
ZFS может создать ФС охватив все диски, можно так же добавить хранилище в систему дисков. ZFS займется разделением и форматированием дисков\\ | ZFS может создать ФС охватив все диски, можно так же добавить хранилище в систему дисков. ZFS займется разделением и форматированием дисков\\ | ||
- | === Copy-on-write | + | **Copy-on-write**\\ |
В отличии от большинства других ФС, тут новая инфа записывается в отдельный блок и как только запись завершена, | В отличии от большинства других ФС, тут новая инфа записывается в отдельный блок и как только запись завершена, | ||
Это гарантирует что пока новая инфа корректно и полностью не запишется, | Это гарантирует что пока новая инфа корректно и полностью не запишется, | ||
Строка 33: | Строка 33: | ||
- | === Снапшоты | + | **Снапшоты**\\ |
ZFS использует снапшоты для того чтобы следить за изменениями в файловой системе\\ | ZFS использует снапшоты для того чтобы следить за изменениями в файловой системе\\ | ||
Снимок хранит оригинальную версию ФС и текущую, | Снимок хранит оригинальную версию ФС и текущую, | ||
Строка 40: | Строка 40: | ||
Снимки могут быть смонтированы RO для восстановления старой версии файла, так же можно откатиться к предыдущему снимку, | Снимки могут быть смонтированы RO для восстановления старой версии файла, так же можно откатиться к предыдущему снимку, | ||
- | + | **проверка цельности и автопочинка**\\ | |
- | === проверка цельности и автопочинка | + | |
Для всей информации в ZFS существует чек-сумма (дерево Меркла), | Для всей информации в ZFS существует чек-сумма (дерево Меркла), | ||
- | === RAID-Z | + | **RAID-Z**\\ |
Работает с RAID без вспомогательного софта\\ | Работает с RAID без вспомогательного софта\\ | ||
Имеет собственную реализацию RAID - " | Имеет собственную реализацию RAID - " | ||
Строка 59: | Строка 58: | ||
< | < | ||
< | < | ||
- | |||
<code bash> | <code bash> | ||
Огромное потребление памяти не прибито гвоздями — его легко можно регулировать переменной vfs.zfs.arc_max. | Огромное потребление памяти не прибито гвоздями — его легко можно регулировать переменной vfs.zfs.arc_max. | ||
Строка 72: | Строка 70: | ||
**Еще замечания**\\ | **Еще замечания**\\ | ||
- | |||
<code bash> | <code bash> | ||
Напомню всем, что, создав единожды vdev в ZFS вы больше не можете с ним сделать ничего: | Напомню всем, что, создав единожды vdev в ZFS вы больше не можете с ним сделать ничего: | ||
Строка 78: | Строка 75: | ||
</ | </ | ||
</ | </ | ||
- | |||
Строка 94: | Строка 90: | ||
- | ==== Преимущества ==== | ||
< | < | ||
- | < | + | < |
**Целостность и консистентность** - ZFS сделан для максимальной надежности. По умолчанию на все данные подсчитываются контрольные суммы, а для метаданных записываются минимум по две копии в разных местах диска\\ | **Целостность и консистентность** - ZFS сделан для максимальной надежности. По умолчанию на все данные подсчитываются контрольные суммы, а для метаданных записываются минимум по две копии в разных местах диска\\ | ||
Строка 119: | Строка 114: | ||
т.е. как конкретно мы будем хранить данные - с упором на производительность или на объем, это ответственность **Vdev**\\ | т.е. как конкретно мы будем хранить данные - с упором на производительность или на объем, это ответственность **Vdev**\\ | ||
Из набора виртуальных устр-в составляется общий пул\\ | Из набора виртуальных устр-в составляется общий пул\\ | ||
+ | |||
< | < | ||
< | < | ||
В классическом понимании mdadm, чтобы собрать **Raid10** (набор мирроров), | В классическом понимании mdadm, чтобы собрать **Raid10** (набор мирроров), | ||
</ | </ | ||
+ | |||
Каждый **Vdev** это по сути **stripe**, т.е. отдельная виртуальная единица хранения\\ | Каждый **Vdev** это по сути **stripe**, т.е. отдельная виртуальная единица хранения\\ | ||
В рамках пула, каждый уникальный блок данных будет хранится только на одном Vdev\\ | В рамках пула, каждый уникальный блок данных будет хранится только на одном Vdev\\ | ||
+ | {{: | ||
+ | {{: | ||
< | < | ||
Строка 133: | Строка 132: | ||
* **DSL (Data and Snapshot Layer)** - пользуется предыдущим слоем. Занимается непосредственно файловыми системами, | * **DSL (Data and Snapshot Layer)** - пользуется предыдущим слоем. Занимается непосредственно файловыми системами, | ||
+ | {{: | ||
+ | | {{: | ||
+ | </ | ||
+ | |||
+ | |||
+ | ==== ZFS Arch ==== | ||
+ | **ARC (Adaptive Replacement Cache)** - разработан чтобы решить проблему с чтением.\\ | ||
+ | Примечателен тем что делает упор не только на последние объекты (LRU-cache) но и на часто используемые объекты (MFU-cache)\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | У классического **page cache Linux** есть проблема " | ||
+ | |||
+ | ARC - это умная замена page cache\\ | ||
+ | Когда создавался ZFS, часто использовали жесткие диски, а у них маленькие IOPS. Чтение copy-on-write данных - по умолчанию случайная операция, | ||
+ | Нормально если при штатной работе 99% запросов чтения попадает в кэш, если меньше то что то не так, стоит добавить оперативной памяти\\ | ||
+ | Если ARC не всегда помещается в память, | ||
</ | </ | ||
- | **** | + | ==== ZIL (ZFS intent log) ==== |
+ | Есть своего рода журнал, | ||
+ | Этот журнал обычно очень маленький, | ||
- | **** | + | < |
+ | < | ||
+ | Запись транзакциями это набор дорогостоящий операций, | ||
+ | Поэтому мы стараемся набить каждую транзакцию максимальным кол-вом данных\\ | ||
+ | Тут и появляется определенного вида журнал, | ||
+ | Здесь он вынесен как сущность, | ||
+ | </ | ||
- | ==== ==== | + | **ARC и ZIL** хотя и необязательные с технической стороны компоненты, |
+ | ZFS в продакшене чаще применяют для крупных инсталляций хранилища данных. Архитектура подразумевает эффективную утилизацию большого кол-ва HDD, SSD, RAM, CPU\\ | ||
+ | < | ||
+ | < | ||
+ | Блоки типа ARC,ZIL и тд это не диски, которые мы можем использовать, | ||
+ | ZIL можно вынести на т.н. Slog, которому не нужно быть большим, | ||
+ | Slog нужен для чтения только при сбое питания\\ | ||
+ | |||
+ | ARC можно дополнить одним или более SSD и выгружать на него определенный вид данных, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Паттерны использования ===== | ||
+ | ZFS это локальное хранилище, | ||
+ | |||
+ | < | ||
+ | < | ||
+ | * Подходит для домашнего использования, | ||
+ | * NFS хранилище, | ||
+ | * Так же в качестве крупного хранилища, | ||
+ | |||
+ | Можно оптимизировать любой профиль нагрузки, | ||
+ | Например когда хотим оптимизировать copy-on-write то можем писать бОльшим блоком чем в классических ФС, для ZFS по умолчанию принят объем в 128КБайт на блок\\ | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Сравнение с аппаратными решениями ===== | ||
+ | Плюс аппаратных решений в том что на них можно перенести вычислительную нагрузку и с (в случае поддерживания) вопрос синхронной записи\\ | ||
+ | Тут же следом и минусы, | ||
+ | |||
+ | Главный плюс в том что ZFS может очень гибко подстраиваться под систему/ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Во первых это то что метаданные пишутся в начале каждого диска, в случае с переездом достаточно просто подключить диск в другой сервер, | ||
+ | |||
+ | Второй момент, | ||
+ | |||
+ | В ZFS же, **в рамках одного пула можно создавать несколько датасетов и каждый настраивается персонально**\\ | ||
+ | **Датасет** - отдельная ФС со своими настройками. К примеру, | ||
+ | Хочется сжимать данные ? - "**zfs set compression=on**", | ||
+ | |||
+ | Имея один пул, можно настраивать под конкретную операцию хоть каждый датасет, | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Особенности работы ZFS ===== | ||
+ | |||
+ | **Фрагментация данных**\\ | ||
+ | В copy-on-write системе постоянно появляются новые блоки, а старые не всегда пригодны к удалению\\ | ||
+ | < | ||
+ | < | ||
+ | ZFS пространство разрезано на т.н. **metaslabs**, | ||
+ | |||
+ | В рамках этих пространств мы при каждом аллоцировании ищем наиболее подходящее\\ | ||
+ | Когда места в пуле много, то выбираем пространство с самым большим объемом свободного места, куда будет лучше записаться с точки зрения дальнейшей фрагментации. Например у нас 1МБайт данных, | ||
+ | |||
+ | Когда места становится мало, включается другой режим, дороже по производительности и только усиливает фрагментацию, | ||
+ | В худшем случае, | ||
+ | |||
+ | По умолчанию на каждый Vdev создается ~200 meta-slabs. Это чем то похоже на WAL-лог БД\\ | ||
+ | </ | ||
+ | |||
+ | |||
+ | **Запись данных**\\ | ||
+ | По умолчанию чтение данных в ZFS практически всегда является случайным, | ||
+ | Если нужна система хранения под запись и редкое чтение, | ||
+ | Данные пишутся группами транзакций (tgx, transaction groups), можно агрегировать информацию в рамках этих групп\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Существует **Write Throttling** мы можем использовать неограниченное кол-во оперативной памяти для подготовки **tgx-группы** и за счет этого переживать резкие скачки записи, | ||
+ | Ес-но речь про асинхронную запись, | ||
+ | |||
+ | Если синхронная запись и ее целостность не важна, например, | ||
+ | |||
+ | Т.о. собрав пул из HDD, можно ими пользоваться как дешевыми SSD с точки зрения IOPS\\ | ||
+ | Сколько IOPS даст оперативная память, | ||
+ | В худшем случае теряется последние несколько сек записи, | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== ARC ===== | ||
+ | Adaptive Replacement Cache (Кэш адаптивной замены)\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | [[https:// | ||
+ | |||
+ | ZFS сообщает некоторую информацию об ARC в **/ | ||
+ | Параметром размера является " | ||
+ | |||
+ | Есть три метрики ОЗУ " | ||
+ | Доступный ей объем может быть отрицательным, | ||
+ | " | ||
+ | |||
+ | Может ли ARC расти в данный момент, | ||
+ | При приближении к этому значению ARC значительно замедляет рост, вроде как\\ | ||
+ | |||
+ | Если " | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | В контуре управления памятью ядра Linux есть т.н. " | ||
+ | Работает в два этапа, сначала ядро спрашивает подсистему сколько памяти она может вернуть, | ||
+ | |||
+ | Базовый объем памяти который ARC может вернуть, | ||
+ | |||
+ | При каждом сжатии, | ||
+ | Если сжатие происходит с помощью " | ||
+ | Собсна прямое освобождение указывает на проблему и является плохим состоянием\\ | ||
+ | |||
+ | ARC имеет ограничения на объем хранимых метаданных (как общие **arc_meta_used** так и для " | ||
+ | |||
+ | Когда ARC удаляет данные, | ||
+ | Первое - " | ||
+ | |||
+ | " | ||
+ | В " | ||
+ | |||
+ | Некоторая часть подсчитанного здесь пространства может быть " | ||
+ | |||
+ | В рамках настройки записи ZFS временно резервирует для них пространство ARC, о текущем резервировании сказано в " | ||
+ | Общий объем " | ||
+ | |||
+ | Если ZFS решает ограничить выделение новой памяти для записи, | ||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | [[https:// | ||
+ | |||
+ | Целевой и фактический размеры ARC здесь различаются, | ||
+ | |||
+ | Сокращение может быть вызвано т.н. " | ||
+ | Если так то ZFS ставит " | ||
<code bash> | <code bash> | ||
+ | ((arc_c - arc_c_min) / 128) - memory_available_bytes | ||
+ | </ | ||
+ | Процесс может быть вызван и немедленно при считывании очередного блока в память ZFS, после проверки " | ||
+ | Путь " | ||
+ | |||
+ | При " | ||
+ | При каждом сжатии растет статистика " | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | [[https:// | ||
+ | |||
+ | Текущий общий размер указан в " | ||
+ | В общем то содержит в себе " | ||
+ | |||
+ | Основу составляют " | ||
+ | " | ||
+ | |||
+ | Даже если вы не включили сжатие для данных, | ||
+ | |||
+ | " | ||
+ | |||
+ | " | ||
+ | Целевой размер " | ||
+ | |||
+ | <code bash> | ||
+ | c -> Is the total cache size (MRU + MFU) | ||
+ | p -> represents the limit of MRU | ||
+ | (c - p) -> represents the limit of MFU | ||
+ | c_max, c_min -> hard limits | ||
+ | size -> Total amount consumed by ARC | ||
</ | </ | ||
+ | </ | ||
+ | ==== L2ARC ==== | ||
+ | Является вторым кэшем чтения, | ||
+ | При применении небольшого, | ||
< | < | ||
< | < | ||
+ | Хоть L2 и пишется на диск, данные на нем не выдерживают перезагрузку, | ||
+ | Применение L2 становится существенным при наличии большого числа пользователей, | ||
+ | Если ваш рабочий набор больше чем объем памяти, | ||
+ | |||
+ | :!: Важный момент в том, что для обслуживания L2 так же используется память\\ | ||
+ | Раз L2 содержит целый набор кэшированых данных и метаданных, | ||
+ | Грубо говоря, | ||
+ | |||
+ | L2ARC **кэширует только выпадающие из ARC данные**, | ||
+ | т.е. если в основном кэше запретить кэшировать метаданных то **и здесь их не будет**, | ||
+ | |||
+ | Кэширование потоковой передачей по умолчанию отключено (это когда большие файлы) т.к. основная задержка уходит на позиционирование головки, | ||
+ | |||
+ | При нормальной работе ZFS **пишет только 8Мб в секунду** в каждое устр-во L2ARC. Это позволяет избегать преждевременного " | ||
+ | Параметр настраивается " | ||
</ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== ZIL ===== | ||
+ | Кэш используется не только для чтения но и для записи, | ||
+ | Каждый пул имеет свой собственный ZIL\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | ZFS накапливает данные в этом журнале в т.н. **группы транзакций (txgs, transaction groups)**, затем, при наполнении достаточного объема либо по таймауту, | ||
+ | |||
+ | Группа транзакций может содержать порции данных от разных, | ||
+ | содержит " | ||
+ | |||
+ | " | ||
+ | Уменьшение таймаута может уменьшить объем потенциальной потери но плохо скажется на производительности\\ | ||
+ | |||
+ | Касательно использования диска ZIL и записывания ZIL на диск, тут есть момент с синхронной/ | ||
+ | " | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | Отдельное устр-во называется "SLOG (Separate Intent Log)", перемещая ZIL на отдельное устр-во вы избегаете записи одних и тех же данных дважды на одного поставщика хранения (все таки ZIL похоже применяется, | ||
+ | Однако есть момент, | ||
+ | |||
+ | Дак вот, вынос на отдельное устр-во, | ||
+ | Второй момент, | ||
+ | |||
+ | метрика " | ||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ===== Производительность ===== | ||
+ | [[http:// | ||
+ | Обычно имеется четыре основных ресурса: | ||
+ | * **В/В системы хранения** | ||
+ | * **Пропускная способность сети** | ||
+ | * **Оперативная память** | ||
+ | * **ЦП** | ||
+ | |||
+ | Производительность системы всегда определяется самым ее медленным компонентом !!!\\ | ||
+ | |||
+ | < | ||
+ | < | ||
+ | Например сжатие ZFS уменьшает объем записываемых и считываемых данных, | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | |||
+ | </ | ||
- | ===== ZFS Arch ===== | ||
Строка 164: | Строка 451: | ||
- | ==== ==== | ||
- | ===== ===== | ||
< | < | ||
Строка 176: | Строка 461: | ||
</ | </ | ||
</ | </ | ||
+ | |||
Строка 185: | Строка 471: | ||
</ | </ | ||
</ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |