¿Cómo puedo solucionar problemas de uso excesivo o completo del disco con Amazon Redshift?

10 minutos de lectura
0

Estoy experimentando un uso excesivo o completo del disco en Amazon Redshift y quiero solucionar este problema.

Resolución

Los errores de uso elevado del disco pueden depender de varios factores, entre ellos:

  • Clave de ordenación y distribución
  • Procesamiento de consultas
  • Tablas con columnas VARCHAR(MAX)
  • Alta compresión de columna
  • Operaciones de mantenimiento
  • Productos cartesianos con uniones cruzadas
  • Tamaño mínimo de tabla
  • Bloques de lápidas
  • Copia de un archivo grande

Clave de ordenación y distribución

Revise el estilo de distribución, la clave de distribución y la selección de claves de ordenación de la tabla. Las tablas con sesgo de distribución (en las que hay más datos en un nodo que en los demás) pueden provocar un nodo de disco lleno. Si tiene tablas con estilos de distribución sesgados, cambie el estilo de distribución a una distribución más uniforme. Tenga en cuenta que la distribución y el sesgo de fila pueden afectar al sesgo de almacenamiento y al conjunto de filas intermedio cuando se ejecuta una consulta. Para obtener más información sobre las claves de distribución y las claves de ordenación, consulte Amazon Redshift engineering’s advanced table design playbook: preamble, prerequisites, and prioritization.

Para determinar la cardinalidad de la clave de distribución, ejecute la siguiente consulta:

SELECT <distkey column>, COUNT(*) FROM <schema name>.<table with distribution skew> GROUP BY <distkey column> HAVING COUNT(*) > 1 ORDER BY 2 DESC;

Nota: Para evitar un paso de ordenación, utilice las columnas SORT KEY de la cláusula ORDER BY. Un paso de ordenación puede consumir demasiada memoria y provocar un desbordamiento en el disco. Para obtener más información, consulte Uso de claves de ordenación.

En el conjunto de resultados filtrado, elija una columna con una cardinalidad alta para ver su distribución de datos. Para obtener más información sobre el estilo de distribución de la tabla, consulte Elección de modos de distribución recomendados.

Para ver cómo los bloques de bases de datos de una clave de distribución se asignan a un clúster, utilice la utilidad table_inspector.sql de Amazon Redshift.

Procesamiento de consultas

Revise cualquier memoria asignada a una consulta. Mientras se procesa una consulta, los resultados de la consulta intermedia se pueden almacenar en bloques temporales. Si no hay suficiente memoria libre, las tablas provocan un desbordamiento en el disco. Los conjuntos de resultados intermedios no se comprimen, lo que afecta al espacio disponible en disco. Para obtener más información, consulte Memoria insuficiente asignada a la consulta.

Amazon Redshift utiliza de forma predeterminada una estructura de tablas con una distribución uniforme y sin codificación de columnas para las tablas temporales. Pero si utiliza la sintaxis SELECT...INTO, utilice la sentencia CREATE. Para obtener más información, consulte Top 10 performance tuning techniques for Amazon Redshift. Siga las instrucciones indicadas en Tip #6: Address the inefficient use of temporary tables.

Si no hay suficiente memoria asignada a su consulta, es posible que vea un paso en SVL_QUERY_SUMMARY donde is_diskbased muestra el valor «true». Para resolver este problema, aumente el número de ranuras de consulta para asignar más memoria a la consulta. Para obtener más información sobre cómo aumentar temporalmente los espacios para una consulta, consulte wlm_query_slot_count o tune your WLM to run mixed workloads. También puede utilizar las reglas de monitoreo de consultas de WLM para contrarrestar las cargas de procesamiento pesadas e identificar las consultas con un uso intensivo de E/S.

Tablas con columnas VARCHAR(MAX)

Consulte las columnas VARCHAR o CHARACTER VARYING para ver si hay espacios en blanco al final que puedan omitirse cuando los datos se almacenan en el disco. Durante el procesamiento de consultas, los espacios en blanco finales pueden ocupar toda la longitud de la memoria (el valor máximo de VARCHAR es 65 535). Se recomienda utilizar el tamaño de columna más pequeño posible.

