Linux内核学习轨迹第七部:IO调度器(第五节)

一文解析block io生命历程 每个队列可以配置一个io scheduler,即IO调度器,常见的有noop, deadline, cfq等,电梯调度进一步把request请求进行合并和排序,根据所选择的算法(根据时间片,进程优先级,同步异步等因素),决定下一个dispatch的request请求。每个进程在下发IO请求后,会把自己置于wait队列,当IO请求返回时,通过自下而上的层层回调,最后调到wait_on_page_locked把当前page的waiter进程唤醒,从而完成了整个block IO的生命历程。 阅读详情

5. IO调度器全解析:none/mq-deadline/kyber/bfq

IO调度器是Linux块层的核心组件,位于blk-mq软件队列与硬件队列之间,是IO性能调优的核心抓手。它的核心职责是对上层下发的IO请求做合并、排序、优先级调度、公平性控制,解决两大核心问题:一是减少机械硬盘的磁头寻道开销,最大化吞吐量;二是控制IO延迟、解决IO饥饿、保证业务的服务质量。
Linux 6.0内核完全移除了传统单队列架构的调度器(cfq、传统deadline、noop),仅保留适配blk-mq多队列架构的调度器。本章节基于Linux 6.6 LTS内核,完整拆解生产环境主流的4个调度器:none(原noop)、mq-deadline、kyber、bfq,包括设计思想、核心实现、适用场景、调优方案与避坑指南。

5.1 IO调度器的核心设计目标

所有IO调度器都围绕以下核心目标设计,不同调度器在不同目标上做了取舍:
  1. 最大化吞吐量:通过IO合并、扇区排序,减少机械硬盘的磁头寻道次数,提升磁盘的有效IO吞吐量;
  2. 控制IO延迟:保证同步IO、关键业务IO的低延迟,避免长尾延迟恶化;
  3. 解决IO饥饿:避免某一类IO(如随机读)被另一类IO(如大块顺序写)长时间阻塞,导致请求饿死;
  4. 保证公平性:在多进程/多租户场景下,保证每个进程/租户能公平占用IO资源,避免单个进程占用所有IO带宽;
  5. 适配硬件特性:针对机械硬盘、SSD、NVMe等不同存储硬件的特性,做针对性的优化,最小化CPU开销。

5.2 主流IO调度器深度拆解

5.2.1 none调度器(原noop调度器)
none调度器是blk-mq架构下的无操作调度器,对应传统单队列架构的noop调度器,是Linux 6.6内核NVMe设备的默认调度器。
核心设计思想
none是最简单的调度器,不做任何IO排序、优先级调度、延迟控制,仅做最基础的前后IO合并,完全按照FIFO(先进先出)的顺序把请求下发给驱动。它的核心设计逻辑是:现代NVMe SSD内部的FTL(闪存转换层)已经实现了高级的IO调度、磨损均衡、垃圾回收,内核层的排序调度只会带来额外的CPU开销,没有任何性能收益。
核心实现原理
none调度器的源码实现极简,核心逻辑只有两点:
  1. IO合并:新请求入队时,仅尝试和队列中已有的请求做前向/后向合并,不做任何排序;
  2. FIFO下发:请求入队后,直接加入到硬件队列的分发链表,按照入队顺序下发给驱动,没有任何调度逻辑。
核心特性与适用场景
  • 优势:CPU开销极低,完全无锁调度,最大化发挥NVMe多队列硬件的并行能力,随机IO场景下IOPS最高、延迟最低;
  • 劣势:无任何公平性、延迟控制、饥饿保护机制,机械硬盘场景下吞吐量极差,多进程大流量顺序写会导致读请求严重饥饿;
  • 最佳适用场景:所有NVMe SSD/企业级SSD场景、随机IO为主的业务(数据库、KV存储、高频交易)、多核多队列硬件环境。

5.2.2 mq-deadline调度器
mq-deadline是传统单队列deadline调度器的blk-mq适配版,是机械硬盘HDD的默认调度器,也是生产环境HDD场景的首选。
核心设计思想
mq-deadline的核心目标是解决IO饥饿问题,同时最大化机械硬盘的吞吐量。它给每个IO请求设置一个「截止时间」,保证请求不会被长时间饿死,同时通过扇区排序减少磁头寻道开销。针对读写的业务特性做了差异化设计:读请求通常是同步阻塞的,对延迟更敏感,因此读的截止时间更短,优先级更高;写请求通常是异步的,对延迟不敏感,截止时间更长。
核心实现原理
mq-deadline的核心是4个独立的队列+双逻辑:

1.4个核心队列:

  • 读排序队列:按IO请求的起始扇区升序排序,用于减少磁头寻道,提升吞吐量;
  • 读截止队列:按IO请求的截止时间升序排序,用于保证读请求不会饿死;
  • 写排序队列:同读排序队列,用于写请求的扇区排序;
  • 写截止队列:同读截止队列,用于写请求的饥饿保护。

2.截止时间默认配置(可通过sysfs调整):

  • 读请求截止时间:500ms;
  • 写请求截止时间:5000ms;
  • 写饥饿阈值:当连续处理了16个写请求后,必须处理一次读请求,避免读请求被饿死。

3.核心调度逻辑:

  1. 新请求入队时,同时加入排序队列和截止队列,设置对应的截止时间;
  2. 调度器优先从排序队列取请求,最大化吞吐量;
  3. 每次调度前,先检查截止队列中是否有超时的请求,如果有,优先处理超时的请求,保证不会饿死;
  4. 当连续处理的写请求达到阈值后,强制切换到读队列处理,保证读请求的优先级。
核心特性与适用场景
  • 优势:完美适配机械硬盘的物理特性,吞吐量最高,同时有效解决IO饥饿问题,保证读请求的低延迟,稳定性极强,20+年生产环境验证;
  • 劣势:对NVMe SSD优化不足,有一定的CPU开销,无公平性保证,多租户场景下无法隔离IO资源;
  • 最佳适用场景:所有机械硬盘HDD/RAID阵列场景、顺序读写为主的业务(大数据、视频存储、日志服务)、混合读写的通用服务器场景。

5.2.3 kyber调度器
kyber是Facebook为NVMe SSD低延迟场景设计的blk-mq专属调度器,在Meta的大规模数据中心经过了生产验证,是低延迟业务场景的首选。
核心设计思想
kyber的核心目标是控制NVMe SSD的IO长尾延迟,保证同步IO的低延迟和可预测性。它完全摒弃了传统的扇区排序逻辑,基于令牌桶算法+多队列深度限制实现调度,核心逻辑是:限制同步读、同步写的最大队列深度,避免IO请求在硬件队列中排队导致延迟升高,同时异步写不做限制,最大化后台写入的吞吐量。
核心实现原理
kyber的核心是双令牌桶+动态调优:

1.两个核心令牌桶:

  • 同步读令牌桶:默认令牌数128,同步读请求必须拿到令牌才能入队下发;
  • 同步写令牌桶:默认令牌数32,同步写请求必须拿到令牌才能入队下发;
  • 异步写(脏页回写):无令牌限制,直接下发,不占用同步IO的令牌资源。

2.动态调优逻辑:

调度器会实时统计IO的平均延迟和长尾延迟,动态调整两个令牌桶的大小:如果延迟升高,就减少令牌数,降低队列深度,减少排队延迟;如果延迟低于阈值,就增加令牌数,最大化IOPS。

3.调度优先级:同步读 > 同步写 > 异步写/丢弃/刷新请求,严格保证业务同步IO的优先级,避免后台异步写抢占IO资源。

核心特性与适用场景
  • 优势:专为NVMe SSD设计,CPU开销极低,完美控制99.9%长尾延迟,同步IO的延迟可预测性极强,适配高并发低延迟的业务场景;
  • 劣势:机械硬盘场景完全不适用,无排序逻辑,吞吐量极差;无公平性保证,多租户场景无法隔离IO资源;
  • 最佳适用场景:NVMe SSD低延迟场景、数据库/分布式KV存储、高频交易、在线业务等对长尾延迟敏感的场景。

