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}}