Control por sesión y control global

El presente documento detalla cómo prevenir que consultas descontroladas consuman excesiva memoria en el sistema SAP HANA.

Por defecto, no existe ninguna limitación en cuanto a consumo de memoria por consulta. En el caso de configurar una limitación, las consultas que requieran un consumo superior al especificado serán automáticamente canceladas cuando se alcance dicho límite.

No obstante, esta limitación podría provocar que algunas consultas se cancelen innecesariamente; por ejemplo, cuando el total de memoria consumida en el sistema sea muy bajo pero una consulta particular supere el límite establecido. Para evitarlo, es posible parametrizar un límite en forma de porcentaje, de forma que cada consulta se trate como una proporción de la memoria total disponible. Mediante este parámetro en forma de porcentaje, las consultas que superen en valor bruto el límite de memoria establecido podrían ejecutarse, siempre y cuando el porcentaje de memoria destinado a cada consulta esté dentro de los límites fijados.

Además, es posible crear excepciones por usuario para estas limitaciones. Esto podría ser interesante, por ejemplo, para asegurar que los administradores de sistemas puedan hacer backups.

Las limitaciones mencionadas hacen referencia a consultas SQL, no al conjunto del sistema. Es decir, el sistema también necesita disponer de memoria para realizar determinadas tareas (ordenar, actualizar etc.). Por ello, también existen parámetros para limitar la máxima memoria disponible para todo el conjunto del sistema (global_allocation_limit: para determinar el límite de memoria que puede ser utilizada por la base de datos).

Procedimiento

Como prerrequisitos, cabe señalar que para aplicar las configuraciones que se detallarán a continuación es necesario contar con el permiso INIFILE ADMIN.

Además, enable_tracking y memory_tracking deben activarse primero en el archivo global.ini. Por otro lado, resource_tracking debe estar activado en este archivo si desea aplicar diferentes opciones para usuarios individuales.

Primero, se debe habilitar seguimiento de memoria de instrucciones. En el archivo global.ini, se amplía la sección resource_tracking y se establecen los siguientes parámetros en on:

  • Enable_tracking = on
  • Memory_tracking = on

Después, se comprueba el parámetro global_allocation_limit, que es límite de memoria que puede ser utilizada por la base de datos.  Este parámetro permite controlar el comportamiento del total de la memoria destinada a la base de datos HANA. No será necesario determinar el valor de este parámetro, a menos que se disponga de algún software adicional instalado en el mismo servidor de HANA. Por ello, lo más común es que dicho parámetro coja el valor 0 por defecto.

Tal y como se ha mencionado previamente, el sistema operativo reserva parte de la memoria por motivos de performance. Así, por defecto, la base de datos HANA reservará aproximadamente el 90% de la memoria física disponible.

            Si el parámetro global_allocation_limit está parametrizado como 0, la memoria destinada para la base de datos se obtendrá de la siguiente forma: 90% de los primeros 64GB de la memoria física disponible más el 97% de cada GB adicional hasta la memoria física disponible.

            Por ejemplo:

64GB * 0.9 + (629,91GB – 64GB) * 0,97 = 606GB

Después, se parametriza el statement_memory_limit, que es precisamente límite de memoria por consulta. SAP sugiere la utilización de la siguiente fórmula para considerar el rango de límite por consulta:

Use below formula to calculate a recommended range for statement_memory_limit.   
MIN(10 % of allocation limit, 30 GB) – MIN(30 % of allocation limit,   500 GB)
For example, if allocation limit is 1TB. 
MIN(10%*1024, 30) = 30GB. ▶ 0,1*1024 >>> 30 GB. Por lo tanto, el MIN = 30 GB
MIN(30%*1024,500) =307GB. ▶ 0,3*1024 <<< 500 GB. Por lo tanto, el MIN = 307GB
Then you can consider a value between 30GB and 307GB.

Volviendo al ejemplo arriba detallado, se observa que el allocation limit es de 606GB.

Por lo tanto;

MIN (606*0,1 , 30) ▶ 30GB

MIN (606*0,3  , 500) ▶ 181,8GB

Por lo tanto, se debería considerar un statement_memory_limit entre 30GB y 181,8GB.

Tras establecer este parámetro, las sentencias que excedan el límite establecido se detienen al quedarse sin memoria.

Por último, existe la opción de parametrizar el statement_memory_limit_threshold: límite de memoria por consulta en %. SAP recomienda fijar este límite al 60% del allocation limit. Siguiendo el ejemplo, el statement_memory_limit_threshold se fijaría en 606GB * 0,6 = 363,6GB.

Resumen del ejemplo seguido:

ParameterValue
Physical memory630GB
Global_allocation_limit606GB (Parameter set to 0)
0 – Indicates that, default values will apply
Statement_memory_limit30GB < 100 GB < 181,8GB
Statement_memory_limit_threshold363,6GB

También es posible limitar el consumo de memoria de usuarios en particular. Será necesario contar con el permiso USER ADMIN para modificar los parámetros relativos a usuario. Esta parametrización excluye al usuario de las limitaciones globales.

La parametrización por usuario se puede realizar desde HANA Studio:

También es posible realizarlo por comandos:

ALTER USER <db_user_name> SET PARAMETER STATEMENT MEMORY LIMIT = ‘<maximum_memory_allocation_in_gb>’

Para resetear esta última especificación:

ALTER USER <db_user_name> CLEAR PARAMETER STATEMENT MEMORY LIMIT

Esperamos que este artículo te haya sido útil, si tienes alguna pregunta no dudes en ponerte en contacto con nuestro equipo de Analytics.