IO_STALL প্রশ্ন এবং বোঝার


9

আমি প্রতি 5 মিনিটে sys.dm_io_virtual_file_stats থেকে আইওপিএলএলএস সংগ্রহ করছি এবং তারপরে কোন ফাইলগুলি আইও দ্বারা সবচেয়ে বেশি প্রভাবিত হচ্ছে তা দেখতে একটি ব-দ্বীপ করছেন doing

একটি 5 মিনিটের সময়কালে আমি 5826331 এমএসের একটি ডেল্টা পাই যা 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 সেকেন্ডের মধ্যে আপনার প্রতি 1 সেকেন্ডের জন্য 1000 টি অপারেশন স্টল করা থাকে তবে আপনার কাছে 1000 সেকেন্ডের স্টল থাকবে। এটি 10 ​​সেকেন্ডের মধ্যে 16+ মিনিটের স্টলগুলি হবে। আইও অপারেশনগুলির সাথে আপনার এটি সম্পর্কিত হতে হবে। আপনি কি আপনার প্রশ্নে আপনার আসল জিজ্ঞাসা পোস্ট করতে পারেন?
টমাস স্ট্রিংগার

হাই, আমি কোডটি যুক্ত করেছি, এটির ফর্ম্যাট করতে আমার কিছুটা সমস্যা হয়েছিল তাই আমি আশা করি এটি ঠিক আছে।
টম

উত্তর:


10

প্রশ্ন মন্তব্য নীচে আটকানো:

io_stallনিজে থেকে খুব বেশি অর্থ হয় না। যদি 10 সেকেন্ডের মধ্যে আপনার প্রতি 1 সেকেন্ডের জন্য 1000 টি অপারেশন স্টল করা থাকে তবে আপনার কাছে 1000 সেকেন্ডের স্টল থাকবে। এটি 10 ​​সেকেন্ডের মধ্যে 16+ মিনিটের স্টলগুলি হবে। আইও অপারেশনগুলির সাথে আপনার এটি সম্পর্কিত হতে হবে ...

উপরেরটি কীভাবে আপনি স্মৃতিচিহ্ন এবং আপাতদৃষ্টিতে অতিরঞ্জিত সংখ্যা দেখতে পাবেন তার একটি দুর্দান্ত উদাহরণ। নিজেই, io_stallআসলে কিছুই বোঝায় না। সেই ক্রমহীন স্টলের জন্য আপনার আই / ও অপারেশনগুলির স্কেল জানতে হবে।

এটি থাকার পরিবর্তে:

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

আই / ও প্রতি গড় স্টল পেতে আপনার / বা ক্রিয়াকলাপগুলি দ্বারা স্টলকে বিভক্ত করতে হবে (বা প্রতি পড়া, বা লেখার জন্য, বা আপনি যে সান্নিধ্য খুঁজছেন)। অন্য কথায়, আমার সুপারিশটি হ'ল এরকম কিছু দেখতে আপনার ক্যোয়ারীটি পরিবর্তন করতে হবে:

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)

এবং তারপরে আপনার শূন্য দ্বারা বিভাজন করছেন না তা নিশ্চিত করার জন্য আপনার কাছে একটি অতিরিক্ত প্রাকটিক ধারা থাকতে হবে:

...
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
আহ্ ঠিক আমি বুঝতে পেরেছি, অনেক অনেক ধন্যবাদ, আশা করি আমার ভুল অন্যদের পক্ষে কার্যকর প্রমাণিত হবে।
টম

2
এটি একটি সাধারণ ভুল, কেবল ভার্চুয়াল ফাইলের পরিসংখ্যানই নয়, অপেক্ষার পরিসংখ্যানও। খুশি এটা সাহায্য!
টমাস স্ট্রিংগার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.