Null 块设备驱动程序

概述

null 块设备(/dev/nullb*)用于对各种块层实现进行基准测试。它模拟一个 X GB 大小的块设备。它不执行任何读/写操作,只是在请求队列中将它们标记为完成。支持以下实例:

多队列块层

  • 基于请求。

  • 每个设备可配置提交队列。

无块层(称为 bio-based)

  • 基于 bio。IO 请求直接提交给设备驱动程序。

  • 直接接受 bio 数据结构并返回它们。

所有这些在系统中每个核心都有一个完成队列。

模块参数

queue_mode=[0-2]: 默认值: 2-Multi-queue (多队列)

选择模块应实例化的块层。

0

基于 Bio

1

单队列(已弃用)

2

多队列

home_node=[0--nr_nodes]: 默认值: NUMA_NO_NODE

选择数据结构从哪个 CPU 节点分配。

gb=[大小,单位 GB]: 默认值: 250GB

向系统报告的设备大小。

bs=[块大小(单位字节)]: 默认值: 512 字节

向系统报告的块大小。

nr_devices=[设备数量]: 默认值: 1

实例化的块设备数量。它们被实例化为 /dev/nullb0 等。

irqmode=[0-2]: 默认值: 1-Soft-irq (软中断)

用于向块层完成 IO 的完成模式。

0

无。

1

软中断。使用 IPI 跨 CPU 节点完成 IO。模拟当 IO 从与设备连接的 home 节点不同的 CPU 节点发出时的开销。

2

定时器: 在每个 IO 完成前等待特定时间(completion_nsec)。

completion_nsec=[ns]: 默认值: 10,000ns

结合 irqmode=2 (定时器)。每个完成事件必须等待的时间。

submit_queues=[1..nr_cpus]: 默认值: 1

连接到设备驱动程序的提交队列数量。如果未设置,则默认为 1。对于多队列,当 use_per_node_hctx 模块参数为 1 时,此参数被忽略。

hw_queue_depth=[0..qdepth]: 默认值: 64

设备的硬件队列深度。

memory_backed=[0/1]: 默认值: 0

是否使用内存缓冲区响应 IO 请求

0

不传输数据以响应 IO 请求

1

使用内存缓冲区响应 IO 请求

discard=[0/1]: 默认值: 0

支持丢弃操作(需要内存支持的 null_blk 设备)。

0

不支持丢弃操作

1

启用丢弃操作支持

cache_size=[大小,单位 MB]: 默认值: 0

内存支持设备的缓存大小(单位 MB)。

mbps=[最大带宽,单位 MB/s]: 默认值: 0(无限制)

设备性能的带宽限制。

多队列特定参数

use_per_node_hctx=[0/1]: 默认值: 0

硬件上下文队列的数量。

0

提交队列的数量设置为 submit_queues 参数的值。

1

多队列块层针对系统中每个 CPU 节点实例化一个硬件调度队列。

no_sched=[0/1]: 默认值: 0

启用/禁用 IO 调度器。

0

nullb* 使用默认的 blk-mq IO 调度器

1

nullb* 不使用 IO 调度器

blocking=[0/1]: 默认值: 0

请求队列的阻塞行为。

0

注册为非阻塞 blk-mq 驱动设备。

1

注册为阻塞 blk-mq 驱动设备,null_blk 将设置 BLK_MQ_F_BLOCKING 标志,表明它有时/总是需要在其 ->queue_rq() 函数中阻塞。

shared_tags=[0/1]: 默认值: 0

设备间共享标签。

0

标签集不共享。

1

blk-mq 设备间共享标签集。仅在 nr_devices > 1 时有意义,否则没有标签集可共享。

zoned=[0/1]: 默认值: 0

设备是随机访问或分区块设备。

0

块设备暴露为随机访问块设备。

1

块设备暴露为主机管理的分区块设备。需要 CONFIG_BLK_DEV_ZONED。

zone_size=[MB]: 默认值: 256

当暴露为分区块设备时,每个分区的大小。必须是 2 的幂。

zone_nr_conv=[nr_conv]: 默认值: 0

当块设备为分区设备时要创建的常规分区数量。如果 zone_nr_conv >= nr_zones,它将被减少到 nr_zones - 1。