5.2.4 bfq调度器
bfq(Budget Fair Queueing,预算公平队列)是传统单队列cfq调度器的blk-mq升级版,专为桌面/嵌入式/多租户场景设计,核心目标是保证IO资源的完全公平分配,同时优化交互场景的低延迟。
核心设计思想
bfq的核心是基于权重的完全公平调度,它给每个进程/线程分配一个独立的IO队列,按照进程的权重分配「IO预算」(默认按时间分配,也可按扇区数分配),进程用完预算后,调度器切换到下一个进程的队列,保证所有进程按权重公平占用IO资源。同时对前台交互进程、实时进程做优先级提升,大幅降低桌面场景的应用启动延迟、操作卡顿。
核心实现原理
bfq的核心是独立进程队列+预算分配+优先级提升:

1.Per-Process独立队列:每个进程对应一个独立的IO队列,进程的IO请求只会进入自己的队列,完全隔离,避免不同进程的IO相互干扰;

2.预算分配机制:

  • 每个进程默认权重相同,分配相同的IO预算;
  • 可以通过ionice工具调整进程的IO优先级和权重,高权重进程分配更多的预算;
  • 调度器按照预算比例,给每个队列分配执行时间,预算用完立即切换队列,保证完全公平;

3.交互场景优化:

  • 自动识别前台交互进程、应用启动进程,临时提升其IO优先级和预算,让应用启动更快、操作更流畅;
  • 对后台批量写进程降低优先级,避免后台任务占用IO资源导致前台卡顿;

4.低延迟模式:针对SSD场景优化的低延迟模式,减少预算切换的开销,保证低延迟的同时兼顾公平性。

5.核心特性与适用场景
  • 优势:完美的IO公平性,多进程/多租户场景下IO资源隔离效果极佳,桌面交互场景延迟极低,体验流畅,支持精细化的IO优先级控制;
  • 劣势:CPU开销较高,高并发IO场景下吞吐量不如none/kyber,机械硬盘大吞吐量场景不如mq-deadline;
  • 最佳适用场景:桌面Linux发行版、安卓/嵌入式系统、多租户容器/虚拟机场景、需要精细化IO优先级控制的场景。

5.3 四大调度器核心对比与选型指南

特性维度

none(noop)

mq-deadline

kyber

bfq

核心设计

无调度,仅合并,FIFO下发

截止时间保护+扇区排序,防饥饿+高吞吐

令牌桶+队列深度控制,NVMe低延迟

按进程权重公平分配,保证隔离性

IO排序

无

按扇区升序排序

无

可选排序

延迟优化

无额外延迟,原生硬件延迟

优化读请求延迟,防饥饿

极致优化99.9%长尾延迟

优化前台交互进程延迟

公平性保证

无

无

无

完全公平,按权重分配

CPU开销

极低

低

极低

中高

适配硬件

NVMe SSD/企业级SSD

机械硬盘HDD/RAID阵列

NVMe SSD低延迟场景

桌面/嵌入式/多租户场景

典型业务场景

数据库、KV存储、高频交易、通用NVMe场景

大数据、日志存储、HDD通用服务器

在线业务、低延迟交易、分布式存储

桌面Linux、安卓、容器多租户

生产环境选型最佳实践

1.NVMe SSD场景:

  • 绝大多数通用场景、随机IO为主的业务:优先选none,CPU开销最低,IOPS最高;
  • 对99.9%长尾延迟敏感的在线业务、数据库:优先选kyber,延迟可预测性更强;
  • 多租户容器/虚拟机场景:选bfq,保证IO资源公平隔离。

2.机械硬盘HDD/RAID阵列场景:

  • 所有通用场景、顺序读写为主的业务:必须选mq-deadline,吞吐量最高,防饥饿效果最好;
  • 桌面/嵌入式HDD场景:选bfq,保证交互流畅度。

