暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

存储技术中的块设备IO流程

watson 2024-12-24
96

1 框架图

内核块设备IO从上到下大致分为VFS层、文件系统层、通用块层、IO调度层、块设备驱动层和设备层。

图片

2 为什么要blk-mq

blk-mq 是内核 block 层的多队列 IO 框架,适用于高 IOPS 要求的多队列存储设备。

主要原因是 multi-core 和 multi-queue 的发展,性能瓶颈从硬件本身转移到软件层面上,单队列框架对于锁竞争和远端内存访问成为了性能问题。为了减少锁争用和尽可能利用局部性原理,blk-mq 把同时负责提交和派发的单一队列拆分为多层级和多队列。

blk-mq功能在Linux-3.16中成为内核的一个完整特性,在Linux-4.12中实现了基于blk-mq的IO调度器,在Linux-5.0内核中,blk-sq代码已被完全移除,blk-mq成为Linux Block layer的默认选项。

图片

3 函数调用

vfs层sys_write->vfs_write->__vfs_write->new_sync_write->(file->f_op->write_iter(kio, iter))↓文件系统层blkdev_write_iter->__generic_file_write_iter->(O_DIRECT)generic_file_direct_write->(mapping->a_ops->direct_IO(iocb, from))->blkdev_direct_IO->submit_bio                                            ->generic_perform_write->a_ops->write_begin/a_ops->write_end->blkdev_write_begin/blkdev_write_end->__block_commit_write->mark_buffer_dirtygeneric_file_fsync->sync_mapping_buffers->fsync_buffers_list->write_dirty_buffer->submit_bh↓通用块层submit biosubmit_bio->generic_make_request->bio_list_add(bio)                                ->make_request_fn↓将bio计入调度器blk_mq_make_request/blk_queue_bio->elv_bio_merged/add_acct_request->__elv_add_request↓IO调度后flush requestschedule->sched_submit_work     ->blk_schedule_flush_plug->blk_flush_plug_list->blk_mq_flush_plug_list->blk_mq_sched_insert_requests->blk_mq_insert_requests->list_splice_tail_init(插入请求)io_schedule->io_schedule_prepare->↓分发到hardware queuesworkqueue会执行:blk_mq_run_work_fn->__blk_mq_run_hw_queue->blk_mq_sched_dispatch_requests->blk_mq_dispatch_rq_list->(q->mq_ops->queue_rq)↓调用设备驱动接口(举例:访问本地nvme)nvme_queue_rq->nvme_submit_cmd->……

图片

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论