Para generar una lista de tablas con anchos de columna máximos, ejecute la siguiente consulta:

SELECT database, schema || '.' || "table" AS "table", max_varchar FROM svv_table_info WHERE max_varchar > 150 ORDER BY 2;

Para identificar y mostrar los anchos reales de las columnas anchas de la tabla VARCHAR, ejecute la siguiente consulta:

SELECT max(octet_length (rtrim(column_name))) FROM table_name;

En el resultado de esta consulta, valide si la longitud es adecuada para su caso de uso. Si las columnas tienen la longitud máxima y superan sus necesidades, ajuste su longitud al tamaño mínimo necesario.

Para obtener más información sobre el diseño de tablas, consulte Prácticas recomendadas de Amazon Redshift para el diseño de tablas.

Alta compresión de columna

Codifique todas las columnas (excepto la clave de ordenación) mediante ANALYZE COMPRESSION o la optimización automática de tablas de Amazon Redshift. Amazon Redshift proporciona codificación de columnas. Se recomienda utilizar esta característica, aunque aumente el rendimiento de lectura y reduzca el consumo total de almacenamiento.

Operaciones de mantenimiento

Asegúrese de analizar y limpiar periódicamente las tablas de bases de datos de su base de datos de Amazon Redshift. Identifique cualquier consulta que se ejecute en tablas a las que les falten estadísticas. Al impedir que las consultas se ejecuten en tablas a las que les faltan estadísticas, Amazon Redshift no escanea filas de tablas innecesarias. Esto también ayuda a optimizar el procesamiento de las consultas.

Nota: Las operaciones de mantenimiento, como VACUUM y DEEP COPY, utilizan espacio de almacenamiento temporal para sus operaciones de ordenación, por lo que se espera un aumento en el uso del disco.

Por ejemplo, la siguiente consulta le ayuda a identificar las estadísticas desactualizadas en Amazon Redshift:

SELECT * FROM svv_table_info WHERE stats_off > 10 ORDER BY size DESC;

Además, utilice el comando ANALYZE para ver y analizar las estadísticas de la tabla.

Para obtener más información sobre las operaciones de mantenimiento, consulte la utilidad de esquemas Analyze & Vacuum de Amazon Redshift.

Productos cartesianos con uniones cruzadas

Utilice el plan EXPLAIN de la consulta para buscar consultas con productos cartesianos. Los productos cartesianos son uniones cruzadas que no están relacionadas y pueden producir un mayor número de bloques. Estas uniones cruzadas pueden provocar una mayor utilización de la memoria y la acumulación de más tablas en el disco. Si las uniones cruzadas no comparten la condición JOIN, las uniones producen un producto cartesiano de dos tablas. A continuación, cada fila de una tabla se une a cada fila de la otra tabla.

Las uniones cruzadas también se pueden ejecutar como uniones de bucles anidados, que son las que tardan más en procesarse. Las uniones de bucles anidados provocan picos en el uso general del disco. Para obtener más información, consulte Identificación de consultas con bucles anidados.

Tamaño mínimo de tabla

La misma tabla puede tener diferentes tamaños en diferentes clústeres. El tamaño mínimo de la tabla se determina entonces por el número de columnas y por si la tabla tiene un valor SORTKEY y el número de sectores rellenados. Si recientemente ha cambiado el tamaño de un clúster de Amazon Redshift, es posible que observe un cambio en el almacenamiento general en disco. Esto se debe al cambio en el número de sectores. Amazon Redshift también cuenta los segmentos de tabla que utiliza cada tabla. Para obtener más información, consulte Why does a table in an Amazon Redshift cluster consume more or less disk storage space than expected?

Bloques de lápidas

Los bloques de lápidas se generan cuando se produce una transacción WRITE en una tabla de Amazon Redshift y hay una lectura simultánea. Amazon Redshift conserva los bloques antes de la operación de escritura para mantener la coherencia de una operación de lectura simultánea. Los bloques de Amazon Redshift no se pueden cambiar. Cada acción Insert, Update o Delete crea un nuevo conjunto de bloques y marca los bloques antiguos como lápidas.

