Новый слой хранения Vitastor (с WA=1)

Как прокачать иопсы вновь

Виталий Филиппов

Vitastor

  • vitastor.io
  • Распределённая ПСХД (SDS)
  • Исходные цели:
    🚀 Низкая задержка (~0.1 мс)
    🚀 Низкое потребление CPU
  • Блочная + ФС и S3
  • «Умная», не сетевой RAID

Что появилось за 3 года

Примеры:

0.6-0.7 — Много исправлений зависаний, падений

0.8.9 — Стабилизация тестов и CI

1.3.0 — RDMA без ODP

1.4.0 — VDUSE в CSI

1.6.0 — Обработка ENOSPC

1.10.1 — Ускорение failover

  • Стабильность, CI
  • Сайт и документация
  • Куча новых фич
  • Удобство

0.7.0 — NFS

1.0.0 — Чексуммы

1.5.0 — VitastorFS & KV 😎

1.7.0 — I/O треды, Antietcd

1.9.0 — OpenNebula

2.0.0 — S3 😎😎

2.2.0 — Локальные чтения

0.8.0 — udev & vitastor-disk

0.8.7 — Онлайн конфигурация

1.4.0 — Автотюнинг ребаланса

1.6.0 — Иерарх.домены отказа

1.7.0 — Prometheus

1.9.x — dd, resize, автовыбор block_size

1.10.0 — Автонастройка RDMA

А что не изменилось?

Блочный слой хранения по американским чертежам

Старый слой хранения кратко

Контракт хранилища

  • ID: inode:offset, 128 КБ объекты
  • Частичное чтение/запись
  • Номер версии++ при каждой записи...
  • Атомарная запись!
    (сеть менее стабильна, чем диск)
  • 2-фазная запись для EC (write → commit)
    (против "raid write hole")

Плюсы схемы

  • Нет оверхеда файловой системы
    Нет оверхеда Copy on Write
    ⇒ Низкое потребление CPU
  • Мало меты — 36 байт на объект (~290 МБ на 1 ТБ)
  • Низкая задержка ≈ задержке диска
  • Журнал ↔ буфер записи (SSD+HDD)
?

Минусы схемы

  • Write Amplification по 4 КБ — 3-5x
  • В памяти 2x меты
  • EC: не коммитим → зависаем
  • Недружелюбно к HDD (случайная запись)
  • (!!!) Мету некуда расширять

Расширения меты

  • Могилки 🪦
    • Атомарное удаление
    • Discard
    • Распределённый SSD-кэш (tiering)
  • Динамические блоки данных
  • Сжатие
  • Локальный SSD-кэш (bcache)

Первая идея

Добавить в мету № блока
😢 Опять 2x памяти (нужны raw блоки)
😢 Никак не помогает с WA

Вторая идея

Писать в конец

Вторая идея

😊 Амортизация ⇒ память 1x, WA ↓↓

Вторая идея

😢 Нужен Compaction (LSM?..) ⇒ WA ↑↑, CPU ↑↑

ВНЕЗАПНО

Это же журнал
У нас уже есть журнал...
— Мам, давай купим дырокол
— У нас уже есть дырокол дома
Дырокол дома:

Идея № 3

Уберём журнал!

Вместо Compaction...

Можно просто отслеживать мусор

При удалении — нетривиально (но мы смелые)

Побочный эффект

Потерял 1 блок — выкинь весь диск

Как решить?

Все записи одного объекта в один блок...

...Но это не LSMeta, и WA ↑↑

Однако идея меня пленила

NonLSM: ветка heap-meta

  • 65 files changed, 11489 insertions(+), 6655 deletions(-)
  • Проходит все тесты
  • cpp-btree → 🤣 swissmap robin_hood_map
  • Атомики (см. дальше)
  • Итого 176000 randwrite (~1.75x)
  • 😢 Костыли (объект ограничен 1 блоком)
  • 😢 WA — строго 3x или 2x

Возврат к LSMeta

Решил переписать ещё раз

Ради WA 1 можно потерпеть инвалидацию 😇

Вместо журнала — буферная область

В памяти — hashmap и связные списки

Лирическое отступление

Без оптимизации по CPU всё это бессмысленно!

Копирование памяти, (де)сериализация, потоки, блокировки... 👎👎👎

Write Amplification

