Ускоряем базу данных. Bcache

от автора

Для работы мы используем postgresql + postgis базу данных с данными для всей планеты от osm.org. На диске она занимает около 350 Gb и работает не сказать что очень быстро, да и хранится на обычном HDD 2Tb 7200rpm, без raid-a. Т.к. нагрузка на базу постепенно возрастает было решено как-то дисковую подсистему ускорить, потратив минимум денег. Вариантов было не много:

  • или купить еще один такой же винчестер и объединить их в raid-0.
  • или купить небольшой SSD и организовать на нем быстрый кэш. Варианты:
    • dm-cache. Был добавлен в ядро 3.9, ставится просто.
    • bcache. Судя по обзорам самый быстрый. Основной минус — надо форматировать диски перед началом использования. Официально добавлен в ядро 3.10, распространяется как пропатченое ядро 3.9.
    • EnhanceIO. В обзорах я встретил упоминание его, как самого медленного, но простого в использовании. Добавлен в ядро 3.10.

Взвесив плюсы и минусы, а так же спросив отзывы знакомых, я решил остановиться на bcache. О нем и расскажу подробнее.

Сборка ядра bcache

Чтобы попробовать bcache — надо собрать пропатченое ядро 3.9. Проект активно развивается и его исходники даже не распространяются как tar.bz2. Хочешь скачать — качай репозиторий (700Мб где-то).

# устанавливаем все необходимое для сборки ядра sudo apt-get install kernel-package fakeroot build-essential ncurses-dev bc # забираем последние исходники bcache git clone http://evilpiepirate.org/git/linux-bcache.git cd linux-bcache # за основу конфига ядра с bcache используем конфиг текущего ядра cat /boot/config-`uname -r`>.config make oldconfig 

После этого шага надо будет выбрать какие опции использовать для добавившихся параметров ядра. Я оставил все по умолчанию, только bcache собрал как модуль ядра. Debug ключи bcache оставил в выключенном состоянии.

make-kpkg clean # С ключем -j можно задать число параллельных процессов сборки. sudo time fakeroot make-kpkg -j8 --initrd kernel_image kernel_headers # Через 24 минуты ядро было готово. Можно устанавливать. sudo dpkg -i ../linux-image-3.9.0+_3.9.0+-10.00.Custom_amd64.deb ../linux-headers-3.9.0+_3.9.0+-10.00.Custom_amd64.deb  # следом установим и bcache-tools cd .. git clone http://evilpiepirate.org/git/bcache-tools.git cd bcache-tools make sudo make install 

Если это ядро самое свежее по версии — оно загрузится автоматически, если у вас установлено что-то более новое — ядро с bcache можно будет выбрать при загрузке в grub2 в меню Advanced boot options.

Настраиваем bcache

Для работы с bcache диски надо предварительно отформатировать. (не забудьте забэкапить данные)

sudo -i umount /dev/sdb4 # форматируем раздел HDD make-bcache -B /dev/sdb4 # форматируем SSD для кэша make-bcache -С /dev/sda 

Далее диски надо зарегистрировать в ядре.

echo /dev/sdb4 > /sys/fs/bcache/register echo /dev/sda > /sys/fs/bcache/register 

После регистрации диск появится как /dev/bcache0, а кэш как /sys/fs/bcache/<UDID>. Форматируем диск в файловую систему по выбору и монтируем его.

mkfs.ext4 /dev/bcache0 mount /dev/bcache0 /mnt 

Что бы диск знал с которым кэшем ему работать, кэш надо подключить. Пока кэш-сет, это один диск, но в будущем планируют добавить работу с несколькими кэш устройствами в кэш-сете. Один кэш-сет можно добавить к нескольким дискам, что очень удобно для систем с несколькими медленными дисками. Для подключения кэша нам понадобится его UDID.

echo <UUID> > /sys/block/bcache0/bcache/attach 

Ну вот и все. У вас в системе есть диск который с подключенным к нему writetrough кэшем. Если основная нагрузка на базу — это выборки, без модификации данных — такого режима кэширования будет достаточно и SSD проживет дольше. Writeback можно включить коммандой:

echo writeback > /sys/block/bcache0/cache_mode 

Впечатления от bcache

После заполнения кэша база стала работать в разы шустрее. Привести какие-то цифры мне тяжело, т.к. до перехода на bcache я не делал референсных запросов. Но приблизительное отношение скоростей я показать смогу. Так сферический запрос с пустым кэшем выполняется за 171 секунду. Повторно он же выполняется за 3.2 секунды. Чтобы время исключить влияние кэшей базы данных на скорость обработки, я перезапустил БД, после чего запрос выполнился за 4 секунды. С таким приростом скорости обработка данных всей планеты не кажется невыполнимой задачей на нашем относительно слабом железе.

Приятным дополнением к bcache является его статистика, которую он бережно собирает. Можно посмотреть на статистику работы кэша, сколько miss, сколько hits, сколько процентов приходится на hits, сколько кэша заполнено, сколько информации было записано в кэш и т.д. Вот что он показывает у меня в настоящий момент:

$ cd /sys/block/bcache0/bcache/stats_hour $ cat cache_hit_ratio  90 $ cat cache_hits 836233 $ cat cache_misses  91086 $ cd cache/cache0 $ cat btree_written  92.3M $ cat metadata_written  481M $ cat written  41.3G 

Спасибо за внимание. О опечатках и неточностях сообщайте в личку, на вопросы постараюсь ответить в комментариях.
p.s. Документация к bcache очень подробная и хорошо написана, рекомендую к прочтению.

ссылка на оригинал статьи http://habrahabr.ru/post/182372/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *