La memoria de una instancia RDS se divide en dos categorías: memoria compartida y memoria privada específica de sesión. La memoria compartida se asigna una sola vez al iniciar la instancia y se comparte entre todas las conexiones. La memoria privada específica de sesión se asigna por conexión bajo demanda; cada consulta activa que requiere ordenar, unir o leer datos reclama de inmediato el tamaño completo de su búfer. En escenarios de alta concurrencia, esta asignación por conexión es la causa principal de los errores de falta de memoria (OOM) y de los cambios entre instancias primarias y secundarias.
Cómo se calcula la memoria
A continuación se muestra la fórmula para estimar el uso total de memoria:
Total memory ≈ Shared memory
+ max_connections × per-session memory per connection
|
Componente |
Parámetros |
|
Memoria compartida |
|
|
Memoria por sesión |
|
Memoria compartida
Ejecute la siguiente consulta para comprobar la asignación de memoria compartida:
SHOW VARIABLES WHERE Variable_name IN (
'innodb_buffer_pool_size',
'innodb_log_buffer_size',
'innodb_additional_mem_pool_size',
'key_buffer_size',
'query_cache_size'
);
El resultado a continuación corresponde a una instancia de 240 MB:
+---------------------------------+-----------------+
| Variable_name | Value |
+---------------------------------+-----------------+
| innodb_additional_mem_pool_size | 2097152 |
| innodb_buffer_pool_size | 67108864 |
| innodb_log_buffer_size | 1048576 |
| key_buffer_size | 16777216 |
| query_cache_size | 0 |
+---------------------------------+-----------------+
Parámetros
|
Parámetro |
Valor predeterminado en RDS |
Descripción |
|
|
64 MB (instancia de 240 MB) |
El pool de búferes de InnoDB. Almacena páginas de datos, páginas de índices, páginas de deshacer (undo), búferes de inserción, índices hash adaptativos, bloqueos y diccionarios de datos. Todas las operaciones de lectura y escritura SQL trabajan sobre este pool en lugar de los archivos físicos de datos; estos últimos se actualizan en disco más tarde mediante puntos de control. Un pool más grande mejora el rendimiento de lectura y escritura, pero prolonga el tiempo de recuperación ante fallos. |
|
|
1 MB |
El búfer de registros de InnoDB. Almacena los registros de rehacer (redo) antes de vaciarlos al disco. Este vaciado lo desencadena el hilo maestro cada segundo, en cada confirmación de transacción y cuando el búfer disponible cae por debajo de la mitad de su tamaño total. Un valor de 1 MB es suficiente para la mayoría de las cargas de trabajo. |
|
|
2 MB |
Almacena las estructuras de datos internas de InnoDB. Aumente este valor si su instancia tiene una gran cantidad de tablas. |
|
|
16 MB |
Almacena en caché los índices de las tablas MyISAM. En estas tablas, las cachés de índices residen en |
|
|
0 (deshabilitado) |
Almacena en caché los resultados de consultas mediante el hash de la instrucción SQL. Se encuentra deshabilitado en las instancias RDS. La caché se invalida cada vez que se modifica una tabla, por lo que no resulta adecuada para cargas de trabajo con muchas escrituras. |
Memoria privada específica de sesión
A diferencia de la memoria compartida, los búferes de sesión no se preasignan durante el inicio. Cada valor de parámetro se asigna por completo en el momento en que una consulta lo necesita. Si hay muchas conexiones simultáneas, la suma de estas asignaciones puede superar la memoria available y provocar errores OOM.
Ejecute la siguiente consulta para comprobar la asignación de memoria de sesión:
SHOW VARIABLES WHERE Variable_name IN (
'read_buffer_size',
'read_rnd_buffer_size',
'sort_buffer_size',
'join_buffer_size',
'binlog_cache_size',
'tmp_table_size'
);
Ejemplo de resultado:
+-------------------------+-----------------+
| Variable_name | Value |
+-------------------------+-----------------+
| binlog_cache_size | 262144 |
| join_buffer_size | 262144 |
| read_buffer_size | 262144 |
| read_rnd_buffer_size | 262144 |
| sort_buffer_size | 262144 |
| tmp_table_size | 262144 |
+-------------------------+-----------------+
Parámetros
|
Parámetro |
Valor predeterminado en RDS |
Modificable en la consola |
Descripción |
|
|
256 KB |
No |
Búfer de exploración secuencial. Se lee antes de las lecturas físicas para reducir las operaciones de E/S. |
|
|
256 KB |
No |
Búfer de exploración aleatoria. Se utiliza cuando las filas se leen en un orden específico después de explorar un índice. |
|
|
256 KB |
No |
Búfer de ordenamiento para las operaciones |
|
|
256 KB |
No |
Búfer para operaciones de unión. ApsaraDB RDS for MySQL solo admite el algoritmo de unión de bucle anidado (nested loop join). La tabla no impulsora se almacena en este búfer para evitar la contención en el pool de búferes. |
|
|
256 KB |
No |
Caché del registro binario. Almacena los registros de transacciones antes de confirmarlas y los vacía al archivo de registro binario en disco después de la confirmación. |
|
|
256 KB |
Sí |
Tamaño máximo de una tabla temporal en memoria. Si una consulta crea una tabla temporal que supera este límite, MySQL la convierte en una tabla MyISAM en disco. Si aparece el siguiente error, aumente este valor: |
Nota: Solo tmp_table_size se puede modificar en la consola de RDS. Los demás parámetros de búfer de sesión no admiten cambios desde la consola.