WA 3+побеждаем LSМетой
WA 2 — двойная запись данных
WA 1 — как?

Всё, делаем CoW FS?

Не хочется — медленно
На помощь приходит AWUPF
AWUPF

Linux 6.11 To Introduce Block Atomic Writes –
Including NVMe & SCSI Support

  • Добавлен флаг RWF_ATOMIC (неделимость запросов)
  • Добавлены параметры в /sys/block/*/queue/

Атомарная запись в NVMe

Atomic Write Unit Normal (AWUN): This field indicates the size of the write operation guaranteed to be written atomically to the NVM across all namespaces with any supported namespace format during normal operation. This field is specified in logical blocks and is a 0’s based value. — неинтересно

Atomic Write Unit Power Fail (AWUPF): This field indicates the size of the write operation guaranteed to be written atomically to the NVM across all namespaces with any supported namespace format during a power fail or error condition.
— то, что нужно!

Samsung PM9A3 😢

root@c3-3:~# nvme id-ctrl -H /dev/nvme1 NVME Identify Controller: mn : SAMSUNG MZQL23T8HCLS-00A07 ... awun : 65535 awupf : 0 [фиг вам]

Micron 7450 / 7500

root@c3-3:~# nvme id-ctrl -H /dev/nvme1 NVME Identify Controller: mn : MTFDKCC3T8TGP-1BK1DABYY ... awun : 63 awupf : 63 [256 КБ]

Kioxia (Toshiba) CD7-R / CD8-R

root@c3-3:~# nvme id-ctrl -H /dev/nvme1 NVME Identify Controller: mn : VV007680LYDTV ... awun : 65535 awupf : 63 [256 КБ]

Где ещё есть атомарность

  • SCSI: WRITE ATOMIC (enterprise)
  • NVMe: атомарный_блок = (AWUPF+1) * блок
  • SSD: 4 КБ — блок трансляции (иногда больше)

⇒ На SSD/NVMe 4 КБ атомарны всегда!
...хорошо, а то Vitastor на это уже полагается 🤣

SSD-переростки

D5-5536 на 122 TB — блок 16 КБ

HDD

4 КБ атомарны неофициально
ECC в секторах, авторотация

Опыты с Micron 7450

Пишем по xxx КБ → рубим питание → проверяем

  • USB-NVMe — не работает (буфер?)
  • PCIe — ОК! но atomic_write_max_bytes = 128 КБ — ?
  • max_hw_sectors_kb = 128 — ?
  • Хардкод в ядре. iommu вкл → 128 КБ, выкл → 256 КБ
  • Итого: РАБОТАЕТ!

Как задействовать

MySQL: innodb_doublewrite=OFF

Vitastor: ???

Как задействовать

Намерения записи (Write Intent)

  1. "Сейчас обновлю блок, CRC32=..."
  2. Пишем прямо на диск данных
  3. Упали — сверяем CRC32
    Не совпадает ⇒ версия старая
    Совпадает ⇒ версия новая

Ветка LSMeta + Write Intent

  • 36 files changed, 3229 insertions(+), 3708 deletions(-)
  • WA ~1.0x!
  • Micron/Kioxia или и ≤ 4 КБ запись
  • 2x задержка на практике та же — ~29 μs!

Результаты randwrite 4 kb (fio_blockstore)

Потребление памяти

Что храним
2.4.1 Сырые блоки + cpp-btree + журнал
heap Блоки с запасом 20% + hashmap
lsmeta Отдельные malloc + hashmap + связный список

 

Потребление памяти на 1 ТБ*

SSD SSD (256 КБ) HDD (1 МБ)
2.4.1 663 МБ 371 МБ 152 МБ
heap 740 МБ 412 МБ 165 МБ +11%
...в лучшем случае. А в худшем — всё, что выделено на диске 🤣
lsmeta 785 МБ 456 МБ 154 МБ +18%

* без учёта чексумм (ещё 128 МБ .. 1 ГБ на 1 ТБ)

Умная SDS со скоростью RAI(N)

  • Релиз скоро 😊
  • WA 1 — больше не узкое место!
  • Новое хранилище — опция
  • Нужны Micron/Kioxia
  • Заходите в чат за тестовой версией 😇
  • В прод лучше попозже 😇

Контакты

Голосуйте за доклад ↑
https://vitastor.io/presentation/hl2025/