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。