SQL Server:模拟SQL Server中的长I / O.

时间:2015-01-23 07:16:12

标签: sql-server

我正在阅读有关I / O延迟的信息。 SQL Server错误日志中的错误消息833。如何模拟长I / O方案,以便在日志中收到此错误消息。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

您可以执行类似下面的操作,这会在SQL LOG&上产生大量IO负载。数据驱动器。

  1. 使用几个字段创建简单的[TestTable]
  2. 通过以下任何代码

    连续将行插入上表
    INSERT INTO [TestTable] VALUES ('Sample data')
    GO 10000
    
  3. 在上面的10,000次插入后,查询执行完成。 或者

    WHILE (1=1)
    BEGIN
        INSERT INTO [TestTable] VALUES ('Sample data')
    END
    GO
    

    此查询将继续运行,直到显式停止。

答案 1 :(得分:2)

我会考虑使用可用于对磁盘性能进行基准测试的免费Microsoft SQLIO工具。这会将负载放在磁盘上,这有望使您能够查看环境中的错误。

详细信息: Brent Ozar article on finding SAN Bottlenecks SQL IO, Powershell and storage performance SQLIO Download

您也可以尝试使用随机模式的SQLIOSim实用程序,因此不可重复。它是一种压力测试工具。

答案 2 :(得分:2)

如果您的I / O子系统的大小合适,您可能会发现很难单独使用T-SQL在SQL错误日志中获取833错误消息。但是,如果使用SQLIO(https://www.microsoft.com/en-us/download/details.aspx?id=20163)或SQLIOSIM(在SQL安装介质上)强调I / O子系统并同时运行I / O密集型查询,则可能会生成错误。

下面是一个用于创建和加载测试表的T-SQL脚本,以及一个I / O密集型查询。如果需要,在不同的SSMS窗口中运行SELECT循环的多个实例。

--create test table
CREATE TABLE dbo.TestTable(
      Col1 nchar(4000) NOT NULL
    , Col2 nvarchar(MAX) NOT NULL
    );

--load 10000 rows (about 2.8GB)
WITH 
    t4 AS (SELECT n FROM (VALUES(0),(0),(0),(0)) t(n))
    ,t256 AS (SELECT 0 AS n FROM t4 AS a CROSS JOIN t4 AS b CROSS JOIN t4 AS c CROSS JOIN t4 AS d)
    ,t16M AS (SELECT ROW_NUMBER() OVER (ORDER BY (a.n)) AS num FROM t256 AS a CROSS JOIN t256 AS b CROSS JOIN t256 AS c)
INSERT INTO dbo.TestTable WITH(TABLOCKX) (Col1, Col2)
SELECT REPLICATE(N'X', 4000), REPLICATE(CAST('X' AS nvarchar(MAX)), 10000)
FROM t16M
WHERE num <= 100000;
GO

--run query in loop (expect parallel execution plan with many read-ahead and LOB page reads)
SET NOCOUNT ON;
DECLARE @RowCount int, @Iteration int = 1;
WHILE @Iteration <= 100
BEGIN
    CHECKPOINT;
    DBCC DROPCLEANBUFFERS WITH NO_INFOMSGS;
    SELECT @RowCount = COUNT(*) FROM dbo.TestTable WHERE Col2 LIKE 'X%';
    RAISERROR('Iteration %d completed',0,1,@Iteration) WITH NOWAIT; --display progress message
    SET @Iteration += 1;
END;
GO

修改 我遇到了由Microsoft开发的另一个I / O测试工具DiskSpd,并且能够在我的测试系统上结合上述T-SQL脚本可靠地产生错误。这个开源工具可从https://gallery.technet.microsoft.com/DiskSpd-a-robust-storage-6cd2f223免费下载。 DiskSpd具有与SQL相同的功能,但更易于使用,记录更完善,并且可以选择生成XML输出以便于分析。

我用于测试的参数如下。在使用D驱动器上的SQL Server数据文件开始测试后30秒内生成错误。

diskspd.exe" -h -d60 -c1G -F32 -w50 -r -b8K -o1000 -L "D:\DiskSpd.dat"