空块设备驱动程序

概述

空块设备 (/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。