Страницы

Сохранить статью у себя в соцсети:

понедельник, 24 сентября 2012 г.

§ FlashCache: Introduction

Статья открывает цикл из трех статей о FlashCache, в которых будет рассказано что такое FlashCache и какие у него преимущества, как настроить работу FlashCache и как эту работу замониторить. Сегодня вводная статья о том что такое FlashCache вообще.

Flashcache: Введение.

FlashСache это технология использования блочных устройств для кэширования, работающая через device-mapper в Linux. Позволяет использовать диски SSD для кэширования обращения к медленным SATA/SAS дискам для увеличения производительности. 
Особенности:
  • работа на уровне ядра и подсистемы device-mapper;
  • поддержка нескольких режимов кэширования;
  • возможность сбора статистики;
  • тонкая настройка томов через интерфейс sysctl;
  • реализация черных/белых списков;
  • возможность некэшировать последовательный IO.
Принцип работы. Flashсache использует Device Mapper для создания блочного устройства. При его создании ему передаются два других устройства. Можно указывать устройства которые используют как Device Mapper (LVM-тома), так и нет (физические диски и разделы). Одно из них является "медленным и большим", второе "маленьким и быстрым" (SSD диск или RAM-диск). При включённом режиме кеширования каждое обращение к устройству flashcache проверяется на наличие в кеше, и при его наличии в кеше отдаётся оттуда, а не читается с медленного диска. Если же в кеше данные не найдены, то они читаются с медленного диска и записываются в кеш. Таким образом можно собрать гибридное устройство состоящее из двух устройств, которое будет использовать преимущества SSD и SAS/SATA дисков.

Режимы кэширования. Поддерживается несколько режимов кэширования:
writethrough (сквозная запись) - безопасный режим работы, все данные идущие на запись кэшируются на SSD и одновременно записываются на жесткий диск. Все данные прочитанные с диска также кэшируются. 
writearound - самый безопасный режим работы, данные предназначенные на запись, отправляются непосредственно на жесткий диск. На SSD кэшируются только прочитанные с жесткого диска данные.
writeback (отложенная запись) - самый быстрый, но наименее безопасный режим работы. Все данные идущие на запись отправляются на SSD, на жесткий диск они будут записаны позже в зависимости от используемой политики. Все данные прочитанные с жесткого диска кэшируются на SSD.
О режимах writethrough и writearound стоит сказать следующее. При использовании этих режимов, в случае удаления flashcache-устройства или перезагрузки, кэш очищается и становится недействительным. Только режим writeback обеспечивает сохранность кэша при перезагрузках или удалении flashcache-устройства.

Утилиты. Для управления и работы с flashcache-устройствами предоставлено несколько утилит. Утилиты представляют собой обертки для dmsetup и предоставлют простой интерфейс для создания, загрузки и удаления flashcache-устройств. Из-за простого синтаксиса эти утилиты гораздо удобнее, чем использование dmsetup напрямую.

flashcache_create: создание flashcache-устройства
flashcache_create [-v] -p back|around|thru [-s cache size] [-b block size] cachedevname ssd_devname disk_devname
-v - подробный вывод;
-p - указать режим кэширования (writeback/writethrough/writearound);
-s - указать размер кэша. Если опустить, то все пространство на SSD будет задействовано под кэш. По умолчанию размер указывается в секторах, также доступны единцы k/m/g;
-b - размер блока (по умолчанию - 4Kb), должен быть числом от степени 2. По умолчанию размер указывается в секторах, можно указать размер в килобайтах (k)
-f - создать устройство без проведения предварительных проверок

flashcache_load: загрузить существующее writeback flashcache-устройство
flashcache_load ssd_devname [cachedev_name]
Для томов использующих режимы writethrough и writearound эта утилита не нужна.

flashcache_destroy: разрушить существующий том c writeback режимом.
flashcache_destroy ssd_devname
Для томов использующих режимы writethrough и writearound эта утилита также не нужна.

flashcache_setioctl: работа с белыми/черными списками.
flashcache_setioctl (-c | -a | -r) (-b pid |-w pid) ssd_devname 
-c - очистить список;
-a - добавить в список;
-r - удалить из списка;
-b - добавить в черный список;
-w - добавить в белый список

