ublk - это новый Linux-интерфейс на основе io_uring для реализации блочных устройств в пространстве пользователя, доступный, начиная с Linux 6.0.

ublk тоже копирует память (т.е. не является zero-copy), но по IOPS всё равно обгоняет и NBD, и VDUSE, и иногда может даже обгонять VDUSE по скорости линейного доступа. Также ublk позволяет оживлять устройства, у которых умер сервер (процесс-обработчик vitastor-ublk).

Пример сравнения производительности

TCP (100G), 3 сервера с 6 NVMe OSD каждый, 3 реплики, один клиент

Прямой fio NBD VDUSE UBLK
линейная запись 3807 MB/s 1832 MB/s 3226 MB/s 3027 MB/s
линейное чтение 3067 MB/s 1885 MB/s 1800 MB/s 2076 MB/s
4k случайная запись Q128 128624 iops 91060 iops 94621 iops 149450 iops
4k случайное чтение Q128 117769 iops 153408 iops 93157 iops 171987 iops
4k случайная запись Q1 8090 iops 6442 iops 6316 iops 7272 iops
4k случайное чтение Q1 9474 iops 7200 iops 6840 iops 8038 iops

RDMA (100G), 3 сервера с 6 NVMe OSD каждый, 3 реплики, один клиент

Прямой fio NBD VDUSE UBLK
линейная запись 6998 MB/s 1878 MB/s 4249 MB/s 3140 MB/s
линейное чтение 8628 MB/s 3389 MB/s 5062 MB/s 3674 MB/s
4k случайная запись Q128 222541 iops 181589 iops 138281 iops 218222 iops
4k случайное чтение Q128 412647 iops 239987 iops 151663 iops 269583 iops
4k случайная запись Q1 11601 iops 8592 iops 9111 iops 10000 iops
4k случайное чтение Q1 10102 iops 7788 iops 8111 iops 8965 iops

Команды

vitastor-ublk поддерживает следующие команды:

map

Чтобы создать локальное блочное устройство для образа, выполните команду:

vitastor-ublk map [/dev/ublkbN] --image testimg

Команда напечатает название блочного устройства вида /dev/ublkb0, которое потом можно будет использовать как обычный диск.

Для обращения по номеру инода, аналогично другим командам, можно использовать опции --pool <POOL> --inode <INODE> --size <SIZE> вместо --image testimg.

vitastor-ublk поддерживает все обычные опции Vitastor, например, --config_path <path_to_config>, плюс специфичные для ublk:

  • --recover
    Восстановить ранее подключённое устройство, у которого умер обработчик.
  • --queue_depth 256
    Максимальная глубина очереди устройства.
  • --max_io_size 1M
    Максимальный размер запроса ввода-вывода для устройства. По умолчанию: max(1 MB, блок данных пула * число частей данных EC).
  • --readonly
    Подключить устройство в режиме только для чтения.
  • --hdd
    Пометить устройство как вращающийся жёсткий диск (флаг rotational).
  • --logfile /path/to/log/file.txt
    Писать сообщения о процессе работы в заданный файл, вместо пропуска их при фоновом режиме запуска или печати на стандартный вывод при запуске в консоли с --foreground 1.
  • --dev_num N
    Использовать заданное устройство /dev/ublkbN вместо автоматического подбора.
  • --foreground 1
    Не уводить процесс в фоновый режим.

Обратите внимание, что опции ublk_queue_depth и ublk_max_io_size можно также задавать в /etc/vitastor/vitastor.conf или в другом файле конфигурации, заданном опцией --config_path.

unmap

Для отключения устройства выполните:

vitastor-ublk unmap /dev/ublkb0

ls

vitastor-ublk ls [--json]

Вывести подключённые устройства.

Пример вывода в обычном формате:

/dev/ublkb0
image: bench
pid: 584536

/dev/ublkb1
image: bench1
pid: 584546

Пример вывода в JSON-формате:

{"/dev/ublkb0": {"image": "bench", "pid": 584536}, "/dev/ublkb1": {"image": "bench1", "pid": 584546}}