IO_STALL 질문과 이해


9

5 분마다 sys.dm_io_virtual_file_stats에서 IO_STALLS를 수집 한 다음 델타를 수행하여 IO에 가장 큰 영향을받는 파일을 확인합니다.

1 분 동안 5826331 ms의 델타를 얻습니다. 97 분입니다.

나는 이것으로 조금 혼란 스럽습니다 .97 분 전에 작업이 시작되어 그 시점에서만 완료되었다는 의미입니까? 따라서 대기 시간을 기록 했습니까?

감사

요청한대로 코드를 추가했습니다 :

/*

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

1
io_stall그 자체로는 그다지 의미가 없습니다. 10 초 안에 1000 초의 작동이 각각 1 초 동안 정지하면 1000 초의 정지가 발생합니다. 10 초 동안 16 분 이상 중단됩니다. 이를 IO 작업과 연관시켜야합니다. 질문에 실제 검색어를 게시 할 수 있습니까?
토마스 스트링거

안녕하세요. 코드를 추가했습니다. 포맷하는 데 약간의 문제가있어서 좋기를 바랍니다.
Tom

답변:


10

아래에 붙여진 질문 의견 :

io_stall그 자체로는 그다지 의미가 없습니다. 10 초 안에 1000 초의 작동이 각각 1 초 동안 정지하면 1000 초의 정지가 발생합니다. 10 초 동안 16 분 이상 중단됩니다. 이것을 IO 작업과 연관시켜야합니다 ...

위의 내용은 기념비적이고 과장된 숫자를 볼 수있는 좋은 예입니다. 그 자체만으로는 io_stall아무 의미가 없습니다. 해당 누적 스톨에 대한 I / O 작업의 규모를 알아야합니다.

이것을 갖는 대신 :

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

스톨을 I / O 작업으로 나누어 I / O 당 (또는 읽기, 쓰기 또는 원하는 단위 단위) 평균 스톨을 가져와야합니다. 다시 말해, 다음과 같이 쿼리를 수정하는 것이 좋습니다.

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)

그런 다음 0으로 나누지 않도록 추가 술어 절이 있어야합니다.

...
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

이것이 기본적으로하는 일은 I / O 작업 당 평균을io_stall 계산하는 것 입니다. 그 자체만으로도 io_stall높은 작업량을 의미 할 수 있으며 반드시 문제의 표시는 아닙니다.


2
아 맞아, 나는 나의 실수가 다른 사람들에게 유용 할 것이라는 점을 대단히 감사합니다.
Tom

2
가상 파일 통계뿐만 아니라 대기 통계에서도 일반적인 실수입니다. 도움이되어 다행입니다!
토마스 스트링거
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.