Bagikan melalui


sys.dm_os_linux_disk_stats (Transact-SQL)

Berlaku untuk: SQL Server 2025 (17.x) di Linux

Mengembalikan tabel dengan statistik I/O disk untuk setiap perangkat Linux, memperlihatkan total aktivitas di luar SQL Server, di SQL Server 2025 (17.x) Pembaruan Kumulatif (CU) 1 dan versi yang lebih baru.

DMV mengembalikan satu baris per perangkat disk Linux.

Nama kolom Jenis data Bisa bernilai null Description
dev_name nvarchar(256) Tidak. Nama perangkat.
major_num bigint Tidak. Nomor perangkat utama.
minor_num bigint Tidak. Nomor perangkat minor.
reads_completed bigint Tidak. Jumlah bacaan selesai.
reads_merged bigint Tidak. Jumlah bacaan yang berdekatan digabungkan ke dalam satu permintaan.
sectors_read bigint Tidak. Jumlah sektor yang dibaca.
read_time_ms bigint Tidak. Milidetik menghabiskan layanan bacaan.
writes_completed bigint Tidak. Jumlah penulisan yang diselesaikan.
writes_merged bigint Tidak. Jumlah penulisan yang berdekatan yang digabungkan ke dalam satu permintaan.
sectors_written bigint Tidak. Jumlah sektor yang ditulis.
write_time_ms bigint Tidak. Milidetik dihabiskan untuk melayani penulisan.
ios_in_progress bigint Tidak. Jumlah IO yang saat ini dalam antrean permintaan.
io_time_ms bigint Tidak. Milidetik yang dihabiskan perangkat untuk melakukan I/O.
weighted_io_time_ms bigint Tidak. Jumlah milidetik tertimbang yang dihabiskan untuk melakukan I/Os.

Permissions

VIEW SERVER PERFORMANCE STATE Memerlukan izin pada server.

Komentar

  • Cakupan tingkat host: Hasilnya mencerminkan semua aktivitas pada perangkat, termasuk SQL Server, layanan lain, dan operasi sistem latar belakang. Untuk mengaitkan efek beban kerja database, kaitkan hasil ini dengan statistik tunggu SQL Server, seperti WRITELOG dan PAGEIOLATCH_*.

  • Menginterpretasikan kolom waktu:

    Ukur Kalkulasi
    Latensi baca rata-rata (ms/op) read_time_ms / NULLIF(reads_completed, 0)
    Latensi tulis rata-rata (ms/op) write_time_ms / NULLIF(writes_completed, 0)
    Pemanfaatan perangkat (%) selama interval io_time_ms / (elapsed_ms) * 100
    Panjang antrean rata-rata weighted_io_time_ms / elapsed_ms
  • Unit sektor: Linux biasanya melaporkan sektor dalam unit 512 byte. Validasi ukuran sektor lingkungan Anda dan sesuaikan perhitungan yang sesuai.

  • Gunakan dengan hati-hati di host multipenyewa: Nilai tinggi dapat berasal dari beban kerja non-SQL Server. Berkorelasi dengan alat sistem atau DMV lain untuk atribusi.

Gunakan DMV ini dengan DMV khusus Linux lainnya untuk pemantauan holistik:

Skenario penggunaan

  • Kelambatan flush log (grup ketersediaan atau mandiri): Tinggi write_time_ms / writes_completed dengan peningkatan io_time_ms menunjukkan latensi tulis tingkat perangkat. Menguatkan dengan WRITELOG menunggu.

  • Titik pemeriksaan atau baca beban kerja berat: Naik read_time_ms / reads_completed dengan throughput berkelanjutan read_MBps yang dibatasi oleh latensi. Pertimbangkan pengaturan tingkat penyimpanan atau antrean.

  • Tetangga yang berisik pada host bersama: Lonjakan dan device_utilization_pctavg_queue_length tanpa perubahan beban kerja SQL Server yang sesuai menyiratkan tekanan I/O eksternal. Validasi dengan pemantauan host.

Examples

A. Rekam jepret aktivitas perangkat saat ini

Kueri ini mengembalikan rekam jepret aktivitas untuk perangkat penyimpanan saat ini.

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. Latensi dan throughput melalui jendela sampel 10 detik

Skrip mengambil sampel DMV dua kali dan menghitung delta untuk latensi (milidetik per operasi), throughput (MB per detik), pemanfaatan (persentase), dan panjang antrean. Sesuaikan agar sesuai dengan @SectorBytes konfigurasi perangkat Anda.

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. Mengidentifikasi perangkat dengan rasio penggabungan tinggi

Contoh ini mengidentifikasi perangkat dengan rasio penggabungan tinggi, menunjukkan kemungkinan coalescing 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. Tonton kedalaman antrean langsung

Contoh ini menunjukkan kedalaman antrean langsung, yang berguna untuk triase insiden.

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;