Поделиться через


sys.dm_os_linux_disk_stats (Transact-SQL)

Применимо к: SQL Server 2025 (17.x) в Linux

Возвращает таблицу со статистикой операций ввода-вывода диска для каждого устройства Linux, показывающую общую активность за пределами SQL Server, в SQL Server 2025 (17.x) накопительного обновления (CU) 1 и более поздних версий.

DmV возвращает одну строку на устройство диска Linux.

Имя столбца Тип данных Нуллибельный 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_time_ms bigint нет Миллисекунда устройства, затраченного на выполнение операций ввода-вывода.
weighted_io_time_ms bigint нет Взвешированное число миллисекундах, потраченных на выполнение операций ввода-вывода.

Permissions

Необходимо разрешение VIEW SERVER PERFORMANCE STATE на сервере.

Замечания

  • Область уровня узла: результаты отражают все действия на устройстве, включая SQL Server, другие службы и фоновые системные операции. Чтобы атрибутировать эффекты рабочей нагрузки базы данных, сопоставляйте эти результаты со статистикой ожидания SQL Server, например WRITELOG и PAGEIOLATCH_*.

  • Интерпретация столбцов времени:

    Мера Расчет
    Средняя задержка чтения (мс/оп) 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. Коррелирует с системными средствами или другими динамическими административными представлениями для присвоения.

Используйте это динамическое административное представление с другими динамическими представлениями linux для комплексного мониторинга:

Сценарии использования

  • Замедление сброса журналов (группы доступности или автономные): высокая write_time_ms / writes_completed с повышенными io_time_ms привилегиями указывает на задержку записи на уровне устройства. Подтверждение с WRITELOG ожиданиями.

  • Контрольная точка или чтение тяжелых рабочих нагрузок. Рост read_time_ms / reads_completed с устойчивой read_MBps пропускной способностью ограничивает пропускную способность, ограниченную задержкой. Рассмотрите параметры уровня хранилища или очереди.

  • Шумные соседи на общих узлах: пики в device_utilization_pct рабочей нагрузке SQL Server и avg_queue_length без соответствующих изменений рабочей нагрузки SQL Server подразумевают внешнее давление ввода-вывода. Проверка с помощью мониторинга узла.

Примеры

А. Текущий моментальный снимок действия устройства

Этот запрос возвращает моментальный снимок действия для текущего устройства хранения.

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;

В. Задержка и пропускная способность в 10-секундном окне

Скрипт дважды примерирует dmV и вычисляет разностные значения задержки (миллисекунд на операцию), пропускную способность (МБ в секунду), использование (процент) и длину очереди. Настройтесь @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;

С. Определение устройств с высокими коэффициентами слияния

В этом примере идентифицируются устройства с высокими коэффициентами слияния, что указывает на возможное объединение операций ввода-вывода.

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;