Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 RML stress testing  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Всем привет, закачал RML, установил, стал пробовать...

может кто уже использует-подскажет....

по их мануалу, создал трэйс, запустил его на продакшене, чтобы квери пособирать, трэйс на 10 минут получился на 35 гигов.

Стал его читать ReadTrace- ом, и столкнулся с ошибками:

ReadTrace.exe -o"input" -I"traces\trace.trc" -SSQLSERVER1\SQLSERVER1 -a

ошибка:

04/12/13 12:36:21.533 [0X00002340] A serious error condition (true == pVariant->FIsUnknownType()) has been encountered.
Utility Error: Attempt to use an invalid variant type
File: .\rpcbinary.cpp
Line: 264
Return Address: 0x000007F77A774212
Function: FConvertNCharStringFromRPC

Ну ладно, запустил на другом файле, ошибка уже другая:

ReadTrace.exe -o"input" -I"traces\trace_1.trc" -SSQLSERVER1\SQLSERVER1 -a

RROR: SPID was detected using Multiple Active Result Sets (MARS). ReadTrace can only process this set of trace files with -T35 enabled

Ну поставил я флаг -Т35 и получил вообще отказ со словами, что мол с таким флагом ReadTrace RML файлов не делает...

Ну а sql файлы из трэйса доставать хлопотно...

Вообще только начал этот инструмент ковырять... Есть ли опыт у кого?

Задача у меня нагрузить стэндовый сервер кверями, провести стресс-тест
12 апр 13, 21:53    [14175341]     Ответить | Цитировать Сообщить модератору
 Re: RML stress testing  [new]
Shurgenz
Member

Откуда: Питер
Сообщений: 1938
Написал в поддержку microsoft вот сюда: sstlbugs@microsoft.com. Ответили быстро - предложили закачать обновленную версию с их ftp, дали адрес и пароль. Проблема была в табличной переменной, передаваемой в процедуру. Однако обновленной версией я не впечатлился. Те RML файлы что ReadTrace делает, имеют один существенный недостаток: приходится править все сгенеренные файлы: поскольку там для каждого файла создается коннекшн нода. Но соответственно без паролей. В общем - очень неудобно.

Я нашел свой способ: сам делаю трэйс и сам его читаю в сиквельные файлы.

/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler          */
/* Date: 16/04/2013  10:13:43         */
/****************************************************/


-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 25000 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, N'D:\temp\trace\trace146', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 31, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 1, @on
exec sp_trace_setevent @TraceID, 10, 9, @on
exec sp_trace_setevent @TraceID, 10, 17, @on
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 11, @on
exec sp_trace_setevent @TraceID, 10, 35, @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 6, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 12, 15, @on
exec sp_trace_setevent @TraceID, 12, 31, @on
exec sp_trace_setevent @TraceID, 12, 16, @on
exec sp_trace_setevent @TraceID, 12, 1, @on
exec sp_trace_setevent @TraceID, 12, 9, @on
exec sp_trace_setevent @TraceID, 12, 17, @on
exec sp_trace_setevent @TraceID, 12, 6, @on
exec sp_trace_setevent @TraceID, 12, 10, @on
exec sp_trace_setevent @TraceID, 12, 14, @on
exec sp_trace_setevent @TraceID, 12, 18, @on
exec sp_trace_setevent @TraceID, 12, 11, @on
exec sp_trace_setevent @TraceID, 12, 35, @on
exec sp_trace_setevent @TraceID, 12, 12, @on
exec sp_trace_setevent @TraceID, 12, 13, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 1, 0, 7, N'%reset_connection%' -- убрал из трэйса
exec sp_trace_setfilter @TraceID, 10, 0, 7, N'Приложение SQL Server Profiler - bb3f1122-1355-4031-a6b8-6f365e4d6c86'
set @intfilter = 0
exec sp_trace_setfilter @TraceID, 31, 0, 0, @intfilter

exec sp_trace_setfilter @TraceID, 35, 0, 6, N'%_146' --фильтрую только те БД, что нужны
exec sp_trace_setfilter @TraceID, 35, 0, 7, N'distribution' -- мне лично реплика не нужна была
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go


