Весной 2010 года компания Facebook [[http://www.opennet.dev/opennews/art.shtml?num=26440 открыла]] код проекта [[https://github.com/facebook/flashcache/ FlashCache]], представляющего собой модуль для ядра Linux, позволяющий заметно ускорить работу MySQL и других интенсивно работающих с диском приложений. Увеличение производительности достигается за счет организации процесса прозрачного кэширования наиболее активно используемых данных на быстрых SSD-накопителях. С точки зрения организации работы ничего не меняется, добавляется новое блочное устройство, которое при чтении выдает данные из быстрого кэша, а при записи дублирует их в кэше и на диске, обеспечивая прежний уровень надежности. Поддерживается также менее надежный режим увеличения скорости записи, при котором сначала осуществляется запись на хранилище SSD, а затем в фоне производится синхронизация данных на обычное хранилище. Поддерживаются функции зеркалирования кэша на несколько SSD-накопителей и задействование команды ATA TRIM для более оптимального распределения данных по SSD.
++ Установка.
Устанавливаем сопутствующие пакеты для Debian/Ubuntu:
$ apt-get install git-core dkms build-essential linux-headers-`uname -r`
Для CentOS/RHEL подключаем репозитории [[http://fedoraproject.org/wiki/EPEL EPEL]] и репозиторий [[http://mirror.centos.org/centos/$releasever/updates/SRPMS/ SRPMS]].
Устанавливаем необходимые пакеты:
$ yum install dkms gcc make yum-utils kernel-devel
Так как для сборки FlashCache требуются некоторые внутренние заголовочные файлы, которые не входят в состав пакета kernel-headers/devel требуется загрузить и установить полный код ядра:
$ yumdownloader --source kernel-`uname -r`
$ sudo rpm -ivh kernel-`uname -r`.src.rpm
Загружаем исходные тексты FlashCache:
$ git clone https://github.com/facebook/flashcache.git
Работа FlashCache протестирована с ядрами Linux с 2.6.18 по 2.6.38, для более новых ядер могут наблюдаться проблемы.
Собираем модуль с использованием DKMS (Dynamic Kernel Module Support):
$ cd flashcache
$ sudo make -f Makefile.dkms
install -o root -g root -m 0755 -d /var/lib/dkms/flashcache/1.0-101-g4bceda86d13d/source
rsync -r src/ /var/lib/dkms/flashcache/1.0-101-g4bceda86d13d/source/
sed "s/PACKAGE_VERSION=/PACKAGE_VERSION=1.0-101-g4bceda86d13d/" src/dkms.conf > "/var/lib/dkms/flashcache/1.0-101-g4bceda86d13d/source/dkms.conf"
dkms build -m flashcache -v 1.0-101-g4bceda86d13d
Kernel preparation unnecessary for this kernel. Skipping...
Building module:
cleaning build area....
KERNEL_TREE=/lib/modules/2.6.32-33-generic/build make modules.......
cleaning build area....
DKMS: build Completed.
make -C src/utils install
...
install -d -m 755 /sbin/
install -m 755 flashcache_create flashcache_destroy flashcache_load /sbin/
make[1]: Выход из каталога `/home2/home/mc/soft/flashcache/flashcache/src/utils'
dkms install -m flashcache -v 1.0-101-g4bceda86d13d
flashcache.ko:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/2.6.32-33-generic/updates/dkms/
depmod.........
Updating initrd
Making new initrd as /boot/initrd.img-2.6.32-33-generic
(If next boot fails, revert to the .bak initrd image)
update-initramfs....
все, теперь модуль flashcache.ko установлен и готов к использованию.
++ Режимы кэширования
Поддерживается три режима кэширования:
Writethrough - самый надежный режим, при котором все операции записи сразу переносятся на диск и сохраняются на SSD. Кэшируются только операции записи. При перезагрузке или при отключении накопителя содержимое кэша не теряется и может быть использовано сразу, без траты дополнительного времени на его заполнение.
Writearound - надежный режим, при котором данные при выполнении операции записи сохраняются только на диск и не отражаются на SSD. Кэш на SSD-накопителе обновляется только на основании выполнения операций чтения с диска (кэшируются только операции чтения). Режим подходит в ситуации, когда запись на диск производится быстрее, чем на SSD. После перезагрузки или отключения накопителя кэш начинает заполняться с нуля.
Writeback - наиболее быстрый, но менее надежный режим. Данные вначале записываются на SSD, а потом в фоне перекидываются на диск. Кэшируются как операции записи, так и чтения. При экстренном отключении питания не исключено пропадание не синхронизированных на диск данных.
++ Использование
Для управления FlashCache подготовлены три утилиты:
flashcache_create - создание нового дискового раздела с кэшированием;
flashcache_load - подключение ранее созданного раздела с кэшем в режиме writeback;
flashcache_destroy - очистка содержимого кэша, созданного в режиме writeback.
Для режимов writethrough и writebehind утилиты flashcache_load и flashcache_destroy не требуются, так как кэш очищается при переподключении раздела.
Предположим, что в системе имеется жесткий диск /dev/sdb и быстрый SSD-накопитель /dev/sdc. Для организации кэширования в режиме writeback, с размером блока 4 Кб и общим размером кэша 1 Гб следует выполнить:
flashcache_create -p writeback -s 1g -b 4k cachedev /dev/sdc /dev/sdb
После выполнения этой команды будет создано виртуальное блочное устройство с именем "cachedev", при монтировании раздела через которое будет автоматически использовано кэширование.
Для загрузки прошлого содержимого кэши или очистки кэша в режиме writeback можно выполнить команды:
flashcache_load /dev/sdc
flashcache_destroy /dev/sdc
Для удаления и просмотра статистики для уже созданных виртуальных блочных устройств следует использовать утилиту dmsetup.
Удаляем устройство cachedev:
dmsetup remove cachedev
Смотрим статистику:
dmsetup status cachedev
dmsetup table cachedev
или
cat /proc/flashcache/cachedev/flashcache_errors
cat /proc/flashcache/cachedev/flashcache_stats
Для тонкого управления режимами кэширования поддерживается большое число специальных sysctl-вызовов, описание которых можно найти в [[https://github.com/facebook/flashcache/blob/master/doc/flash... документации]].
URL: https://github.com/facebook/flashcache/blob/master/doc/flash... https://github.com/facebook/flashcache/blob/master/README-DKMS
Обсуждается: http://www.opennet.dev/tips/info/2629.shtml