A veces, las lápidas no se borran en la fase de confirmación debido a transacciones de la tabla de larga duración. También es posible que las lápidas no se borren cuando hay demasiadas cargas de ETL ejecutándose al mismo tiempo. Dado que Amazon Redshift supervisa la base de datos desde el momento en que se inicia la transacción, cualquier tabla que se escriba en la base de datos también conserva los bloques de lápidas. Si las transacciones de tablas de larga ejecución se realizan de forma regular y en varias cargas, se pueden acumular suficientes lápidas como para provocar un error de disco lleno.

También puede obligar a Amazon Redshift a realizar el análisis de los bloques de lápidas mediante la ejecución de un comando de confirmación.

Si hay consultas activas durante mucho tiempo, finalice las consultas (y libere todos los bloques posteriores) mediante el comando commit:

begin;
create table a (id int);
insert into a values(1);
commit;
drop table a;

A continuación, para confirmar los bloques de lápidas, ejecute la siguiente consulta:

select trim(name) as tablename, count(case when tombstone > 0 then 1 else null end) as tombstones from svv_diskusage group by 1 having count(case when tombstone > 0 then 1 else null end) > 0 order by 2 desc;

Copia de un archivo grande

Durante una operación COPY, es posible que reciba un error Disk Full aunque haya suficiente espacio de almacenamiento disponible. Este error se produce si la operación de ordenación se extiende al disco y crea bloques temporales.

Si aparece un mensaje de error Disk Full, compruebe la tabla STL_DISK_FULL_DIAG. Compruebe qué ID de consulta causó el error y los bloques temporales que se crearon:

select '2000-01-01'::timestamp + (currenttime/1000000.0)* interval '1 second' as currenttime,node_num,query_id,temp_blocks from pg_catalog.stl_disk_full_diag;

Para obtener más información sobre las prácticas recomendadas, consulte Prácticas recomendadas de Amazon Redshift para la carga de datos.

Solución de problemas adicionales

Compruebe el porcentaje de espacio en disco en la pestaña Rendimiento de la consola de Amazon Redshift. Para cada nodo del clúster, Amazon Redshift proporciona espacio en disco adicional, que supera la capacidad nominal del disco.

Si observa un aumento repentino en la utilización, use STL_QUERY para identificar las actividades y los trabajos que se están ejecutando. Observe qué consultas se están ejecutando en el momento en que se produce un desbordamiento en el disco:

select * from stl_query where starttime between '2018-01-01 00:30:00' and '2018-01-01 00:40:00';

Nota: Actualice los valores con la hora en que se produjo el pico.

Para identificar las 20 consultas principales de desbordamiento del disco, ejecute la siguiente consulta:

select A.userid, A.query, blocks_to_disk, trim(B.querytxt) text from stl_query_metrics A, stl_query B where A.query = B.query and segment=-1 and step = -1 and max_blocks_to_disk > 0 order by 3 desc limit 20;

Consulte el valor de columna blocks_to_disk para identificar el desbordamiento de disco. Si es necesario, cancele las consultas que generen demasiado desbordamiento. A continuación, asigne memoria adicional a las consultas antes de volver a ejecutarlas. Para obtener más información, consulte STL_QUERY_METRICS.

Para determinar si las consultas se escriben correctamente en un disco, ejecute la siguiente consulta:

SELECT q.query, trim(q.cat_text)
FROM (
SELECT query,
replace( listagg(text,' ') WITHIN GROUP (ORDER BY sequence), '\\n', ' ') AS cat_text
FROM stl_querytext
WHERE userid>1
GROUP BY query) q
JOIN (
SELECT distinct query
FROM svl_query_summary
WHERE is_diskbased='t' AND (LABEL ILIKE 'hash%' OR LABEL ILIKE 'sort%' OR LABEL ILIKE 'aggr%' OR LABEL ILIKE 'save%' OR LABEL ILIKE 'window%' OR LABEL ILIKE 'unique%')
AND userid > 1) qs
ON qs.query = q.query;

Este comando también identifica las consultas que están desbordando al disco.


Información relacionada

Desempeño

Introducción al sistema Amazon Redshift

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año