iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux块层多队列中如何引入内核
  • 848
分享到

Linux块层多队列中如何引入内核

2023-06-15 20:06:29 848人浏览 泡泡鱼
摘要

本篇内容主要讲解“linux块层多队列中如何引入内核”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux块层多队列中如何引入内核”吧!首先过目一下多队列架构:以读io为例,单队列和多队列相同

本篇内容主要讲解“linux块层多队列中如何引入内核”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux块层多队列中如何引入内核”吧!

首先过目一下多队列架构:

Linux块层多队列中如何引入内核

以读io为例,单队列和多队列相同的执行路径:

read_pages() { ...   blk_start_plug()    mapping->a_ops->readpages()    blk_finish_plug()   ... } io_schedule() 进程蓄流之后等待io完成 (在blk_MQ_make_request()函数中request的数目大于或者等于16 request_count >= BLK_MAX_REQUEST_COUNT 不需要调用io_schedule(),直接泄流到块设备驱动)

mapping->a_ops->readpages() 会一直调用q->make_request_fn()

generic_make_request()     q->make_request_fn() 调用blk_queue_bio()或者     多队列blk_queue_make_request()       __elv_add_request()

为什么引入多队列:多队列相对与单队列来说,每个cpu上都有一个软队列(使用blk_mq_ctx结构表示)避免插入request的时候使用spinlock,而且如今的高速存储设备,比如支持nvme的ssd(小弟刚买了一块,速度确实快),访问延迟非常小,而且本身硬件就支持多队列,(引入的多队列使用每个硬件队列hctx->delayed_work替换了request_queue->delay_work)  以前的单队列架构已经不能榨干它的性能,而且成为了它的累赘,单队列在插入request和泄流到块设备驱动时,一直有request_queue上的全局spinlock锁,搞得人们都想直接bypass块层的冲动。

单队列插入request时会使用request_queue上的全局spinlock锁

blk_queue_bio() {     ...     spin_lock_irq(q->queue_lock);     elv_merge()     spin_lock_irq(q->queue_lock);     ... }

单队列泄流到块设备驱动时也是使用request_queue上的全局spinlock锁:

struct request_queue *blk_alloc_queue_node()   INIT_DELAYED_WORK(&q->delay_work, blk_delay_work);  blk_delay_work()   __blk_run_queue()     q->request_fn(q);

__blk_run_queue()函数必须在队列锁中,也就是spin_lock_irq(q->queue_lock);

281  * __blk_run_queue - run a single device queue  282  * @q:  The queue to run  283  *  284  * Description:  285  *    See @blk_run_queue. This variant must be called with the queue lock  286  *    held and interrupts disabled.  287  */       288 void __blk_run_queue(struct request_queue *q)  289 {         290         if (unlikely(blk_queue_stopped(q)))  291                 return;  292   293         __blk_run_queue_uncond(q);  294 }

多队列插入request时没有使用spinlock锁:

blk_mq_insert_requests()   __blk_mq_insert_request()     struct blk_mq_ctx *ctx = rq->mq_ctx; (每cpu上的blk_mq_ctx)     list_add_tail(&rq->queuelist, &ctx->rq_list)

多队列泄流到块设备驱动也没有使用spinlock锁:

static int blk_mq_init_hw_queues()   INIT_DELAYED_WORK(&hctx->delayed_work, blk_mq_work_fn);   708 static void blk_mq_work_fn(struct work_struct *work)  709 {                 710         struct blk_mq_hw_ctx *hctx;  711                   712         hctx = container_of(work, struct blk_mq_hw_ctx, delayed_work.work);  713         __blk_mq_run_hw_queue(hctx);  714 }  __blk_mq_run_hw_queue()       没有spinlock锁   q->mq_ops->queue_rq(hctx, rq); 执行多队列上的->queue_rq()回调函数

从下图可以看出系统使用多队列之后的性能提升:

(我自己没测试过性能,凭客观想象应该与下列图相符:) )

Linux块层多队列中如何引入内核

到此,相信大家对“Linux块层多队列中如何引入内核”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Linux块层多队列中如何引入内核