Вот этим читаю трэйс.

потом читаю из трэйса в темп таблицу:

SELECT * into temp_trc
FROM fn_trace_gettable('X:\MSSQL11.MSKSQLSERVER1\MSSQL\traces\trace146.trc', 1)


Ну а потом делаю сиквельные файлы:

DECLARE @FS INT, @RC INT, @FileID INT
EXEC @RC = sp_OACreate 'Scripting.FileSystemObject', @FS OUT
declare @File sysname, @f sysname
declare @sql varchar(max),@usedb varchar(200),@StartTime datetime, @oldTime datetime, @timeToPass varchar(100), @ms int, @DatabaseName sysname
declare @a cursor
set @a=cursor FOR select distinct cast(SPID as sysname) from temp_trc
open @a
set @oldTime=null
Fetch next from @a into @f
while @@FETCH_STATUS=0
begin
	set @File='X:\MSSQL11.MSKSQLSERVER1\MSSQL\traces\'+@f+'.sql'
	
	EXEC @RC = sp_OACreate 'Scripting.FileSystemObject', @FS OUT

	IF @RC <> 0 
	 BEGIN
		PRINT 'Error:  Creating the file system object'
	 END
	--set @File='D:\work\Asterisk scripts\usual scripts\inserts.sql'
	-- Opens the file specified by the @File input parameter
	EXEC @RC = sp_OAMethod 
	 @FS
	 , 'CreateTextFile'
	 , @FileID OUT
	 , @File
	 
	-- Prints error if non 0 return code during sp_OAMethod OpenTextFile execution 
	IF @RC <> 0 
	BEGIN
		PRINT 'Error:  Creating the specified text file'
	END
	declare @c cursor
	set @c=CURSOR for select TextData, StartTime, DatabaseName from temp_trc where SPID=cast(@f as int) order by starttime
	open @c
	FETCH next from @c into @sql, @StartTime, @DatabaseName
	while @@FETCH_STATUS=0
	begin
		set @usedb='USE '+@DatabaseName+';'
		EXEC @RC = sp_OAMethod 
							@FileID
							, 'WriteLine'
							, Null
							, @usedb

		EXEC @RC = sp_OAMethod 
							@FileID
							, 'WriteLine'
							, Null
							, @sql
		EXEC @RC = sp_OAMethod 
							@FileID
							, 'WriteLine'
							, Null
							, 'GO'
		set @timeToPass='WAITFOR DELAY ''00:00:01'';'
		EXEC @RC = sp_OAMethod 
								@FileID
								, 'WriteLine'
								, Null
								, @timeToPass
		--if @oldTime is not null
		--begin
		--	set @ms= DATEDIFF (ms, @oldTime, @StartTime)
		--	if @ms<=0 set @ms=ABS(@ms)
		--	if @ms<9999
		--		set @timeToPass='00:00:0'+cast(@ms/1000 as varchar)+'.'+CAST(@ms%1000 as varchar(100))
		--	else if @ms between 9999 and 59999
		--		set @timeToPass='00:00:'+cast(@ms/1000 as varchar(100))+'.'+CAST(@ms%1000 as varchar(100))
		
		--	set @timeToPass='WAITFOR DELAY '''+@timeToPass+''''
		--	EXEC @RC = sp_OAMethod 
		--						@FileID
		--						, 'WriteLine'
		--						, Null
		--						, @timeToPass
		--end
		--set @oldTime=@StartTime			
		FETCH next from @c into @sql,@StartTime,@DatabaseName
	end
	EXECUTE @RC = sp_OADestroy @FileID
	EXECUTE @RC = sp_OADestroy @FS
	
Fetch next from @a into @f
end


Закомментированный код - это я поначалу брал разницу в StartTime между соседними кверями, и писал ее в waitfor delay.

А потом экспериментальным путем перешел к константной задержке.

Вот. Может кому пригодится

Жду комментов
19 апр 13, 12:58    [14203283]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить