我正在阅读有关I / O延迟的信息。 SQL Server错误日志中的错误消息833。如何模拟长I / O方案,以便在日志中收到此错误消息。有人可以帮忙吗?
答案 0 :(得分:2)
您可以执行类似下面的操作,这会在SQL LOG&上产生大量IO负载。数据驱动器。
通过以下任何代码
连续将行插入上表INSERT INTO [TestTable] VALUES ('Sample data')
GO 10000
在上面的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"