目录
0.前言
本系列文章主要从null block dev驱动(位于drivers/block/)着手来分析block多队列机制,本文只是简要说明相关环境搭建的方法。
内核版本:kernel 4.19
1.环境搭建方法
使能null block dev driver编译选项
本文选择将null block驱动编译进内核
挂载configfs文件系统
mount -t configfs none /mnt
mkdir -p /mnt/nullb/a
使能null block设备为后备存储设备
echo 1 > /mnt/nullb/a/memory_backed
这样可以对其进行格式化
模拟上电
echo 1 > /mnt/nullb/a/power
格式化为ext文件系统
mkfs.ext2 /dev/nullb0
挂载文件系统
mkdir /tmp
mount /dev/nullb0 /tmp
注:如上如果测试出现问题,可切换到内核5.10上进行测试
2.代码修改
测试时可能会遇到错误,可能需要做如下修改:
(1)由于作为后备存储时默认是250G大小,会导致错误,修改为1G进行测试
--- a/drivers/block/null_blk.h
+++ b/drivers/block/null_blk.h
@@ -132,7 +132,7 @@ static const struct kernel_param_ops null_queue_mode_param_ops = {
device_param_cb(queue_mode, &null_queue_mode_param_ops, &g_queue_mode, 0444);
MODULE_PARM_DESC(queue_mode, "Block interface to use (0=bio,1=rq,2=multiqueue)");
-static int g_gb = 250;
+static int g_gb = 1;
(2)实际测试时需要强制在代码中设置才起作用
--- a/drivers/block/null_blk.h
+++ b/drivers/block/null_blk.h
@@ -508,6 +508,7 @@ static struct nullb_device *null_alloc_dev(void)
return NULL;
}
+ dev->memory_backed = true;
dev->size = g_gb * 1024;
dev->completion_nsec = g_completion_nsec;
dev->submit_queues = g_submit_queues;
(3) 如果测试多队列调度器部分,则需要设置如下参数
@@ -82,7 +82,7 @@ enum {
NULL_Q_MQ = 2,
};
-static int g_no_sched;
+static int g_no_sched = 0;
module_param_named(no_sched, g_no_sched, int, 0444);
MODULE_PARM_DESC(no_sched, "No io scheduler");
3. 测试方法
测试中主要使用了如下工具跟踪函数的调用流程:
ftrace, stack_trace, perf, dd, dump_stack