3.SATA/SAS SSD场景:

  • 企业级SSD:选none/kyber;
  • 消费级SSD:选mq-deadline,消费级SSD的FTL能力较弱,内核排序能提升一定性能。

5.4 IO调度器的配置与调优

5.4.1 调度器的查看与临时配置

1.查看当前设备的调度器:

# 查看sda设备的调度器,中括号标记的是当前生效的调度器
cat /sys/block/sda/queue/scheduler
# 查看所有块设备的调度器
for dev in $(ls /sys/block/ | grep -E 'sd|nvme|hd'); 
do echo 
    "$dev: $(cat /sys/block/$dev/queue/scheduler)"; 
done

2.临时修改调度器(重启失效):

# 把nvme0n1设备的调度器设置为kyber
echo kyber > /sys/block/nvme0n1/queue/scheduler
# 把sda设备的调度器设置为mq-deadline
echo mq-deadline > /sys/block/sda/queue/scheduler

3.永久配置调度器:

  • 方式1:通过udev规则配置,编辑/etc/udev/rules.d/60-io-scheduler.rules:
# NVMe设备默认使用kyber调度器
ACTION=="add|change", KERNEL=="nvme*n1", ATTR{queue/scheduler}="kyber"
# SATA/SAS HDD设备默认使用mq-deadline调度器
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
# SATA SSD设备默认使用none调度器
ACTION=="add|change", KERNEL=="sd*", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"

  • 方式2:通过内核启动参数配置,在grub的GRUB_CMDLINE_LINUX中添加:
elevator=mq-deadline

执行update-grub重启生效,该配置会设置所有设备的默认调度器。
5.4.2 各调度器的核心调优参数
所有调度器的调优参数都在/sys/block/[设备名]/queue/iosched/目录下,针对不同调度器有不同的可调参数。

1.mq-deadline调度器调优参数:

参数

核心含义

默认值

调优建议

read_expire

读请求的截止时间,单位毫秒

500

读延迟敏感场景调小到200;顺序读大文件场景调大到1000

write_expire

写请求的截止时间,单位毫秒

5000

写敏感场景调小到1000;日志写入场景调大到10000

writes_starved

连续处理多少个写请求后,强制处理读请求

16

读优先场景调小到8;写优先场景调大到32

front_merges

是否开启前向合并

1

随机IO场景关闭(设为0),减少CPU开销;顺序IO场景开启

2.kyber调度器调优参数:

参数

核心含义

默认值

调优建议

read_lat_nsec

读请求的目标延迟,单位纳秒

2000000(2ms)

低延迟场景调小到1000000(1ms);高IOPS场景调大到5000000(5ms)

write_lat_nsec

写请求的目标延迟,单位纳秒

10000000(10ms)

同步写敏感场景调小到2000000(2ms);异步写场景调大到20000000(20ms)

3.bfq调度器调优参数:

参数

核心含义

默认值

调优建议

low_latency

低延迟模式开关

1(开启)

桌面场景保持开启;高吞吐量服务器场景关闭(设为0)

timeout_sync

同步进程的最大预算时间,单位毫秒

124

桌面场景调大到200,提升前台进程性能;服务器场景调小到50,提升公平性

max_budget

单个进程的最大IO预算,单位扇区数

0(自动计算)

大文件顺序写场景调大到2048;小文件随机IO场景调小到512

5.5 工程实践避坑指南

1.NVMe SSD不要用mq-deadline调度器:

很多老教程会推荐NVMe用deadline调度器,这是完全错误的。现代NVMe SSD的FTL已经实现了高级的IO调度,内核层的排序只会带来额外的CPU开销,不会提升性能,反而会导致延迟升高。NVMe场景优先用none或kyber。

2.不要混用单队列和多队列调度器:

