IO_STALL pertanyaan dan pengertian

9

Saya mengumpulkan IO_STALLS dari sys.dm_io_virtual_file_stats setiap 5 menit dan kemudian melakukan delta untuk melihat file mana yang paling terpengaruh oleh IO.

Dalam satu periode 5 menit saya mendapatkan delta 5826331 ms yaitu 97 menit.

Saya sedikit bingung dengan ini, apakah ini mengatakan bahwa operasi dimulai 97 menit yang lalu baru saja selesai pada saat itu dan karenanya mencatat waktu tunggu itu?

Terima kasih

Kode ditambahkan seperti yang diminta:

/*

USE [SysDBA]
GO
*/
/****** Object:  Table [dbo].[DISKIOPS]    Script Date: 04/07/2013 11:40:15 ******/
/*
DROP TABLE [dbo].[DISKIOPS]
GO
*/
--Create the table
/****** Object:  Table [dbo].[DISKIOPS]    Script Date: 04/07/2013 11:40:15 ******/
/*
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[DISKIOPS](
    [IO_STALL] [bigint] NULL,
    [IO_STALL_READ_MS] [bigint] NULL,
    [IO_STALL_WRITE_MS] [bigint] NULL,
    [NUM_OF_READS] [bigint] NULL,
    [NUM_OF_WRITES] [bigint] NULL,
    [SIZE_ON_DISK_MB] [bigint] NULL,
    [DBNAME] [varchar](max) NULL,
    [NAME] [varchar](max) NULL,
    [FILE_ID] [int] NULL,
    [DB_FILE_TYPE] [varchar](max) NULL,
    [DISK] [varchar](max) NULL,
    [FILE_LOCATION] [varchar](max) NULL,
    [TIMESTAMP] [datetime] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

*/

--Capture IO information from DMV and query to find deltas over time.
/*
USE [SysDBA]
GO

INSERT INTO [dbo].[DISKIOPS]
           ([IO_STALL]
           ,[IO_STALL_READ_MS]
           ,[IO_STALL_WRITE_MS]
           ,[NUM_OF_READS]
           ,[NUM_OF_WRITES]
           ,[SIZE_ON_DISK_MB]
           ,[DBNAME]
           ,[NAME]
           ,[FILE_ID]
           ,[DB_FILE_TYPE]
           ,[DISK]
           ,[FILE_LOCATION]
           ,[TIMESTAMP])
SELECT a.io_stall, a.io_stall_read_ms, a.io_stall_write_ms, a.num_of_reads, 
a.num_of_writes, 
--a.sample_ms, a.num_of_bytes_read, a.num_of_bytes_written,
( ( a.size_on_disk_bytes / 1024 ) / 1024.0 ) AS size_on_disk_mb, 
db_name(a.database_id) AS dbname, 
b.name, a.file_id, 
db_file_type = CASE 
                   WHEN a.file_id = 2 THEN 'Log' 
                   ELSE 'Data' 
                   END, 
UPPER(SUBSTRING(b.physical_name, 1, 2)) AS disk_location,
b.physical_name AS File_location,
GETDATE() AS Timestamp
FROM sys.dm_io_virtual_file_stats (NULL, NULL) a 
JOIN sys.master_files b ON a.file_id = b.file_id 
AND a.database_id = b.database_id
GO
*/
DECLARE @File_Name VARCHAR(8000),
        @Disk VARCHAR(5)
SET @File_Name = 'DBTEST'
SET @Disk = 'I:'
--Code to pull out deltas between collected IO stats.
;WITH IOPS   ([IO_STALL]
           ,[IO_STALL_READ_MS]
           ,[IO_STALL_WRITE_MS]
           ,[NUM_OF_READS]
           ,[NUM_OF_WRITES]
           ,[SIZE_ON_DISK_MB]
           ,[DBNAME]
           ,[NAME]
           ,[FILE_ID]
           ,[DB_FILE_TYPE]
           ,[DISK]
           ,[FILE_LOCATION]
           ,[TIMESTAMP]
           ,[ROW])
AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY FILE_LOCATION ORDER BY TIMESTAMP DESC) AS [ROW]
FROM dbo.DISKIOPS 
)

SELECT MAX([IO2].[IO_STALL] - [IO1].[IO_STALL])
FROM IOPS IO1 JOIN IOPS IO2 ON IO1.ROW = (IO2.ROW+1)
WHERE IO1.NAME = IO2.NAME
AND IO1.Disk = @Disk
Tom
sumber
1
io_stalldengan sendirinya tidak berarti terlalu banyak. Jika dalam 10 detik Anda memiliki 1000 operasi yang terhenti untuk masing-masing 1 detik, Anda akan memiliki 1000 kios. Itu akan menjadi 16+ menit warung dalam 10 detik. Anda perlu menghubungkan ini dengan operasi IO. Bisakah Anda memposting pertanyaan Anda yang sebenarnya dalam pertanyaan Anda?
Thomas Stringer
Halo, saya telah menambahkan kode, saya mengalami sedikit kesulitan untuk memformatnya jadi saya harap tidak apa-apa.
Tom

Jawaban:

10

Komentar pertanyaan disisipkan di bawah:

io_stalldengan sendirinya tidak berarti terlalu banyak. Jika dalam 10 detik Anda memiliki 1000 operasi yang terhenti untuk masing-masing 1 detik, Anda akan memiliki 1000 kios. Itu akan menjadi 16+ menit warung dalam 10 detik. Anda perlu menghubungkan ini dengan operasi IO ...

Di atas adalah contoh yang cukup bagus tentang bagaimana Anda dapat melihat angka monumental dan tampaknya berlebihan Dengan sendirinya, io_stalltidak benar-benar berarti apa-apa. Anda perlu mengetahui skala operasi I / O untuk kios kumulatif itu.

Alih-alih memiliki ini:

SELECT MAX([IO2].[IO_STALL] - [IO1].[IO_STALL])
FROM IOPS IO1 JOIN IOPS IO2 ON IO1.ROW = (IO2.ROW+1)
...

Anda perlu membagi kios dengan operasi I / O untuk mendapatkan rata-rata kios per I / O (atau per baca, atau tulis, atau perincian apa pun yang Anda cari). Dengan kata lain, rekomendasi saya adalah memodifikasi kueri Anda agar terlihat seperti ini:

SELECT
    MAX(([IO2].[IO_STALL] - [IO1].[IO_STALL]) / (IO2.NUM_OF_READS + IO2.NUM_OF_WRITES - IO1.NUM_OF_READS - IO1.NUM_OF_WRITES))
FROM IOPS IO1 JOIN IOPS IO2 ON IO1.ROW = (IO2.ROW+1)

Dan kemudian Anda perlu memiliki klausa predikat tambahan untuk memastikan Anda tidak membaginya dengan nol:

...
WHERE IO1.NAME = IO2.NAME
and (IO2.NUM_OF_READS + IO2.NUM_OF_WRITES - IO1.NUM_OF_READS - IO1.NUM_OF_WRITES) > 0
AND IO1.Disk = @Disk

Apa ini pada dasarnya dilakukan adalah menghitung rata-rata io_stallper operasi I / O . Dengan sendirinya, tinggi io_stallbisa berarti beban kerja yang lebih tinggi dan belum tentu merupakan tanda masalah.

Thomas Stringer
sumber
2
Ah benar saya mengerti, terima kasih banyak, semoga kesalahan saya terbukti bermanfaat bagi orang lain.
Tom
2
Ini adalah kesalahan umum, tidak hanya dengan statistik file virtual tetapi juga menunggu statistik. Senang itu membantu!
Thomas Stringer