Изменения

Перейти к: навигация, поиск

Производительность Ceph

47 байтов добавлено, 23:48, 11 мая 2020
Нет описания правки
== Настройка виртуалок и ФС ==
С дефолтными опциями qemu подключает RBD, увы, криво.
Криво — это значит, что:
TL;DR:
* ceph.conf [global]: '''rbd cache writethrough until flush = false'''
* qemu: '''bus=virtio cache=writeback'''. Если у вас SSD, СУБД и нужны random iops - iops — то '''bus=virtio cache=none'''.
* Внутри ВМ: '''mount -o lazytime'''.
* На пустом RBD-образе '''cache=writeback''' бесполезен, если не сделать '''rbd feature disable <pool>/<image> object-map'''. А если сделать - сделать — rbd du, rm и многие другие команды будут тормозить. Два стула.
=== Драйвер виртуального диска и ФС ===
В qemu есть следующие способы эмуляции дисков:
* lsi - lsi — самый медленный* virtio - virtio — самый быстрый, но до QEMU 4.0 не умел TRIM. Юзать надо его.* virtio-scsi - scsi — достаточно быстрый. На самом деле, умеет multiqueue и поэтому на быстром хранилище (например, при прямом доступе к локальной NVMe) должен быть быстрее virtio — virtio — но в случае с Ceph это не так, т.к. так как multiqueue бессмыслен
=== cache=writeback ===
Режимы writethrough, <не указано> и directsync с RBD, по сути, эквивалентны и означают отсутствие кэширования записи (каждая операция отправляется сразу в Ceph).
Режим writeback означает "честное" «честное» (безопасное) кэширование записи. То есть, операции записи без fsync ложатся в кэш и отправляются оттуда либо раз в rbd_cache_max_dirty_age (по умолчанию 1 сек), либо когда ВМ просит fsync.
Режим unsafe означает "нечестное" «нечестное» (чреватое потерей данных) кэширование записи. Операции записи также ложатся в кэш, но fsync от ВМ игнорируются. Транзакционность в виртуалке отсутствует, но и производительность повышается. Использовать этот режим можно только для виртуалок, не содержащих ценные данные (например, для каких-нибудь тестов или CI).
При среднем применении правильный режим - режим — '''cache=writeback'''. Грубо говоря, cache=writeback увеличивает результат следующего теста:
fio -name=test -ioengine=libaio -direct=1 -bs=4k -iodepth=1 -rw=randwrite -filename=/dev/vdb # без -fsync и без -sync
...примерно …примерно приводя его к результату того же теста с <tt>iodepth=32</tt>.
{{Note}} ОДНАКО, есть НЮАНСЫ (как всегда с цефом...цефом…):
* Если RBD-образ пустой и при этом на нём включён object-map (по умолчанию включён, см. <tt>rbd info <pool>/<image></tt>), то сброс кэша становится однопоточным И ФИГ ВЫ ВИДИТЕ улучшение результата fio.
* Если опция rbd_cache_writethrough_until_flush равна true (так по умолчанию), то до первого fsync кэш не работает. То есть, если вы монтируете к виртуалке диск и сразу тестируете его вышеприведённой командой - командой — вы опять-таки не увидите хороших результатов.* Из-за той же опции, стоящей в true, cache=unsafe не работает вообще. В Proxmox включен патч, который заставляет qemu ставить эту опцию автоматически. Если у вас не Proxmox - Proxmox — опцию нужно прописать в конфиг глобально: rbd_cache_writethrough_until_flush=false.* Сам кэш может являться тормозом в SSD-кластерах. Что-то там сделано с блокировками, что-то там однопоточное, всё это оптимизируют, но пока не оптимизировали. Например, 4K randwrite Q128 с rbd_cache=false может достигать 20000 iops, а с rbd_cache=true - true — только 11000 iops. Для говнософта, который пишет на диск абы как, это торможение оправдано, а для, например, СУБД - СУБД — нет. Поэтому в случае, если у вас SSD и вам нужны в первую очередь random iops, то правильный режим - режим — '''cache=none'''.
=== ФС ===
А ещё тормозит файловая система! Конкретно, если у вас не включена опция <tt>mount -o lazytime</tt>, то при каждой мелкой записи ФС обновляет mtime, то есть время модификации inode-а. Так как это метаданные, а ФС журналируемые — журналируемые — это изменение журналируется. Из-за этого при тесте <tt>fio -sync=1 -iodepth=1 -direct=1</tt> поверх ФС без lazytime iops-ы уменьшаются в 3-4 раза.
Для lazytime нужны свежие ядра: с ext4 — ext4 — хотя бы 4.0, с XFS — XFS — хотя бы 4.17. Также нужны соответствующие (свежие) util-linux (подсказка: в протухшей 7-й центоси их нет, поставить можно только из исходников).
А если у вас (не дай бог) внутри Oracle, то ему надо обязательно поставить опцию FILESYSTEMIO_OPTIONS=SETALL.

Навигация