Linux下如何查看块设备的队列深度 优化磁盘IO吞吐量

落雪吖_4109

落雪吖_4109

2026-04-10

798人浏览

原创

linux中查看块设备队列深度需分设备类型:scsi/sas设备读取/sys/block//device/queue_depth;nvme设备则查/sys/block/nvme0n1/device/queue_count及各队列depth,或用nvme get-ns-id;ide等非scsi设备该路径不存在。

linux下如何查看块设备的队列深度 优化磁盘io吞吐量

查看块设备当前队列深度(queue_depth)

Linux内核为每个SCSI/SAS/NVMe块设备维护一个硬件队列深度,它直接限制该设备同一时刻能并行处理的I/O请求数。这个值不是由系统管理员随意设定的,而是由驱动从设备固件中读取或根据协议协商得出,但可被手动调整(需谨慎)。最直接的查看方式是读取/sys/block/<device>/device/queue_depth</device>:

  • 例如查 sda:运行 cat /sys/block/sda/device/queue_depth;若报错“No such file or directory”,说明该设备不走SCSI子系统(如部分NVMe或IDE模拟设备)
  • 对NVMe设备,应查 /sys/block/nvme0n1/device/queue_count 和每个队列的深度(/sys/block/nvme0n1/device/queue/0/depth),但更常用的是 nvme get-ns-id /dev/nvme0n1 中的 nn(命名空间数)和控制器能力
  • 注意:queue_depth 是单个LUN的深度,而多路径(multipath)设备会聚合多个路径,实际有效并发受 multipathd 配置和底层路径 queue_depth 共同影响

修改 queue_depth 的风险与正确时机

盲目增大 queue_depth 不仅不能提升吞吐,反而可能引发设备固件 hang、超时重试风暴甚至数据损坏。只有在确认以下条件同时满足时才考虑调优:

  • 设备本身支持更高深度(查厂商文档或用 sg_inq /dev/sda 看 VPD页,重点看 “Maximum Queue Depth” 字段)
  • I/O负载长期处于高并发、低延迟敏感场景(如OLTP数据库、高频小IO随机写),且 iostat -x 1 显示 avgqu-sz 持续接近或等于当前 queue_depth,同时 %util 接近100% 且 r_await/w_await 明显升高
  • 驱动已启用 tag-based I/O(如 scsi_mod.use_blk_mq=1)且内核 ≥ 4.12;老内核用 legacy queue 机制,改 depth 效果有限
  • 修改必须在设备空闲时进行:先 echo 0 > /sys/block/sda/device/delete(移除设备),再 echo 新值到 queue_depth,最后 rescan;NVMe 通常不支持运行时修改 depth

真正影响磁盘IO吞吐的其实是 blk-mq 队列数与调度器协同

现代Linux(≥4.0)默认启用 blk-mq(multi-queue block layer),此时单个 queue_depth 只是每个硬件队列的容量,真正决定并发能力的是「硬件队列总数 × 单队列深度」。例如 NVMe 控制器常有 64 个队列,每队列默认深度 1024,理论最大并发达 65536 —— 但应用层是否真能打满,取决于:

Zynq Linux Hardware Debug
Zynq Linux Hardware Debug

Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。

下载
  • io scheduler 是否禁用(SSD/NVMe 应设为 none,避免额外延迟;机械盘才用 mq-deadline 或 bfq):检查 cat /sys/block/nvme0n1/queue/scheduler,写 none 生效
  • 应用是否使用异步I/O(libaio + io_submit)或 io_uring;同步 write() 无法利用多队列并行性
  • 文件系统挂载参数:ext4/xfs 需加 noatime,nodiratime,commit=30 减少元数据刷盘争抢;XFS 推荐 logbsize=256k 提升日志吞吐

验证优化是否生效的关键指标

改完别急着看带宽数字,先确认底层机制是否按预期工作:

  • 用 cat /sys/block/sda/device/queue_depth 和 ls /sys/block/sda/device/queue/(看是否有多个 queue/ 子目录)确认 mq 已启用且 depth 已更新
  • 运行 iostat -x 1 观察:优化后 avgqu-sz 应稳定在新 depth 的 60–80%,r/s+w/s 上升,r_await/w_await 下降,且 %util 不再长期 100%
  • 用 perf record -e block:block_rq_issue,block:block_rq_complete -a sleep 10 抓取块层事件,再 perf script | grep sda 看 request issue 到 complete 的延迟分布,确认无大量 >100ms 的离群点

队列深度只是I/O栈中一环,脱离设备能力、驱动模型和应用I/O模式单独调它,大概率白忙活。尤其在虚拟化环境里,宿主机的 queue_depth 设置可能被QEMU透传逻辑覆盖,这时得去查 virsh dumpxml 里的 <driver name="qemu" queues="N"></driver> 配置。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

linux

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

5427

5

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.10

2368

6

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

2023.11.13

2831

4

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.29

865

3

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2585

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3841

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2831

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

927

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2507

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习