lsblk -D 仅显示丢弃能力参数(DISC-GRAN、DISC-MAX、DISC-ZERO),不显示IO调度算法或队列深度;调度器需查 /sys/block/sda/queue/scheduler,队列深度需分硬件队列深度和软件层限制查看。

lsblk -D 并不能直接显示块设备的 IO调度算法(I/O scheduler) 或 队列深度(queue depth)。
这是常见的误解。lsblk -D 的作用是显示块设备的 丢弃(discard)能力相关参数,例如:
-
DISC-GRAN:最小可丢弃粒度(如 512B、4K) -
DISC-MAX:单次最多可丢弃大小(如 2G) -
DISC-ZERO:丢弃后是否归零(0/1)
它完全不涉及调度器(如 mq-deadline、kyber、bfq)或队列深度(如 nr_requests、queue_depth)。
✅ 正确查看 IO 调度算法的方法
Linux 中 IO 调度器由内核块层(blk-mq)管理,现代内核(5.0+)多使用 多队列调度器(mq-scheduler),传统 cfq/deadline 已淘汰。
查看当前调度器:
cat /sys/block/sda/queue/scheduler
输出示例:
[none] mq-deadline kyber bfq
方括号 [] 标出当前启用的调度器(这里是 mq-deadline)。
⚠️ 注意:
sda需替换为你的实际设备名(可用lsblk查看);NVMe 设备通常固定为none(绕过软件调度,由硬件自身调度)。
临时切换调度器(重启失效):
echo kyber | sudo tee /sys/block/sda/queue/scheduler
✅ 正确查看 IO 队列深度的方法
队列深度分两类,需区分清楚:
1. 软件队列深度(blk-mq 多队列)
对应每个硬件队列(per-hw-queue)的请求槽位数:
# 查看硬件队列数量(如 NVMe 有 8 个队列) ls /sys/class/block/sda/device/queue/ # 或 cat /sys/block/sda/device/nr_hw_queues # 查看第 0 号硬件队列的深度(常见于 NVMe) cat /sys/block/sda/device/queue_depth # 旧 NVMe 驱动 # 或(新驱动): cat /sys/block/sda/device/nvme*/queue_depth
2. 软件层请求队列限制(legacy / blk-mq 全局限值)
# 传统 single-queue 设备(如老 SATA): cat /sys/block/sda/queue/nr_requests # 默认常为 128 或 256 # blk-mq 设备(主流)该文件可能不存在,实际由 `nr_hw_queues × queue_depth` 决定
3. SCSI 设备额外查看方式
对 SCSI/SAS 磁盘(含部分 SATA):
# 查看设备报告的逻辑队列深度(LUN level) cat /sys/block/sda/device/queue_depth # 查看主机适配器(HBA)队列深度(如 lpfc、mpt3sas) lsscsi -v | grep -A5 "sda" # 或查 HBA sysfs: ls /sys/class/scsi_host/host*/proc_name cat /sys/class/scsi_host/host0/queue_depth
? 快速诊断小脚本(供参考)
DEV=sda echo "=== Device: $DEV ===" echo "Scheduler: $(cat /sys/block/$DEV/queue/scheduler 2>/dev/null || echo 'N/A')" echo "Queue depth (device): $(cat /sys/block/$DEV/device/queue_depth 2>/dev/null || echo 'N/A')" echo "HW queues: $(cat /sys/block/$DEV/device/nr_hw_queues 2>/dev/null || echo 'N/A')" echo "MQ queue_depth (if NVMe): $(cat /sys/block/$DEV/device/nvme*/queue_depth 2>/dev/null | head -n1 || echo 'N/A')"
? 补充说明
-
lsblk -D是只读展示 discard 特性,和调度/队列无关 - 调度器选择影响随机 IO 延迟与吞吐权衡(如
bfq适合桌面,mq-deadline通用,none适合 NVMe) - 队列深度设置过高可能导致设备拥塞,过低则无法打满带宽,需结合设备规格(如 SSD 官方标称队列深度)调整
不复杂但容易忽略——关键在找对 /sys/block/*/queue/ 和 /sys/block/*/device/ 下的正确路径。