Удаление flashcache томаДля удаления flashcache-тома используется 'dmsetup remove'. Для томов использующих writeback выполняется очистка всех измененных (dirty) блоков и перенос данных на жесткий диск. Команда передаст управление только тогда, когда выполнится запись всех блоков. Перезагрузка приведет к тому что все блоки будут сброшены и измененные данные будут записаны на жесткий диск.
Для flashcache-томов с режимами writearound и writethrough перезагрузка приведет к разрушению кэша. 

Статистика. Статистику можно просмотреть несколькими способами:
Первый вариант заключается в использовании непосредственно 'dmsetup status'
# dmsetup status fc-pgdb
0 314572800 flashcache stats: 
        reads(669256958), writes(723989824)
        read hits(584422279), read hit percent(87)
        replacement(8908173), write replacement(0)
        invalidates(1)
        pending enqueues(0), pending inval(0)
        no room(0)
        disk reads(84840245), disk writes(724019308) ssd reads(584422070) ssd writes(84840244)
        uncached reads(1), uncached writes(724019308), uncached IO requeue(0)
        uncached sequential reads(0), uncached sequential writes(0)
        pid_adds(0), pid_dels(0), pid_drops(0) pid_expiry(0)

также через 'dmsetup table' можно просмотреть статистику связанную с кэшем
# dmsetup table fc-pgdb
0 314572800 flashcache conf:
        ssd dev (/dev/ssd/ssd-pgdb), disk dev (/dev/nox/pgdb) cache mode(WRITE_AROUND)
        capacity(102400M), associativity(512), data block size(4K)
        skip sequential thresh(0K)
        total blocks(26214400), cached blocks(17103724), cache percent(65)
        nr_queued(0)
Size Hist: 1024:1 4096:1393226570

Второй вариант, это просмотр файлов статистики в /proc. Способ менее информативный и не включает в себя статистику связанную с кэшем, но зато имеет статистику по ошибкам.
# cat /proc/flashcache/ssd-pgdb+pgdb/flashcache_stats
reads=669267078 writes=724027698 
read_hits=584430840 read_hit_percent=87 replacement=8908221 read_invalidates=1 pending_enqueues=0 pending_inval=0 no_room=0 disk_reads=84841804 disk_writes=724057182 ssd_reads=584430631 ssd_writes=84841803 uncached_reads=1 uncached_writes=724057182 uncached_IO_requeue=0 uncached_sequential_reads=0 uncached_sequential_writes=0 pid_adds=0 pid_dels=0 pid_drops=0 pid_expiry=0
# cat /proc/flashcache/ssd-pgdb+pgdb/flashcache_errors
disk_read_errors=0 disk_write_errors=0 ssd_read_errors=0 ssd_write_errors=0 memory_alloc_errors=0

Более подробно о статистике будет написано во второй части цикла.

Управление flashcache-томами через sysctl. Sysctl предоставляет интерфейс для непосредственного управления запущенными flashcache-устройствами.
Ключи относящиеся к flashcache имеют определенную структуру которую следует учитывать при прямом изменении или записи в файлы конфигурации sysctl.
dev.flashcache.<cachedev>.<parameter> - где cachedev это имя flashcache-устройства, parameter - имя параметра. Для томов с разными режимами кэширования различают разные наборы ключей.
Общие для всех режимов ключи:
cache_all = 1 - глобальный режим кэширования "всё или ничего". По умолчанию включено "кэшировать всё";
zero_stats = 0 - обнулить статистику;
reclaim_policy = 0 - FIFO (0) или LRU(1);
io_latency_hist = 0 - подсчет задержек в IO подсистеме и отрисовка графика. По умолчанию отключено, т.к. увеличивает избыточное использование источника времени (clocksource). При включении, график добавляется в вывод 'dmsetup status';
max_pids = 100 - максимальное количество pid'ов в черных/белых списках;
do_pid_expiry = 0 - включить возможность истечения срока пребывания pid'ов в списках;
pid_expiry_secs = 0 - время нахождения pid с списках. Указывается в секундах;
skip_seq_thresh_kb = 0 - установить отметку и не кэшировать последовательный ввод-вывод превышающий отметку. По умолчанию 0, кэшируется все подряд.

