miércoles, 21 de marzo de 2012

Perfomance Monitor + SQL Profiler

El otro día estaba leyendo un magnífico artículo sobre cómo correlacionar el monitor de Actividad de Windows (Perfomance Monitor o perfmon), junto con SQL Server Profiler, y he intentado crear un pequeño script que active ambas aplicaciones de forma simultánea.

En primer lugar, nos centramos en el Perfomance Monitor, en el cual hemos creado nuestro recopilador de datos (Data Collector Set) al que hemos llamado XData.

Ejecutando un START.bat de contenido

logman "XData" start 

podemos comenzar a recopilar datos.

Un segundo script STOP.bat de contenido

logman "XData" stop

finalizará dicha ejecución.

Si acudimos a la ruta en la que está almacenada la información capturada, podemos ver que ha funcionado correctamente al crearse un archivo de extensión BLG.


Ahora bien, este recopilador de datos se puede exportar en formato XML, ¿como importarlo para poder usarlo en otro equipo? Mediante un tercer script llamado IMPORT.bat y de contenido

logman import XData -s . -xml "C:\rutaexportacion\plantilla_XData.xml"


Un segundo paso es el SQL Server Profiler, en el cual ya hemos creado previamente la plantilla (extensión TDF) deseada.

Para arrancar el Profiler, podemos editar START.bat y añadir la siguiente línea.

C:\rutaprofiler\PROFILER.EXE /S nombreservidor\nombreinstancia /E /T "XData" /O "C:\rutaTrace\fileTrace.trc" /R /Z 32

¿Y cómo parar el seguimiento creado mediante STOP.bat? Aparentemente, no existe forma mediante la combinación COMMANDLINE+GUI de poder parar esa traza cuando deseemos.

Así pues, unido a que en ciertos entornos la carga de usar GUI puede afectar al rendimiento del equipo y, por tanto, a los resultados obtenidos por la traza, tendremos que descargar usar el GUI y usar otro método para hacer una correlación que nos permita pararla con tan sólo "darle a un botón".

Para diseñar esa alternativa, seguiremos algunas de las indicaciones comentadas en este artículo de SqlServerCentral.

Démosle a ese START.bat y dejemos que se cree la traza, la paramos enseguida y exportamos la definición de la traza File | Export | Script Trace Definition | For SQL 2005 & 2008. Ello nos genera un script de extensión SQL, y que llamaremos XDataStartTrace.sql, que sigue este esquema.

/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler          */
/* Date: 21/03/2012  00:00:00         */
/****************************************************/
-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @DateTime datetime


set @DateTime = '2012-03-21 00:00:00.000'
set @maxfilesize = 32


-- 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'InsertFileNameHere', @maxfilesize, @Datetime
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, 122, 1, @on
--[blablabla]
exec sp_trace_setevent @TraceID, 13, 12, @on


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


exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 110f7c77-8a36-4269-b10c-e321672274f3'
-- 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

Y que tenemos que editar, tal y como en el mismo script se sugiere.

/****************************************************/
/* Created by: SQL Server 2008 R2 Profiler          */
/* Date: 21/03/2012  00:00:00         */
/****************************************************/
-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
declare @options integer -- suma de las opciones de comportamiento deseadas
declare @nameOutFile nvarchar(255) --nombre archivo sin extensión


set @options = 6
set @maxfilesize = 32
set @nameOutFile  ='XDataTrace_' + convert(varchar, getdate(), 102)+'_'+ replace(convert(varchar, getdate(),14),':','.')


exec @rc = sp_trace_create @TraceID output, @options , @nameOutFile, @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, 122, 1, @on
--[blablabla]
exec sp_trace_setevent @TraceID, 13, 12, @on


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


exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - 110f7c77-8a36-4269-b10c-e321672274f3'
-- 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

Así, para arrancar este script, tenemos que editar el archivo START.bat de la siguiente forma

logman "XData" start 
sqlcmd -E -i "XDataStartTrace.sql" -S nombreservidor\nombreinstancia


Para pararlo, necesitaremos un script XDataStopTrace.sql de contenido

declare @TraceID INT
select @TraceID = TraceID
from :: fn_trace_getinfo(0)
where CAST([value] as nvarchar(255)) like '%XDataTrace%'


if @TraceID IS NOT NULL
begin
print 'Closing Trace ID ' + cast(@TraceID as varchar(5))
exec sp_trace_setstatus @TraceID, 0
exec sp_trace_setstatus @TraceID, 2
end

el cual es llamado desde STOP.bat, cuyo contenido es

logman "XData" stop 
sqlcmd -E -i "XDataStopTrace.sql" -S nombreservidor\nombreinstancia

Vamos a probar si esto funciona...
  1. Creamos el colector de datos mediante IMPORT.bat.
  2. Ejecutamos START.bat
  3. A través del Management Studio creamos un script, con contenido

    declare @I INT
    set@I = 0 
    print '@I= ' + cast(@I as nvarchar)
    while @I < 100000000
    begin
    insert into myTabla(col2) values (cast(GETDATE() as nvarchar))
    set @I = @I + 1
    end
  4. Lo dejamos correr medio minuto, y paramos mediante STOP.bat
  5. Abrimos Profiler y cargamos la traza creada (archivos de extensión TRC).
Como vemos en esta imagen, todo parece haber funcionado correctamente.


No hay comentarios: