[Документация](../../README-ru.md#документация) → Использование → UBLK

-----

[Read in English](ublk.en.md)

# UBLK

[ublk](https://docs.kernel.org/block/ublk.html) - это новый Linux-интерфейс на основе io_uring
для реализации блочных устройств в пространстве пользователя, доступный, начиная с Linux 6.0.

ublk тоже копирует память (т.е. не является zero-copy), но по IOPS всё равно обгоняет и
[NBD](nbd.ru.md), и [VDUSE](qemu.ru.md#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](#map)
- [unmap](#unmap)
- [ls](#ls)

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