sys.dm_os_linux_disk_stats(Transact-SQL)

适用于: 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 等待统计信息(例如和WRITELOGPAGEIOLATCH_*相关联。

  • 解释时间列

    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_pctavg_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;