Linux 6.0之后,传统单队列的cfq、deadline、noop已经被完全移除,很多老教程的配置已经失效,强行配置会导致调度器不生效,回退到none调度器。生产环境必须使用blk-mq原生的4个调度器。

3.调度器选型要匹配硬件,不要一刀切:

不要给所有设备都配置同一个调度器,机械硬盘用mq-deadline,NVMe用none/kyber,桌面场景用bfq,必须根据硬件和业务场景做差异化配置,否则会导致性能严重下降。

4.ionice优先级仅对bfq调度器生效:

ionice工具设置的IO优先级,仅在bfq调度器下生效,其他调度器会忽略优先级配置。很多人误以为设置了ionice就会生效,却不知道调度器不支持,导致优先级配置完全无效。

5.不要随意调大截止时间和队列深度:

很多人为了提升吞吐量,盲目调大mq-deadline的截止时间、kyber的令牌数,会导致IO排队延迟急剧升高,99.9%长尾延迟恶化10倍以上,尤其是在线业务场景,必须优先保证延迟,再追求吞吐量。
滴滴Linux内核工程师校招笔试复盘:进程、内存与网络考点全解析 Linux内核是操作系统的核心,涵盖进程调度、内存管理、并发同步、网络协议栈等底层机制。理解这些原理,是内核工程师进行性能优化和问题排查的基础。例如,CFS调度器通过虚拟运行时间实现公平调度,伙伴系统与slab分配器配合管理物理内存,RCU机制保障高并发场景下的读写安全。这些机制直接支撑着业务系统在高负载下的稳定性。实际工程中,从定位CPU飙升、优化网络收包路径到容器资源隔离,都离不开对内核关键模块和调试工具(perf、strace)的掌握。本文基于滴滴Linux内核工程师校招笔试的完整复盘,梳理了进程管理 阅读详情

相关推荐

从Linux转QNX:微内核架构与消息传递机制实战解析

实时操作系统(RTOS)在嵌入式与车载领域承担着确定性响应的核心任务,其设计哲学与通用操作系统存在本质差异。微内核架构仅保留线程调度、进程间通信、中断处理与定时器等最小职责,其余服务以用户空间进程形式运行,从而实现故障隔离与高可预测性。这种架构天然适合安全关键场景,但也要求开发者从共享内存思维转向消息传递思维。QNX作为微内核RTOS的代表,通过MsgSend/MsgReceive/MsgReply等IPC原语和优先级继承机制,在保证实时性的同时简化了同步逻辑。在车载仪表、ADAS域控制器、工业控制等对响应

weixin_33851604的博客 399

IO调度器详解(1)

IO调度器详解(1)

phmatthaus的专栏 518

关于【中孚计算机终端保密检查系统】的卸载

卸载中孚计算机终端保密检查系统

码农之路,向死而生 4万+

mq-deadline调度器原理及源码分析

mq-deadline适合于对实时性敏感的程序,它能保证IO在规定的时间内能下发下去,如果下层设备不出问题那么就能保证IO能够在期限内做出响应。

大隐隐于野 1654

VisionMaster位置修正功能深度解析:如何让找圆工具自动跟随移动目标?

本文深度解析海康威视VisionMaster平台的位置修正功能,重点介绍如何通过模板匹配与找圆工具的智能联动实现移动目标的动态追踪。文章详细阐述了工业视觉检测中的坐标系同步原理、模板匹配配置技巧及异常处理策略,为工程师提供了一套完整的工业级解决方案。

uu89012的博客 281

保姆级教程:用LoRA微调Chinese-Mistral-7B模型,并一键部署到Ollama(附完整代码)

本文提供了一份详细的LoRA微调Chinese-Mistral-7B模型的保姆级教程,涵盖环境配置、数据预处理、微调实战、模型量化及Ollama部署全流程。通过实战案例和完整代码,帮助开发者快速构建专属中文大模型,适用于医疗、法律等垂直领域。

weixin_30369041的博客 250

linux磁盘I/O调度器详解

