适用于: Linux 上的 SQL Server 2025 (17.x)
返回一个表,其中包含每个 Linux 设备的磁盘 I/O 统计信息,其中显示了 SQL Server 2025 (17.x) 累积更新 (CU) 1 及更高版本中超出 SQL Server 的总活动。
DMV 为每个 Linux 磁盘设备返回一行。
| 列名称 | 数据类型 | 可为 Null | Description |
|---|---|---|---|
dev_name |
nvarchar(256) | 否 | 设备名称。 |
major_num |
bigint | 否 | 主要设备编号。 |
minor_num |
bigint | 否 | 次要设备编号。 |
reads_completed |
bigint | 否 | 已完成的读取数。 |
reads_merged |
bigint | 否 | 合并到单个请求中的相邻读取数。 |
sectors_read |
bigint | 否 | 读取的扇区数。 |
read_time_ms |
bigint | 否 | 服务读取所花费的毫秒数。 |
writes_completed |
bigint | 否 | 已完成的写入数。 |
writes_merged |
bigint | 否 | 合并到单个请求中的相邻写入数。 |
sectors_written |
bigint | 否 | 写入的扇区数。 |
write_time_ms |
bigint | 否 | 服务写入所花费的毫秒数。 |
ios_in_progress |
bigint | 否 | 请求队列中当前存在的 IO 数。 |
io_time_ms |
bigint | 否 | 设备执行 I/O 所花费的毫秒数。 |
weighted_io_time_ms |
bigint | 否 | 执行 I/O 所花费的加权毫秒数。 |
Permissions
要求具有对服务器的 VIEW SERVER PERFORMANCE STATE 权限。
注解
主机级别范围:结果反映设备上的所有活动,包括 SQL Server、其他服务和后台系统作。 若要将数据库工作负荷效果属性化,请将这些结果与 SQL Server 等待统计信息(例如和
WRITELOG)PAGEIOLATCH_*相关联。解释时间列:
Measure 计算 平均读取延迟(ms/op) read_time_ms / NULLIF(reads_completed, 0)平均写入延迟(ms/op) write_time_ms / NULLIF(writes_completed, 0)设备利用率(%) 间隔 io_time_ms / (elapsed_ms) * 100平均队列长度 weighted_io_time_ms / elapsed_ms扇区单位:Linux 通常报告 512 字节单位中的扇区。 验证环境的扇区大小并相应地调整计算。
在多租户主机中谨慎使用:高值可能源自非 SQL Server 工作负荷。 与系统工具或其他 DMV 关联以用于归属。
将此 DMV 与其他特定于 Linux 的 DMV 配合使用,以便进行整体监视:
使用场景
日志刷新速度缓慢(可用性组或独立):高
write_time_ms/writes_completedio_time_ms水平表示设备级写入延迟。 用WRITELOG等待来证实。检查点或读取繁重的工作负荷:持续
read_time_ms上升 /reads_completedread_MBps建议吞吐量受延迟限制。 请考虑存储层或队列设置。共享主机上的干扰邻居:传入
device_utilization_pct和avg_queue_length不使用相应的 SQL Server 工作负荷更改意味着外部 I/O 压力。 使用主机监视进行验证。
例子
答: 当前设备活动快照
此查询返回当前存储设备的活动快照。
SELECT dev_name,
reads_completed,
read_time_ms,
writes_completed,
write_time_ms,
ios_in_progress,
io_time_ms,
weighted_io_time_ms
FROM sys.dm_os_linux_disk_stats
ORDER BY io_time_ms DESC;
B. 10 秒示例窗口的延迟和吞吐量
该脚本对 DMV 进行两次采样,并计算延迟(每作毫秒)、吞吐量(MB/秒)、利用率(百分比)和队列长度的增量。 调整 @SectorBytes 以匹配设备配置。
DECLARE @SectorBytes AS INT = 512;
-- verify sector size for your environment
DECLARE @SampleMs AS INT = 10000;
IF OBJECT_ID('tempdb..#before') IS NOT NULL
DROP TABLE #before;
IF OBJECT_ID('tempdb..#after') IS NOT NULL
DROP TABLE #after;
SELECT dev_name,
reads_completed,
reads_merged,
sectors_read,
read_time_ms,
writes_completed,
writes_merged,
sectors_written,
write_time_ms,
ios_in_progress,
io_time_ms,
weighted_io_time_ms
INTO #before
FROM sys.dm_os_linux_disk_stats;
WAITFOR DELAY '00:00:10';
SELECT dev_name,
reads_completed,
reads_merged,
sectors_read,
read_time_ms,
writes_completed,
writes_merged,
sectors_written,
write_time_ms,
ios_in_progress,
io_time_ms,
weighted_io_time_ms
INTO #after
FROM sys.dm_os_linux_disk_stats;
WITH deltas
AS (SELECT a.dev_name,
a.reads_completed - b.reads_completed AS d_reads,
a.read_time_ms - b.read_time_ms AS d_read_ms,
a.sectors_read - b.sectors_read AS d_read_sectors,
a.writes_completed - b.writes_completed AS d_writes,
a.write_time_ms - b.write_time_ms AS d_write_ms,
a.sectors_written - b.sectors_written AS d_write_sectors,
a.io_time_ms - b.io_time_ms AS d_io_ms,
a.weighted_io_time_ms - b.weighted_io_time_ms AS d_weighted_io_ms
FROM #after AS a
INNER JOIN #before AS b
ON a.dev_name = b.dev_name)
SELECT dev_name,
-- latency (ms/op)
CAST (d_read_ms / NULLIF (d_reads, 0) AS DECIMAL (18, 2)) AS avg_read_latency_ms,
CAST (d_write_ms / NULLIF (d_writes, 0) AS DECIMAL (18, 2)) AS avg_write_latency_ms,
-- throughput (MB/s)
CAST ((d_read_sectors * @SectorBytes) / (@SampleMs / 1000.0) / 1048576.0 AS DECIMAL (18, 2)) AS read_MBps,
CAST ((d_write_sectors * @SectorBytes) / (@SampleMs / 1000.0) / 1048576.0 AS DECIMAL (18, 2)) AS write_MBps,
-- utilization (%)
CAST (d_io_ms / @SampleMs * 100.0 AS DECIMAL (5, 2)) AS device_utilization_pct,
-- average queue length
CAST (d_weighted_io_ms / @SampleMs AS DECIMAL (18, 2)) AS avg_queue_length
FROM deltas
ORDER BY device_utilization_pct DESC;
C. 识别具有高合并比率的设备
此示例标识合并率较高的设备,指示可能的 I/O 合并。
SELECT dev_name,
reads_completed,
reads_merged,
writes_completed,
writes_merged,
CAST (reads_merged / NULLIF (reads_completed, 0) AS DECIMAL (10, 2)) AS read_merge_ratio,
CAST (writes_merged / NULLIF (writes_completed, 0) AS DECIMAL (10, 2)) AS write_merge_ratio
FROM sys.dm_os_linux_disk_stats
ORDER BY write_merge_ratio DESC, read_merge_ratio DESC;
D. 实时监视队列深度
此示例显示了实时队列深度,这对于事件会审很有用。
SELECT TOP (20) dev_name,
ios_in_progress,
io_time_ms,
weighted_io_time_ms
FROM sys.dm_os_linux_disk_stats
ORDER BY ios_in_progress DESC,
weighted_io_time_ms DESC;