空块设备驱动程序¶
概述¶
空块设备 (/dev/nullb*
) 用于基准测试各种块层实现。它模拟一个 X GB 大小的块设备。它不执行任何读/写操作,只是将它们标记为在请求队列中完成。以下实例是可能的
多队列块层
基于请求。
每个设备可配置的提交队列。
无块层(称为基于 bio)
基于 Bio。IO 请求直接提交到设备驱动程序。
直接接受 bio 数据结构并返回它们。
它们都有一个用于系统中每个核心的完成队列。
模块参数¶
- queue_mode=[0-2]: 默认值: 2-多队列
选择模块应实例化哪个块层。
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-软中断
用于完成到块层的 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。