磁盘I/O调度器在Linux系统中扮演着重要角色,它决定了磁盘请求的调度方式,从而影响系统的性能和响应速度。不同的调度器有各自的特点和适用场景。

完颜振江 1123

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

Linux内核学习轨迹第七部:块设备子系统的整体架构(第一节)

线上服务的IO性能瓶颈、磁盘卡顿、数据丢失、存储故障,绝大多数根源都是对块设备子系统的底层机制、IO请求全生命周期、多队列架构、IO调度器的认知不足。,从架构设计、核心数据结构、源码实现、全链路流程、工程实践五个维度,完整拆解块设备子系统与Linux IO栈,同时提供可落地的性能调优、故障排查方案。,内核会对IO请求做合并、排序、批量处理,最大化发挥存储硬件的性能,这是与字符设备最本质的差异。内核提供IO调度器,对请求做合并、排序、优先级调度,优化硬件性能。串口、键盘、终端、声卡。:块设备的核心特征是。

新时代农民工 380

NPU性能榨取手把手教程:RK3588上YOLOv5s多线程部署与120FPS极限探索

RK3588 YOLOv5s多线程部署优化指南 本教程深入解析RK3588芯片上YOLOv5s模型的高性能多线程部署方案。RK3588作为瑞芯微旗舰AIoT芯片,内置三核NPU(6TOPS算力)和硬件加速器(RGA/VPU),为AI推理提供强大支持。通过线程池技术,我们将视频处理的读取、推理、后处理等环节解耦并行,显著提升系统吞吐量。教程详细介绍了从PyTorch到RKNN格式的模型转换流程、INT8量化方法,以及基于RKNN C++ SDK的YOLOv5推理核心实现,帮助开发者最大化发挥RK3588的AI

LXY_LOVE36的博客 973

AIPex:AI + 自然语言驱动的浏览器自动化扩展

AIPex是一款革命性的Chrome扩展,通过AI技术实现自然语言驱动的浏览器自动化。它支持30多种自动化工具,包括智能标签页管理(分组、切换、批量操作)、页面内容提取(文本、链接、元数据)、交互元素操作(点击、滚动)以及表单智能填写等功能。用户只需用自然语言下达指令,即可快速完成复杂的浏览器操作,大幅提升工作效率。AIPex特别适合需要处理大量重复性网页操作的用户,如数据分析师、产品经理等。

blues_C的博客 1127

Linux内核学习轨迹第七部:BIO结构体全解析与IO请求的生命周期(第三节)

BIO通过bi_io_vec数组,把多个不连续的物理内存页,封装到单个BIO中,一次性下发给磁盘,磁盘会把连续的扇区数据,分别写入/读出这些不连续的内存页,极大减少了IO请求数量,降低了硬件中断开销。BIO的本质是(对块设备的一段连续IO操作的标准化封装),它把上层发起的IO请求,拆解为对磁盘连续扇区的读写操作,同时管理IO对应的内存缓冲区、完成回调、错误处理、统计信息等全生命周期信息。理解BIO的结构、字段语义、完整生命周期,是吃透Linux IO栈全链路的核心,也是IO性能调优、故障排查的基础。

新时代农民工 390

uniapp - 实现移动端H5微信公众号网页内置浏览器中预览和下载word文档(doc)、excel表格(xls)、ppt文稿、pdf文档等文件,微信内部打开预览和下载到本地详教程,兼容安卓苹果手机

uni-app,微信公众号,h5,移动端,web平台端,网页,网站,Uniapp微信公众号H5网站,内置浏览器下载文档,如何在微信浏览器中预览office文件,word文档,excel文档,pdf文档,ppt文档,office,微信内置浏览器下载文件,下载文件,在微信浏览器里面实现下载任意文件,H5需要在微信浏览器中下载excel文件,UniApp实现网页在微信内置浏览器中下载文件详细教程,安卓点击下载会提示打开浏览器,后端返回流文件,如何解决无法下载文件,跳转至浏览器下载文件,发送到电脑微信,安卓,苹果,

