En este articulo de describe como usar los "resource limits" para restringir el I/O, el número de registros extraidos o el tiempo de procesamiento que un login en especifico o aplicación utilizan durante tiempos criticos. También describe como crear los rangos de tiempo que son utilizados por los "resource limits".
¿Que son los resource limits?
ASE provee los "resource limits" para ayudar a los DBA's a evitar que ciertas transacciones se adueñen de los recursos del manejador. Un "resource limit" son una serie de parametros especificados por el DBA para prevenir que un usuario o aplicacion puedan:
- Exeder el I/O determinado
- Regresar demasidos registros durante consultas
- Exeder un tiempo definido de ejecución.
La serie de parametros para un "resource limit" son el horario en que va a ser activado y la acción a tomar en caso de que se revasen los parametros. Por ejemplo se puede reportar la información al log de errores o eliminar la session que este consumiendo los recursos del manejador.
Planeando los "Resoruce Limits"
Al planear un "resource limit" se debe de considerar lo siguiente:
- Cuando va a aplicar el "resource limit" (horario del día y días de la semana)
- Que usuarios y aplicaciones monitorear
- Que tipo de restricciones van a tener.
- Cuando aplicar la restricción a queries individuales o a una transaccion completa.
- Cuando aplicar la restricción de IO, antes de su ejecución o durante la ejecución.
- Que acción tomar cuando se revasen los limites del "resource limit"(Usar una advertencia, abortar el query o transacción o eliminar la sesión)
Después de considerar lo anterior, llevarlo a cabo con los store procedures.
- Especificar el rango de tiempo sp_add_time_range
- Crear un "resource limit" sp_add_resource_limit
- Obtener información de un resource limit. sp_help_resource_limit
- Modificar los rangos de tiempo de un "resource limit" sp_modify_time_range
- Modificar un "resource limit" sp_modify_resource_limit
- Eliminar rangos de tiempo sp_drop_time_range
- Eliminar "resource limits" sp_drop_resource_limit
Habilitando los "resource limits"
Primero debe de habilitarse el uso de "resource limits" en el manejador con el siguiente comando:
sp_configure "allow resource limits", 1
1 habilita el uso de "resource limits" y 0 lo deshabilita. Esta cambio es estático por lo que debe de ser reiniciado el manejador para que tome los cambios.
Cambiando este parametro también modifica la salida del showplan y statistics i/o.
Definiedo los rangos de tiempo
Adaptive Server incluye rangos ya predefinidos, que cubren periodos de tiempo largos como días completos y semanas completas, pero también podemos crear nuestros propios rangos de tiempo.
Se debe de tener ciudado con no empalmar tiempos ya que eso no es permitido.
Creando un rango de tiempo
Crear un nuevo rango de tiempo con el comando sp_add_time_range:
- Darle un nombre al rango de tiempo
- Especificar los días de la semana en que va aplicar
- Especificar los horarios en que va a aplicar
sp_add_time_range nombre, dia_incio, dia_fin, hora_inicio, hora_fin.
Ejemplo: Para crear un rangode tiempo que sea de lunes a viernes de 9:00 a 18:00hrs.
sp_add_time_range rango1,monday,friday,"9:00","18:00"
Modificando un rango de tiempo
sp_modify_time_range nombre, dia_incio, dia_fin, hora_inicio, hora_fin.
Ejemplo: Para cambiar los dias a solo los viernes del rango definido en el ejemplo anterior.
sp_modify_time_range rango1,friday,friday,NULL, NULL
Eliminando un rango de tiempo
sp_drop_time_range nombre
Ejemplo: Para eliminar el rango de tiempo creado en el ejemplo anterior.
sp_drop_time_range rango1
Identificando Usuarios y Limites
Por cada "resource limit" se debe de especificar el objeto para el cual el limite aplica. Se pueden aplicar los "resource limit" para lo siguiente.
- Todas las aplicaciones utilizadas por un usuario.
- Todos los usuarios que usan una aplicación en particular
- Una especifica aplicación utilizada por un especifico usuario
Identificando procesos pesados dentro del manejador por usuario
Antes de implementar un "resource limit" , ejecute sp_reportstats. La salida de este store procedure puede ayudarte a identificar a los usuarios con mayor carga sobre el manejador. Por ejemplo:
sp_reportstats
Name Since CPU Percent CPU I/O Percent I/O
------ ----------- ----- ------------ ----- -------------
probe jun 19 1993 0 0% 0 0%
julie jun 19 1993 10000 24.9962% 5000 24.325%
jason jun 19 1993 10002 25.0013% 5321 25.8866%
ken jun 19 1993 10001 24.9987% 5123 24.9234%
kathy jun 19 1993 10003 25.0038% 5111 24.865%
Total CPU Total I/O
--------- ---------
40006 20555
La salida anterior muestra que la carga se encuentra balanceada por todos los usuarios.
Identificando procesos pesados dentro del manejador por aplicación
Para identificar las aplicaciones que estan ejecutandos dentro del manejador y los usuarios que las estan ejecutando, ejecute un query sobre la tabla sysprocesses en la base de datos master.
El siguiente query determina que isql, payroll, perl y acctng son los unicos nombres de programas que fueron pasados a ASE.
select spid, cpu, physical_io, substring(user_name(uid),1,10) user_name, hostname, program_name, cmd from sysprocesses
spid cpu physical_io user_name hostname program_name cmd
---- --- ----------- --------- -------- ------------ ------
17 4 12748 dbo sabrina isql SELECT
424 5 0 dbo HOWELL isql UPDATE
526 0 365 joe scotty payroll UPDATE
568 1 8160 dbo smokey perl SELECT
595 10 1 dbo froth isql DELETE
646 1 0 guest walker isql SELECT
775 4 48723 joe_user mohindra acctng SELECT
(7 rows affected)
Seleccionando un límite de tiempo Después de conocer que aplicaciones y usuarios aplicar los "resource limits", se tienen 3 opciones de aplicarlos.
io_cost - Requiere de muchas lecturas logicas y fisicas, Utilice set showplan on antes de ejecutar el query, para desplegar su costo estimado de I/O. Utilice set statistics io on para observar el I/O actual.
io_cost - Requiere de muchas lecturas logicas y fisicas, Utilice set showplan on antes de ejecutar el query, para desplegar su costo estimado de I/O. Utilice set statistics io on para observar el I/O actual.row_count - Regresa un alto número de registros. Utilice @@rowcount para ayudar a los desarrolladores a observar el número de registros a extraer por sus aplicaciones.
elapsed_time - Toma demasiado tiempo para ejecutarse, ya sea por la complejidad del query o por factores externos como carga en el servidor o bloqueos. Utilice set statistics time on antes de ejecutar el query, para desplegar el tiempo transcurrido en milisegundos.
elapsed_time - Toma demasiado tiempo para ejecutarse, ya sea por la complejidad del query o por factores externos como carga en el servidor o bloqueos. Utilice set statistics time on antes de ejecutar el query, para desplegar el tiempo transcurrido en milisegundos.
{mospagebreak}
Entendiendo los tipos de resource limits
Existen tres tipos de resource limits que permiten limitar los recursos del manejador de diferentes formas.
Limitando el costo de I/O
El costo de I/O es basado en el numero de lecturas fisicas y logicas utilizadas durante la ejecución de un query. Para determinar el mejor plan de ejecución ASE hace uso de las lecturas físicas y lógicas para calcular el I/O estimado.
Limitando io_cost puedes controlar el I/O de queries intensos, incluyendo a queries que regresan un rango grande de resultados. De cualquier forma, si se ejecuta un query que regresa todos los registros de una tabla y no tiene las estadisticas creadas en la tabla , el optimizador de ASE no podra estimar que el query va a regresar una gran cantidad de registros revasando el io_cost. Para prevenir que esto suceda se puede crear un resource limit row_count.
Limitando el tiempo de ejeución
El limite elapsed_time esta dado en segundos y limita el tiempo requerido para ejecutar un batch o transacción. Este tiempo es determinado por factores como la complejidad del query , la carga del servidor y el tiempo de espera por bloqueos.
Para ayudar a desarrollar buenos limites para el tiempo de ejecución, se cuenta con la opcion set statistics time. Al ser habilitado es desplegado el tiempo de ejecución de los queries en milisegundos por lo que debe ser convertido a segundos para utilizar el mismo formato de los resource limits.
Limitando el numero de registros
El limite row_count limita el número de registros devueltos por una consulta. Si el resource limit es configurado como un warning y un query rebasa el limite configurado el número de registros es regresado en su totalidad junto con un warning indicando el valor configurado.
Configurando el limite para el uso de espacio de tempdb
El tempdb_space restringe el número de páginas que tempdb puede tener durante una sola sessión. Si un usuario exede el limite especificado la sesión puede ser terminada o la transacción o batch abortado.
Creando un resource limit
Antes que nada definiremos cuales son los valores configurables dentro de los resource limits.
Columna |
Significado |
Valor |
limitid |
El tipo de limite |
1- I/O cost 2 - Elapsed time 3 - Row count |
enforced |
Cuando es aplicado el limite |
1 - Antes de ejecutarse 2 - Duarnte la ejecución 3 - Ambos |
action |
Que acción se va a tomar |
1- Usar un warning 2 - Abortar el batch 3 - Abortar la transaccion 4 - Matar la sessión |
scope |
Cual es el alcance del limite |
1 - Query 2 - Query batch 4 - Transaction 6 - Query batch + transaction |
La sentencia para crear un resource limit es la siguiente:
sp_add_resource_limit name, appname, rangename, limittype, limit_value, enforced, action, scope
Ejemplo 1: Crear un resource limit que aplique para todos los usuarios que utilizan la aplicación facturas.El limite es valido para tu_wed_7_10 y el tipo de limite es elapsed_time y esta configurado para 120 segundos.
sp_add_resource_limit NULL, facturas, tu_wed_7_10, elapsed_time, 120, 2, 1, 2
El limite es valido para tu_wed_7_10 y el tipo de limite es elapsed_time y esta configurado para 120 segundos, enforced es 2 por lo que va a aplicar solo durante el tiempo de ejecución action es 1 por lo que solo será un warning y por último scop como 2 por lo que el alcance aplica para query batch.
Ejemplo 2: Este ejemplo creara un resource limit que aplica para los queries y todas las aplicaciónes usadas para el usuario Joe durante un rango de sábado por la noche.
sp_add_resource_limit joe, NULL, saturday_night, row_count, 5000, 2, 3, 1
Verificando los resource limits ya existentes
Para poder ver los resource limits ya dados de alta se utiliza el comando sp_help_resource_limit. Los usuarios que no tienen el rol de sa solo podrán ver sus propios resource limits.
Los usuarios con role de sa pueden utilizar el sp_help_resource_limit para obtener la siguiente información:
-
Todos los limites almacenados en la tabla sysresourcelimits sp_help_resource_limit
-
Todos los limites para un usuario sp_help_resource_limit usuario
-
Todos los limites para una aplicacion sp_help_resource_limit NULL,aplicacion
-
Todos los limites que aplicacan a un día determinado sp_help_resource_limit @limitday = wednesday
-
El limite para un usuario determinado en un día determinado sp_help_resource_limit usuario, NULL, NULL, wednesday
Modificando los resource limits
Para especificar un nuevo valor dentro de un resource limit o alguna acción a tomar puede ser modificado por medio del comando sp_modify_resource_limit. Lo que no es posible cambiar es el nombre del usuario o aplicacíón al cual el limite aplica, tampoco es posible cambiar el rango de tiempo, el tipo de limite, el enforce y scope.
La sintaxis es la siguiente:
sp_modify_resource_limit name, appname, rangename, limittype, limitvalue, enforced, action, scope
Para modificar un resource limit , se deben de especificar los siguientes valores:
- Se debe de especificar un not-NULL para name or appname.
- Para modificar un limite que aplica para todos los usuarios y una aplicación en especifico se debe de especificar en name como "null"
- Para modificar un limite que aplica para todas las aplicaciónes utilizadas por un usuario, especificar appname como "null"
- Se debe de especificar un not-null para rangename y limittype.
- Especificar un "null" para limitvalue o action indica que su valor no cambia
Eliminando los resource limits
La sintaxis es la siguiente
sp_drop_resource_limit {name , appname } [, rangename, limittype, enforced, action, scope]
Ejemplo 1:
Eliminar todos los resource limits para todos los usuarios de una aplicación entre el rango de tu_wed_7_10.
sp_drop_resource_limit NULL, aplicacion, tu_wed_7_10, elapsed_time
Ejemplo2:
Elimiar todos los resource limits para el usuario joe con la aplicacion payroll
sp_drop_resource_limit joe_user, payroll
Cualquier duda referente a los resource limits favor de utilizar el foro del sitio.