本文链接: https://www.lsjlt.com/news/281508.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux块层多队列中如何引入内核
    本篇内容主要讲解“Linux块层多队列中如何引入内核”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux块层多队列中如何引入内核”吧!首先过目一下多队列架构:以读IO为例,单队列和多队列相同...
    99+
    2023-06-15
  • linux如何罗列状态的内核模块
    ...
    99+
    2024-04-02
  • Linux内核如何实现多核模式
    这篇文章主要介绍Linux内核如何实现多核模式,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在微软Windows 7大行其道的今天,你是否还坚持应用Linux操作系统。如果你是Linux操作系统的老用户。 这里为你讲...
    99+
    2023-06-17
  • 如何进行linux内核模块调试
    这篇文章将为大家详细讲解有关如何进行linux内核模块调试,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 开启虚拟机,虚拟机运行到 kgdb: Waiting for connection ...
    99+
    2023-06-16
  • Linux内核模块参数如何修改
    本篇内容主要讲解“Linux内核模块参数如何修改”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux内核模块参数如何修改”吧!内核模块是Linux操作系统中一个比较独特的机制,采用模块化技术...
    99+
    2023-06-27
  • 如何强制关闭linux的内核模块
    这篇文章主要介绍了如何强制关闭linux的内核模块,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。安装 Kgotobed确保你已经安装了 dkms。它在大多数 Linux 发行...
    99+
    2023-06-16
  • Linux中怎么使用lsmod命令列出内核模块信息
    这篇文章主要讲解了“Linux中怎么使用lsmod命令列出内核模块信息”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中怎么使用lsmod命令列出内核模块信息”吧!1)语法:lsmo...
    99+
    2023-06-27
  • linux中如何修改内核
    今天小编给大家分享一下linux中如何修改内核的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。linux修改内核方法:1、利用...
    99+
    2023-06-29
  • linux如何显示内核引导过程中的内部事件
    ...
    99+
    2024-04-02
  • 如何测试Linux内核入口代码
    本篇内容介绍了“如何测试Linux内核入口代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通用寄存器+d...
    99+
    2024-04-02
  • 如何理解Linux内核中Watchdog
    这期内容当中小编将会给大家带来有关如何理解Linux内核中Watchdog,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在Linux内核中有三个watchdog,它们都需要被悉心的喂养照料,分别是: /d...
    99+
    2023-06-15
  • 如何进行ARM64 Linux内核页表的块映射
    这期内容当中小编将会给大家带来有关如何进行ARM64 Linux内核页表的块映射,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内核文档Documentation/arm64/memory.rst描述了AR...
    99+
    2023-06-15
  • Linux系统中如何分析内核
    本篇文章给大家分享的是有关Linux系统中如何分析内核,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。在Linux系统中,内核是一个很重要的部分,属于Linux系统中的核心程序。...
    99+
    2023-06-28
  • MySQL中如何使用多列索引
    MySQL中如何使用多列索引,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。多列索引我们经常听到一些人说"把WHERE条件里的...
    99+
    2024-04-02
  • linux如何查看当前内核版本是多少
    本文小编为大家详细介绍“linux如何查看当前内核版本是多少”,内容详细,步骤清晰,细节处理妥当,希望这篇“linux如何查看当前内核版本是多少”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。查看方法:1、用una...
    99+
    2023-06-30
  • Linux模块文件如何编译到内核和独立编译成模块
    这篇文章主要介绍“Linux模块文件如何编译到内核和独立编译成模块”,在日常操作中,相信很多人在Linux模块文件如何编译到内核和独立编译成模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux模块文件...
    99+
    2023-06-15
  • Ubuntu系统中如何升级Linux内核
    这篇文章主要介绍“Ubuntu系统中如何升级Linux内核”,在日常操作中,相信很多人在Ubuntu系统中如何升级Linux内核问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Ubuntu系统中如何升级Linu...
    99+
    2023-06-13
  • linux内核中如何切换到nohz与hres
    本篇文章为大家展示了linux内核中如何切换到nohz与hres,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。设计linux内核的那帮家伙想的可真周到啊,前面说过,linux内核的性格就是激情,只要...
    99+
    2023-06-16
  • linux中如何编写自己的并发队列类
    本篇内容介绍了“linux中如何编写自己的并发队列类”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!设计并发队列代码如下:#include &...
    99+
    2023-06-09
  • 如何进行Linux 2.6 内核的嵌入式系统应用
    这篇文章给大家介绍如何进行Linux 2.6 内核的嵌入式系统应用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。随着多媒体技术与通讯技术相结合的信息技术的快速发展和互联网的广泛应用,PC 时代也过渡到了后PC时代。在数...
    99+
    2023-06-16
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作