Sidebar

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.


Tips BD