Весной 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