Ключи доступные только для устройств с режимом writeback:
fallow_delay = 900 - время в секундах по истечении которого выполняется сброс dirty-блоков на жесткий диск.
fallow_clean_speed = 2 - максимальное число операции сброса "fallow clean" для одного набора данных в секунду.
fast_remove = 0 - не синхронизировать dirty-блоки при удалении устройства. Опция используется для быстрого отключения.
dirty_thresh_pct = 20 - FlashCache будет пытаться удерживать количество dirty-блоков в наборе данных, на уровне этой отметки в %. Меньшее значение увеличивает объем записи на жесткий диск и снижает количество перезаписи в блоках одновременно увеличивая количество блоков доступных для кэширования операций чтения.
stop_sync = 0 - остановить сброс dirty-блоков на жесткий диск.
do_sync = 0 - запустить сброс dirty-блоков на жесткий диск.
max_clean_ios_set = 2 - максимальное число операций записи которое может проводиться над набором данных в процессе сброса ditry-блоков с этого же набора.
max_clean_ios_total = 4 - максимальное число проводимых операций записи в процессе сброса всех dirty-блоков

Работа глобального режима кэширования и белые/черные списки.
FlashCache устройства могут работать в двух глобальных режимах: Кэшировать всё или Ничего не кэшировать (dev.flashcache.cache_all). По умолчанию включен режим "кэшировать всё". Эти режимы имеют белый и черный список для четкого определения чей ввод-вывод следует кэшировать, а чей - нет. Алгоритм работы выглядит следующим образом.
Режим "кэшировать всё":
  • Если pid процесса находится в черном списке, то создаваемый им IO не кэшируется;
  • Если tgid группы потоков находится в черном списке, то создаваемый ими IO не кэшируется;
  • Если конкретный pid процесса помещен в белый список, создаваемый им IO кэшируется;
  • В конце концов, если IO разрешен для кэширования, из кэширования исключается та часть в которой обнаружен последовательный IO (преднастройка через sysctl ключ skip_seq_thresh_kb).
Режим "ничего не кэшировать", тут все с точностью до наоборот.
  • Если pid процесса находится в белом списке, то создаваемый им IO кэшируется;
  • Если tgid группы потоков находится в белом списке, то создаваемый ими IO кэшируется;
  • Если конкретный pid процесса помещен в черный список, создаваемый им IO не кэшируется;
  • В конце концов, весь IO процессов находящихся в белом списке, разрешен для кэширования. Из кэширования исключается та часть в которой обнаружен последоваетельный IO (skip_seq_thresh_kb).
Отключение кэширования для последовательного ввода-вывода.
Отключение кэширования для последовательного IO имеет смысл в двух случаях.
1) Скорость последовательного ввода-вывода SSD дисков ниже чем последовательный ввод-вывод на жестких дисках. В частности последовательный IO на RAID массивах (RAID0, RAID10, RAID5) будет очень быстрым. Если после включения flashcache, обнаружено замедление скорости в последовательных операциях чтения-записи, то это как раз этот случай.
2) Набор данных размещенный на жестких дисках и предполагаемый для кэширования, меньше чем размер SSD диска. Это можно проверить, если наблюдать за тем как быстро заполняется кэш (dmsetup table). В этом случае, следует сделать приоритет на кэширование операций случайного ввода-вывода.
В обоих случаях, можно начать со значения в 1024Kb для ключа dev.flashcache.<device>.skip_seq_thresh_kb, таким большой последовательный ввод-вывод не будет кэшироваться. С другой стороны не следует устанавливать слишком большое значение, поскольку при классификации типа ввода-вывода, могут возникнуть накладные расходы влияющие на общую производительнось.

Вот, это вроде все, что есть на сегодня. Остальные части будут позже.

На главную "Virtualizing Linux"

Комментариев нет:

Отправить комментарий

Популярные сообщения

Профиль в Google+ Яндекс цитирования Яндекс.Метрика