17 noviembre, 2009

Cómo detectar y matar procesos huérfanos

Cuando una aplicación cliente desconecta de un servidor SQL Server, el proceso de conexión debe borrarse en el servidor. Si los procesos de conexión no se borran por cualquier motivo, éstos se convierten en procesos "huérfanos". Estos procesos o sesiones inactivas pueden utilizar recursos valiosos, como bloqueos y conexiones de usuario.

¿Cuánto tiempo tarda o cuándo es que SQL Server limpia una sesión huérfana? No lo hace. SQL Server termina una conxión cuando la aplicación cliente o el sistema operativo lo solicita. A nivel de sistema operativo, las conexiones que usan named pipes sobre NETBEUI suelen tener un timeout bastante rápido. Las conexiones basadas en named pipes sobre IP tienen un timeout un poco mayor. Pero las sesiones basadas en sockets TCP/IP por omisión no tienen timeout. Por lo tanto el administrador de SQL Server debe identificar las sesiones huérfanas y matarlas usando el comando KILL.

Una forma posible de identificar una sesión huérfana se logra filtrando en SysProcesses por las columnas Status y Last_Batch. Si el Status indica que la sesión está a la espera de un comando y la diferencia entre GetDate() y Last_Batch es grande, todo indica la presencia de una sesión huérfana a la que se podría aplicar el KILL.

Por ejemplo:

--
-- SQL Server 2005/2008
-- Matar sesiones inactivas de mas de X minutos
--
-- Ejemplo: 8 hrs (480 minutos)
DECLARE @mm INT
SET @mm = 480

DECLARE @SPIDS TABLE(SPID INT)
DECLARE @SPID INT
DECLARE @KILLCMD VARCHAR(200)

INSERT @SPIDS (SPID)
SELECT SPID
FROM sysprocesses
WHERE SPID <> @@SPID
AND status = 'sleeping'
AND DATEDIFF(MINUTE, last_batch, getdate()) > @mm

SELECT @SPID = MIN(SPID) FROM @SPIDS
WHILE @SPID IS NOT NULL
BEGIN
SELECT @KILLCMD = 'KILL ' + CONVERT(VARCHAR(100),@SPID)
EXEC(@KILLCMD)
SELECT @SPID = MIN(SPID) FROM @SPIDS WHERE SPID > @SPID
END


La ejecución del ejemplo no elimina procesos del sistema. Cuando KILL intenta hacerlo, se verá el mensaje de error:

Msg 6107, Level 14, State 1, Line 1
Only user processes can be killed.


sys.sysprocesses contiene información sobre los procesos que se ejecutan en una instancia de SQL Server. Estos procesos pueden ser procesos del cliente o procesos del sistema.
Esta tabla del sistema se incluye como vista para la compatibilidad con versiones anteriores a 2005/2008. En su lugar, se recomienda el uso de las vistas del sistema de SQL Server actual. Esta característica se quitará en una versión futura de Microsoft SQL Server.

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.