मैं हर 5 मिनट पर sysinos_io_virtual_file_stats से IO_STALLS एकत्र कर रहा हूं और फिर यह देखने के लिए डेल्टा कर रहा हूं कि कौन सी फाइलें IO से सबसे अधिक प्रभावित हो रही हैं।
एक 5 मिनट की अवधि में मुझे 5826331 एमएस का डेल्टा मिलता है जो कि 97 मिनट है।
मैं इससे थोड़ा भ्रमित हूं, क्या यह कह रहा है कि 97mins पहले शुरू किया गया एक ऑपरेशन केवल उस बिंदु पर समाप्त हुआ और इसलिए उस प्रतीक्षा समय को रिकॉर्ड किया गया?
धन्यवाद
अनुरोध के अनुसार जोड़ा गया कोड:
/*
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
io_stall
अपने आप से बहुत ज्यादा मतलब नहीं है। यदि 10 सेकंड में आपके पास 1 सेकंड के लिए 1000 ऑपरेशन ठप हैं, तो आपके पास 1000 सेकंड के स्टॉल होंगे। यह 10 सेकंड में 16+ मिनट का स्टॉल होगा। आपको IO संचालन के साथ इसे सहसंबंधित करने की आवश्यकता है। क्या आप अपने प्रश्न में अपनी वास्तविक क्वेरी पोस्ट कर सकते हैं?