企业电子商务网站建设总结,东营的网站建设公司,大旺建设局网站,去哪里找做网站的人我们想象一下#xff0c;你是一个餐厅的厨师#xff0c;你要准备很多不同的菜肴#xff0c;而每种菜肴需要不同的食材和烹饪时间。如果每道菜都按照需要的顺序来准备#xff0c;那么你的工作效率一定会非常低。为了提高效率#xff0c;你会怎么做呢#xff1f;
在linux架…我们想象一下你是一个餐厅的厨师你要准备很多不同的菜肴而每种菜肴需要不同的食材和烹饪时间。如果每道菜都按照需要的顺序来准备那么你的工作效率一定会非常低。为了提高效率你会怎么做呢
在linux架构中Multi-Queue Block Layer就像是一个聪明的餐厅管理员它可以让厨师们同时处理多个订单而不用等待前面的订单完成。这个机制在Linux内核中实现了多个I/O调度队列每个队列处理特定类型的I/O操作。这样当一个进程发出I/O请求时Multi-Queue Block Layer可以将请求分配到对应的队列中让I/O操作并行执行大大提高了系统的性能。
在Linux中blk-mq架构是block layer的一种改进它通过支持多个I/O调度队列来提高系统的并发性和响应性。Multi-Queue Block Layer在内核版本3.14之后引入并在后续版本中得到了进一步的发展和完善。
在blk-mq架构中每个块设备都维护了多个I/O调度队列每个队列对应于一个特定的优先级。当系统接收到I/O请求时根据请求的优先级将其分配到对应的队列中。每个队列都采用自己的I/O调度策略比如先进先出FIFO、最短作业优先SFS等。这种机制可以使得不同优先级的I/O请求能够得到更好的处理和响应。
下面是一个简单的示例代码展示了Multi-Queue Block Layer的基本原理
#include linux/blkdev.h /* 初始化块设备 */
struct gendisk *disk; /* 初始化块设备分区 */
struct hd_struct *part; /* 初始化块设备请求队列 */
struct request_queue *queue; /* 初始化块设备I/O调度器 */
struct elevator_type *elevator; /* 初始化I/O调度参数 */
elevator_param_t elevator_params[]; /* 初始化I/O调度队列 */
struct blk_queue_layer queue_layer; /* 分配I/O调度队列 */
queue_init_queue(queue_layer, disk, part, queue, elevator, elevator_params);
在上述代码中我们首先初始化了块设备、分区、请求队列和I/O调度器等组件。然后我们通过调用queue_init_queue函数来初始化一个blk_queue_layer结构体该结构体表示一个I/O调度队列层。该函数接受多个参数包括块设备、分区、请求队列、I/O调度器和I/O调度参数等。在函数内部会根据指定的参数创建一个新的I/O调度队列并将其添加到对应的块设备的I/O调度队列层中。 在传统的Linux系统中块设备层和IO调度器主要是针对HDDhard disk drivers设计的。由于HDD设备的随机IO性能很差吞吐量大约是几百IOPSIOs per second延迟在毫秒级所以当时IO性能的瓶颈在硬件而不是内核。但是随着高速SSDSolid State Disk的出现并展现出越来越高的性能百万级甚至千万级IOPS的数据访问已成为一大趋势传统的块设备层已无法满足这么高的IOPS需求逐渐成为系统IO性能的瓶颈。为了适配现代存设备高速SSD等)高IOPS、低延迟的IO特征新的块设备层框架Block multi-queueblk-mq应运而生。 Multi-Queue Block Layer分为两层Software Queues和Hardware Dispatch Queues.Softeware Queues是per core的Queue的数目与协议有关系比如NVMe协议可以有最多64K对 IO SQ/CQ。Software Queues层做的事情如上图标识部分。Hardware Queues数目由底层设备驱动决定可以1个或者多个。最大支持数目一般会与MSI-X中断最大数目一样支持2K。设备驱动通过map_queue维护Software Queues和Hardware Queues之间的对接关系。需要强调一点Hardware Queues与Software Queues的数目不一定相等上图1:1 Mapping的情况属于最理想的情况。 在实际应用中blk-mq架构可以显著地提高系统的并发性和响应性。通过支持多个I/O调度队列它可以更好地处理不同优先级的I/O请求并根据不同的I/O负载情况和系统配置进行调优和优化以获得更好的性能和响应性。 blk-mq的映射关系是指将软件队列software queue映射到硬件派发队列hardware dispatch queue的机制。这种映射关系是通过固定的映射关系来实现的。 在blk-mq架构中每个硬件队列都对应一个或多个软件队列这个对应关系是在驱动初始化时通过配置来设定的。通常情况下每个硬件队列会对应多个软件队列这种映射关系可以避免请求队列锁竞争和远端内存访问问题从而提高Block Layer的IOPS吞吐量。 当用例空间向块设备执行IO操作时BLK-MQ会存储和管理这些IO请求并在用户空间、文件系统和块设备驱动程序之间扮演中间件的角色。BLK-MQ通过软件阶段队列和硬件分配队列来实现请求的调度和管理。当请求到达块设备层时它将会尝试最短路径即直接发送到硬件队列。
然而存在两种情况不会这样做
一是存在IO调度器则不能这样做
二是如果我们想让请求合并也不行这样做。
这两个情况下请求将会被发送到软件队列。在软件队列中的请求处理之后它将被放到硬件队列后面即是硬件直接访问硬件处理这些请求。 blk-mq的映射关系解决了blk-sq架构中请求队列锁竞争和远端内存访问问题极大的提高了Block Layer的IOPS吞吐量。同时通过将软件队列映射到硬件派发队列可以更好地处理不同优先级的I/O请求并根据不同的I/O负载情况和系统配置进行调优和优化以获得更好的性能和响应性。