Механізми кешування ZFS: ARC і L2ARC
Я думаю, багатьом відомо, що ZFS відрізняється дуже великим числом вкрай цікавих функцій. Кешування Герасимчука винятком - тут у ZFS є в арсеналі цілих два механізми: ARC і L2ARC.
Чому вони так дивно називаються, ARC? Ці кеші отримали свою назву на честь алгоритму кешування, на якому вони засновані, алгоритму ARC. крім нього також широко поширений LRU, але ARC вважається більш продуктивним.
ARC - це кеш ZFS, розташований в оперативній пам'яті, L2ARC - його продовження (Layer 2, другий рівень), але на більш повільному, ніж оперативна пам'ять носії (але при цьому володіє більшим обсягом) і в той же час, більш швидкому, ніж диски самого масиву. Зазвичай, в ролі носіїв для L2ARC використовуються SSD диски, так як їх швидкості читання / запису з легкістю перевершують останні моделі SAS.
Говорячи про абстрактні речі, таких як кеші, проте складно не озиратися в практичну сторону - так, SSD диски хороші при читанні даних, це вони роблять ну дуже швидко, але пи цьому далеко не у всіх SSD носіїв добре йдуть справи зі швидкостями запису . Чи не стане при цьому запис в кеш гальмувати безпосередньо читання? Ні, не буде, запис в кеші в ZFS відбувається асинхронно і ніяк не може вплинути на читання з ZFS.
Як же це працює на ділі?
Наповнення кешу: при читанні, дані, до яких йде найбільш частий доступ, поміщаються в ARC кеш, з часом він переповнюється і дані з ARC кеша витісняються в L2ARC кеш до кращих часів і лише після цього видаляються зовсім.
Використання кешу: при спробі прочитати дані з диска, ZFS спочатку шукає їх в оперативній пам'яті (ARC), якщо там необхідні дані відсутні, то виконується спроба знайти їх в L2ARC кеші і лише в разі невдачі на цьому кроці буде виконано реальне читання з фізичного пристрою .
Багато хто може помітити - а чи не простіше створити величезний ARC кеш, адже оперативна пам'ять вкрай дешева? Ні, не простіше, вкрай проблематично поставити на сервер, скажімо, 256 гігабайт пам'яті під кеш масиву тб на 150 :)
Як було сказано вище, в першу чергу ці кеші використовується при читанні і як раз при ньому дають максимальний ефект, але як бути при записі? Адже не можна довго складувати дані в пам'яті, інакше це загрожує їх втратою при втраті живлення (а ось для ZFS це абсолютно безпечно - вона не постраждає, просто дані не будуть записані і все, консістеность же файлової системи буде поза загрозою). На цей випадок (для прискорення операцій запису) в ZFS також є технологія кешування (але не даних, а транзакцій), яка іменується ZIL. Але про це я напишу в окремому пості.