dimecres, 23 de maig del 2018

Timeouts a la SSISDB

Un dels problemes que m'he trobat quan executo paquets de SSIS que estan guardats en la SSISDB es que si s'executen molts a la vegada a vegades tenim error de timeout a l'hora d'accedir al paquet.
Les dues taules principals que es consulten a l'hora d'iniciar l'execució d'un paquet a través d'un job són:
- internal.object_parameters: conté els paràmetres de cada paquet
- internal.execution_parameter_values: conté els paràmetres que s'han utilitzat en cadascuna de les execucions

El que ens interessa es tenir aquestes dues taules el més petites possible.
Per tal de reduir internal.object_parameters el que hem de fer és que el "Maximum Number of Versions per Project" sigui el més petit possible. En cas que tinguem algun sistema de versionat de codi ho podrem deixar a algun valor bastant baix com 3. En cas que no tinguem cap repositori de codi el risc de rebaixar-ho és molt més alt.
Per reduir internal.execution_parameter_values el que hem de fer és que el "Retention Period (days)" sigui el més petit possible. Aquí depèn de la quantitat de logs que vulguem tenir, però si volem tenir històric es poden bolcar les dades a un Datawarehouse i tenir els logs consultables a la SSISDB de 10 dies.



Si encara seguim tenint timeouts podem modificar el procediment: catalog.create_execution
A la línia 168 tenim el nombre d'intents per accedir al paquet. Per defecte està a 2, podem augmentar el valor per que faci més intents.
A la línia 174 hi ha la variable @LockTimeOut que són els segons que s'espera per tornar a fer un nou reintent.

DECLARE @lock_result int
DECLARE @retry int
SET @lock_result = -1
SET @retry = 2
WHILE @retry > 0 AND @lock_result < 0
BEGIN
EXEC @lock_result = sp_getapplock
        @Resource = 'MS_ISServer_Create_Execution',
        @LockTimeOut= 5000,
        @LockMode = 'Exclusive'

    SET @retry = @retry - 1
END



Si havent reduit les versions, el log i modificant el procediment encara tenim timeouts només ens queda l'opció de reduir els paquets que s'executen en paral·lel o posar més ferro al servidor.