ublk is a new io_uring-based Linux interface for user-space block device drivers, available since Linux 6.0.
It’s not zero-copy, but it’s still a fast implementation, outperforming both NBD and VDUSE iops-wise and may or may not outperform VDUSE in linear I/O MB/s. ublk also allows to recover devices even if the server (vitastor-ublk process) dies.
Example performance comparison
TCP (100G), 3 hosts each with 6 NVMe OSDs, 3 replicas, single client
direct fio | NBD | VDUSE | UBLK | |
---|---|---|---|---|
linear write | 3807 MB/s | 1832 MB/s | 3226 MB/s | 3027 MB/s |
linear read | 3067 MB/s | 1885 MB/s | 1800 MB/s | 2076 MB/s |
4k random write Q128 | 128624 iops | 91060 iops | 94621 iops | 149450 iops |
4k random read Q128 | 117769 iops | 153408 iops | 93157 iops | 171987 iops |
4k random write Q1 | 8090 iops | 6442 iops | 6316 iops | 7272 iops |
4k random read Q1 | 9474 iops | 7200 iops | 6840 iops | 8038 iops |
RDMA (100G), 3 hosts each with 6 NVMe OSDs, 3 replicas, single client
direct fio | NBD | VDUSE | UBLK | |
---|---|---|---|---|
linear write | 6998 MB/s | 1878 MB/s | 4249 MB/s | 3140 MB/s |
linear read | 8628 MB/s | 3389 MB/s | 5062 MB/s | 3674 MB/s |
4k random write Q128 | 222541 iops | 181589 iops | 138281 iops | 218222 iops |
4k random read Q128 | 412647 iops | 239987 iops | 151663 iops | 269583 iops |
4k random write Q1 | 11601 iops | 8592 iops | 9111 iops | 10000 iops |
4k random read Q1 | 10102 iops | 7788 iops | 8111 iops | 8965 iops |
Commands
vitastor-ublk supports the following commands:
map
To create a local block device for a Vitastor image run:
vitastor-ublk map [/dev/ublkbN] --image testimg
It will output a block device name like /dev/ublkb0 which you can then use as a normal disk.
You can also use --pool <POOL> --inode <INODE> --size <SIZE>
instead of --image <IMAGE>
if you want.
vitastor-ublk supports all usual Vitastor configuration options like --config_path <path_to_config>
plus ublk-specific:
--recover
Recover a mapped device if the previous ublk server is dead.--queue_depth 256
Maximum queue size for the device.--max_io_size 1M
Maximum single I/O size for the device. Default:max(1 MB, pool block size * EC part count)
.--readonly
Make the device read-only.--hdd
Mark the device as rotational.--logfile /path/to/log/file.txt
Write log messages to the specified file instead of dropping them (in background mode) or printing them to the standard output (in foreground mode).--dev_num N
Use the specified device /dev/ublkbN instead of automatic selection (alternative syntax to /dev/ublkbN positional parameter).--foreground 1
Stay in foreground, do not daemonize.
Note that ublk_queue_depth
and ublk_max_io_size
may also be specified
in /etc/vitastor/vitastor.conf
or in other configuration file specified with --config_path
.
unmap
To unmap the device run:
vitastor-ublk unmap /dev/ublkb0
ls
vitastor-ublk ls [--json]
List mapped images.
Example output (normal format):
/dev/ublkb0
image: bench
pid: 584536
/dev/ublkb1
image: bench1
pid: 584546
Example output (JSON format):
{"/dev/ublkb0": {"image": "bench", "pid": 584536}, "/dev/ublkb1": {"image": "bench1", "pid": 584546}}