🏆 前端领域优质创作者 1万+

Linux内核学习轨迹第七部:多队列块层blk-mq深度拆解(第四节)

发起IO的CPU核心只会操作自己对应的软件队列,不会和其他CPU核心产生锁冲突,多核场景下的并行能力得到了质的提升。量身设计的,彻底解决了传统单队列的全局自旋锁竞争瓶颈,实现了IO请求的全链路并行处理,把NVMe设备的IOPS和延迟性能提升了一个数量级,是现代Linux IO栈的核心基石。blk-mq的核心设计目标就是彻底解决这三个问题,通过**「Per-CPU软件队列 + 多硬件队列」的全并行架构**,消除全局锁,最大化发挥多核CPU和多队列硬件的性能。

新时代农民工 420

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Linux内核学习轨迹第七部: 多队列块层blk-mq深度拆解(第四节)

发起IO的CPU核心只会操作自己对应的软件队列,不会和其他CPU核心产生锁冲突,多核场景下的并行能力得到了质的提升。量身设计的,彻底解决了传统单队列的全局自旋锁竞争瓶颈,实现了IO请求的全链路并行处理,把NVMe设备的IOPS和延迟性能提升了一个数量级,是现代Linux IO栈的核心基石。blk-mq的核心设计目标就是彻底解决这三个问题,通过「Per-CPU软件队列 + 多硬件队列」的全并行架构,消除全局锁,最大化发挥多核CPU和多队列硬件的性能。

新时代农民工 346

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux内核学习轨迹第七部:块设备驱动框架与开发流程(第六节)

gendisk必须绑定一个初始化完成的request_queue,驱动通过blk_mq_init_queue()API创建队列,这是Linux 6.6内核的标准API,替代了旧的blk_init_queue()。块设备驱动的核心职责,是把blk-mq层下发的struct requestIO请求,转换为物理存储硬件可识别的指令,控制硬件完成数据读写,并在IO完成后通知内核,完成整个IO链路的闭环。,完整实现了blk-mq驱动的核心流程,可直接编译运行,用于学习和理解驱动开发的核心逻辑。

新时代农民工 345

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux IO调度(电梯算法)以及常用调试方式

Linux内核2.6开始引入了全新的IO调度子系统,IO调度器的总体目标是希望让磁头能够总是往一个方向移动,移动到底了再往反方向走,这恰恰就是现实生活中的电梯模型,所以IO调度器也被叫做电梯。 (elevator)而相应的算法也就被叫做电梯算法。而Linux中IO调度的电梯算法有好如下几种:as(Anticipatory)、cfq(Complete Fairness Queueing)、deadline、noop(No Operation)。具体使用哪种算法我们可以在启动的时候通过内核参数elev...

tugouxp的专栏 3951

Linux内核学习路线:从源码结构到性能调优的实战专栏

操作系统内核是管理硬件与软件资源的核心层,其进程调度、内存管理、文件系统与中断处理等机制直接决定系统性能与稳定性。理解内核源码结构、模块编译加载流程以及ftrace、perf、eBPF等调试工具,是进行内核开发与性能调优的基础。掌握这些技术不仅能帮助开发者定位CPU占用高、内存泄漏、IO延迟大等生产问题,还能深入理解Linux系统的底层协作原理。本专栏围绕内核源码结构、进程调度、内存管理、文件系统与IO、中断同步及调试调优等主题,提供有先后顺序、有实战锚点的学习路线,每篇均包含原理拆解、代码路径追踪与可复现

weixin_32642109的博客 269

Linux 内核中的 IO 调度:从 D 态挂起到故障定位

当进程发起磁盘 I/O 请求时,如果数据未就绪或设备繁忙,进程会进入不可中断睡眠状态(D 态,Uninterruptible Sleep)。这种状态下,进程无法被信号唤醒,只能等待 I/O 操作完成。若底层存储设备响应缓慢或调度器死锁,D 态进程将永久挂起,导致系统负载(Load Average)虚高,甚至引发看门狗重启。以下是一个简单的内核模块,用于统计当前系统中处于 D 态的进程数量,并打印其堆栈信息。此代码需在 Linux 内核开发环境中编译。结构体描述生物块请求。在内核中,IO 调度器通过。

jiang_style的博客 3463

Linux块子系统深度解析:从IO请求路径到生产级优化

块子系统是Linux内核中负责统一调度和管理块设备I/O的核心组件,其本质是介于文件系统与硬件驱动之间的IO流量调控中枢。它通过bio抽象、request封装、多队列调度(blk-mq)及硬件队列映射等机制,决定数据通路的延迟特性、吞吐上限与长尾表现。理解其原理对存储性能调优至关重要——尤其在NVMe、数据库、高并发日志等场景下,调度器选型(如kyber/bfq)、请求合并(merge)、队列深度(nr_requests)与硬件对齐等关键参数,直接影响P99延迟、softirq开销与IO吞吐稳定性。本文聚焦

weixin_30074763的博客 182

Linux IO模型本质:同步异步阻塞非阻塞的物理实现与选型指南

IO模型是高并发系统性能的底层基石,其核心在于操作系统如何协调用户态与内核态的数据流动。同步指调用方线程是否等待结果返回,异步则依赖内核完成后的主动通知(如信号或回调);阻塞表现为进程进入TASK_INTERRUPTIBLE状态挂起,非阻塞则立即返回EAGAIN错误并交由应用轮询决策。这些概念并非抽象分类,而是直接映射到sys_read()路径、epoll_wait()机制、socket选项控制等真实内核行为。技术价值体现在资源效率——BIO线性消耗内存与线程,NIO通过事件驱动实现连接数万级扩展,AIO虽

dejz8829的专栏 390

Linux内核架构图的本质:系统调用执行路径与五大子系统动态协同

Linux内核架构并非静态模块堆叠,而是围绕系统调用(如write)展开的动态执行路径——它揭示数据流向、控制流跃迁与状态驻留位置。理解这一路径需掌握VFS抽象层如何泛化IO、页缓存(page_cache)如何桥接文件系统与内存管理、handle_mm_fault如何实时构建四级页表、submit_bio如何驱动块设备调度,以及调度器与OOM机制如何跨子系统协同决策。这些核心机制共同构成内核运行时的真实骨架,支撑高性能服务器、嵌入式系统及云原生环境下的稳定性与可调试性。本文基于v6.8主线源码,聚焦可验证的

weixin_30512965的博客 289

利用 BLKTRACE 和 BTT 分析磁盘 IO 性能

本文永久链接: https://www.xtplayer.cn/linux/disk/blktrace-btt-test-io/平时我们在 Linux 上查看磁盘 I/O 性能,可能我们首先就会想到 iostat 命令(包含于 sysstat 软件包中)或者 iotop 命令。iostat 或者 iotop 仅提供了汇总的简单视图,其中很重要的参数就是 await,await 表示单个 I/O 所...

IT老男孩 1891

Linux内核devfreq框架:设备功耗协同治理核心机制

devfreq是Linux内核功耗子系统中面向设备的动态频率调节框架,其本质并非简单复刻cpufreq的单点调频逻辑,而是通过设备抽象、负载评估、策略决策与跨域协调四大支柱,构建可调度、可联动、可感知的功耗治理基础设施。它基于设备I/O特征与物理约束建模,支持电压-频率协同、热事件联动及场景化策略注入,广泛应用于移动SoC、AI加速器、ISP和DDR控制器等对能效比敏感的嵌入式场景。作为内核态功耗协同中枢,devfreq为Android PowerHAL、thermal subsystem及定制化gover

weixin_33968104的博客 367
上一篇: Linux内核学习轨迹第七部:多队列块层blk-mq深度拆解(第四节)
下一篇: Linux内核学习轨迹第七部:块设备驱动框架与开发流程(第六节)
WythePlus
博客等级 码龄11年 397粉丝 300原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值