Leer estadísticas

Spanner proporciona tablas integradas que almacenan estadísticas sobre las lecturas. Puede consultar estadísticas de estas tablas SPANNER_SYS.READ_STATS* mediante instrucciones SQL.

Cuándo usar estadísticas de lectura

Las estadísticas de lectura proporcionan información sobre cómo usa una aplicación la base de datos y son útiles para investigar problemas de rendimiento. Por ejemplo, puedes comprobar qué formas de lectura se están ejecutando en una base de datos, con qué frecuencia se ejecutan y explicar las características de rendimiento de estas formas de lectura. Puedes usar las estadísticas de lectura de tu base de datos para identificar las formas de lectura que provocan un uso elevado de la CPU. A grandes rasgos, las estadísticas de lectura te ayudarán a comprender el comportamiento del tráfico que entra en una base de datos en términos de uso de recursos.

Limitaciones

  • Esta herramienta es la más adecuada para analizar flujos de lecturas similares que representan la mayor parte del uso de la CPU. No es adecuado para buscar lecturas que se hayan ejecutado solo una vez.

  • El uso de la CPU registrado en estas estadísticas representa el uso de la CPU del lado del servidor de Spanner, sin incluir el uso de la CPU de la prefetización y otras sobrecargas.

  • Las estadísticas se recogen en la medida de lo posible. Por lo tanto, es posible que no se registren estadísticas si hay problemas con los sistemas subyacentes. Por ejemplo, si hay problemas con la red interna, es posible que falten algunas estadísticas.

Acceder a las estadísticas de lectura

.

Spanner proporciona las estadísticas de lectura en el esquema SPANNER_SYS. Puedes acceder a los datos de SPANNER_SYS de las siguientes formas:

  • La página de Spanner Studio de una base de datos en la Google Cloud consola.

  • El comando gcloud spanner databases execute-sql.

  • El método executeSql o el método executeStreamingSql.

Los siguientes métodos de lectura única que proporciona Spanner no admiten SPANNER_SYS:

  • Realizar una lectura fuerte desde una sola fila o varias filas en una tabla.
  • Realizar una lectura inactiva de una sola fila o varias filas en una tabla.
  • Leer desde una sola fila o varias filas en un índice secundario.

Uso de CPU agrupado por forma de lectura

En las siguientes tablas se monitorizan las formas de lectura con el mayor uso de CPU durante un periodo específico:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE: lee estadísticas de formas agregadas en intervalos de 1 minuto.
  • SPANNER_SYS.READ_STATS_TOP_10MINUTE: lee estadísticas de formas agregadas en intervalos de 10 minutos.
  • SPANNER_SYS.READ_STATS_TOP_HOUR: lee estadísticas de formas agregadas en intervalos de 1 hora.

Estas tablas tienen las siguientes propiedades:

  • Cada tabla contiene datos de intervalos de tiempo no superpuestos de la duración que se especifica en el nombre de la tabla.

  • Los intervalos se basan en la hora del reloj. Los intervalos de 1 minuto terminan en el minuto, los intervalos de 10 minutos terminan cada 10 minutos a partir de la hora en punto y los intervalos de 1 hora terminan a la hora en punto. Después de cada intervalo, Spanner recoge datos de todos los servidores y, poco después, los pone a disposición en las tablas SPANNER_SYS.

    Por ejemplo, a las 11:59:30, los intervalos más recientes disponibles para las consultas SQL son los siguientes:

    • 1 minuto: de 11:58:00 a 11:58:59
    • 10 minutos: de 11:40:00 a 11:49:59
    • 1 hora: de 10:00:00 a 10:59:59
  • Spanner agrupa las estadísticas por forma de lectura. Si hay una etiqueta, FPRINT es el hash de la etiqueta. De lo contrario, es el hash del valor READ_COLUMNS.

  • Cada fila contiene estadísticas de todas las ejecuciones de una forma de lectura concreta de las que Spanner registra estadísticas durante el intervalo especificado.

  • Si Spanner no puede almacenar información sobre cada lectura distinta ejecutada durante el intervalo, el sistema prioriza las lecturas con el mayor uso de CPU durante el intervalo especificado.

Esquema de tabla

Nombre de la columna Tipo Descripción
INTERVAL_END TIMESTAMP Fin del intervalo de tiempo en el que se produjeron las ejecuciones de lectura incluidas.
REQUEST_TAG STRING Etiqueta de solicitud opcional para esta operación de lectura. Para obtener más información sobre el uso de etiquetas, consulta el artículo Solucionar problemas con etiquetas de solicitud. Las estadísticas de varias lecturas que tienen la misma cadena de etiqueta se agrupan en una sola fila con el `REQUEST_TAG` que coincide con esa cadena de etiqueta.
READ_TYPE STRING Indica si una lectura es PARTITIONED_READ o READ. Una lectura con un token de partición obtenido de la API PartitionRead se representa con el tipo de lectura PARTITIONED_READ, y las demás APIs de lectura, con READ.
READ_COLUMNS ARRAY<STRING> Conjunto de columnas que se han leído. Están en orden alfabético.
FPRINT INT64 El hash del valor REQUEST_TAG, si está presente. De lo contrario, el hash del valor READ_COLUMNS.
EXECUTION_COUNT INT64 Número de veces que Spanner ha ejecutado la forma de lectura durante el intervalo.
AVG_ROWS FLOAT64 Número medio de filas que ha devuelto la lectura.
AVG_BYTES FLOAT64 Número medio de bytes de datos que ha devuelto la lectura, sin incluir la sobrecarga de codificación de transmisión.
AVG_CPU_SECONDS FLOAT64 Número medio de segundos de CPU del lado del servidor de Spanner que se han empleado para ejecutar la lectura, sin incluir la CPU de la prefetización ni otras sobrecargas.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Número medio de segundos que se ha esperado debido al bloqueo.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Número medio de segundos que se ha esperado porque el cliente no ha consumido los datos tan rápido como Spanner podía generarlos.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Promedio de segundos que se tarda en confirmar con el líder de Paxos que se han observado todas las escrituras.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 Número de veces que se ha ejecutado la lectura como parte de una transacción de lectura y escritura. Esta columna te ayuda a determinar si puedes evitar las disputas de bloqueo moviendo la lectura a una transacción de solo lectura.
AVG_DISK_IO_COST FLOAT64

El coste medio de esta consulta en términos de carga de disco HDD de Spanner.

Usa este valor para comparar los costes de E/S de HDD relativos entre lecturas que ejecutes en la base de datos. Consultar datos en almacenamiento HDD conlleva un cargo en la capacidad de carga de disco HDD de la instancia. Un valor más alto indica que estás usando más carga de disco duro y que tu consulta puede ser más lenta que si se ejecutara en SSD. Además, si la carga del disco duro está al máximo de su capacidad, el rendimiento de tus consultas podría verse aún más afectado. Puedes monitorizar la capacidad total de carga del disco HDD de la instancia como porcentaje. Para añadir más capacidad de carga de disco HDD, puedes añadir más unidades de procesamiento o nodos a tu instancia. Para obtener más información, consulta Cambiar la capacidad de computación. Para mejorar el rendimiento de las consultas, también puedes mover algunos datos a SSD.

En el caso de las cargas de trabajo que consumen muchas operaciones de E/S de disco, te recomendamos que almacenes los datos a los que se accede con frecuencia en almacenamiento SSD. Los datos a los que se accede desde SSD no consumen la capacidad de carga del disco duro. Puedes almacenar tablas, columnas o índices secundarios selectivos en almacenamiento SSD según sea necesario, mientras que los datos a los que se acceda con poca frecuencia se pueden almacenar en almacenamiento HDD. Para obtener más información, consulta el artículo Introducción al almacenamiento por niveles.

Consultas de ejemplo

En esta sección se incluyen varios ejemplos de instrucciones SQL que obtienen estadísticas de lectura. Puedes ejecutar estas instrucciones SQL mediante las bibliotecas de cliente, gcloud spanner o la Google Cloud consola.

Lista las estadísticas básicas de cada forma de lectura en un periodo determinado.

La siguiente consulta devuelve los datos sin procesar de las formas más leídas en los intervalos de 1 minuto más recientes.

SELECT fprint,
       read_columns,
       execution_count,
       avg_cpu_seconds,
       avg_rows,
       avg_bytes,
       avg_locking_delay_seconds,
       avg_client_wait_seconds
FROM spanner_sys.read_stats_top_minute
ORDER BY interval_end DESC LIMIT 3;
Salida de la consulta
fprint read_columns execution_count avg_cpu_seconds avg_rows avg_bytes avg_locking_delay_seconds avg_client_wait_seconds
125062082139 ["Singers.id", "Singers.name"] 8514387 0.000661355290396507 310.79 205 8.3232564943763752e-06 0
151238888745 ["Singers.singerinfo"] 3341542 6.5992827184280315e-05 12784 54 4.6859741349028595e-07 0
14105484 ["Albums.id", "Albums.title"] 9306619 0.00017855774721667873 1165.4 2964.71875 1.4328191393074178e-06 0

Lista de las formas de lectura, ordenadas por el uso total de CPU más alto

La siguiente consulta devuelve las lecturas de formas con el mayor uso de CPU en la última hora:

SELECT read_columns,
       execution_count,
       avg_cpu_seconds,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.read_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_top_hour)
ORDER BY total_cpu DESC LIMIT 3;
Salida de la consulta
read_columns execution_count avg_cpu_seconds total_cpu
["Singers.id", "Singers.name"] 1647 0.00023380297430622681 0.2579
["Albums.id", "Albums.title"] 720 0.00016738889440282034 0.221314999999999
["Singers.singerinfo""] 3223 0.00037764625882302246 0.188053

Estadísticas agregadas

SPANNER_SYS también contiene tablas para almacenar estadísticas de lectura agregadas capturadas por Spanner en un periodo específico:

  • SPANNER_SYS.READ_STATS_TOTAL_MINUTE: estadísticas agregadas de todas las lecturas de formas durante intervalos de 1 minuto.
  • SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: estadísticas agregadas de todas las lecturas de formas durante intervalos de 10 minutos.
  • SPANNER_SYS.READ_STATS_TOTAL_HOUR: estadísticas agregadas de todas las formas leídas durante intervalos de 1 hora.

Las tablas de estadísticas agregadas tienen las siguientes propiedades:

  • Cada tabla contiene datos de intervalos de tiempo no superpuestos de la duración que se especifica en el nombre de la tabla.

  • Los intervalos se basan en la hora del reloj. Los intervalos de 1 minuto terminan en el minuto, los intervalos de 10 minutos terminan cada 10 minutos a partir de la hora en punto y los intervalos de 1 hora terminan a la hora en punto.

    Por ejemplo, a las 11:59:30, los intervalos más recientes disponibles para las consultas SQL sobre estadísticas de lectura agregadas son los siguientes:

    • 1 minuto: de 11:58:00 a 11:58:59
    • 10 minutos: de 11:40:00 a 11:49:59
    • 1 hora: de 10:00:00 a 10:59:59
  • Cada fila contiene estadísticas de todas las formas de lectura ejecutadas en la base de datos durante el intervalo especificado, agregadas. Solo hay una fila por intervalo de tiempo.

  • Las estadísticas recogidas en las tablas SPANNER_SYS.READ_STATS_TOTAL_* pueden incluir formas de lectura que Spanner no haya recogido en las tablas SPANNER_SYS.READ_STATS_TOP_*.

  • Algunas columnas de estas tablas se muestran como métricas en Cloud Monitoring. Las métricas expuestas son las siguientes:

    • Número de filas devueltas
    • Leer recuento de ejecuciones
    • Tiempo de CPU de lectura
    • Retrasos en el bloqueo
    • Tiempo de espera del cliente
    • Retraso de actualización del líder
    • Número de bytes devueltos

    Para obtener más información, consulta Métricas de Spanner.

Esquema de tabla

Nombre de la columna Tipo Descripción
INTERVAL_END TIMESTAMP Fin del intervalo de tiempo en el que se han producido las ejecuciones de lectura incluidas.
EXECUTION_COUNT INT64 Número de veces que Spanner ha ejecutado la forma de lectura durante el intervalo.
AVG_ROWS FLOAT64 Número medio de filas que han devuelto las lecturas.
AVG_BYTES FLOAT64 Número medio de bytes de datos que han devuelto las lecturas, sin incluir la sobrecarga de codificación de transmisión.
AVG_CPU_SECONDS FLOAT64 Número medio de segundos de CPU del lado del servidor de Spanner que se han empleado para ejecutar la lectura, sin incluir la CPU de la prefetización ni otras sobrecargas.
AVG_LOCKING_DELAY_SECONDS FLOAT64 Número medio de segundos que se ha esperado debido al bloqueo.
AVG_CLIENT_WAIT_SECONDS FLOAT64 Número medio de segundos que se ha esperado debido a la limitación.
AVG_LEADER_REFRESH_DELAY_SECONDS FLOAT64 Número medio de segundos que se tarda en coordinar las lecturas entre las instancias de las configuraciones multirregionales.
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT INT64 Número de veces que se han realizado lecturas como parte de transacciones de lectura y escritura. Esta columna te ayuda a determinar si puedes evitar conflictos de bloqueo moviendo algunas lecturas a transacciones de solo lectura.

Consultas de ejemplo

En esta sección se incluyen varios ejemplos de instrucciones SQL que obtienen estadísticas de lectura agregadas. Puedes ejecutar estas instrucciones SQL mediante las bibliotecas de cliente, gcloud spanner o la Google Cloud consola.

Buscar el uso total de CPU en todas las formas de lectura

La siguiente consulta devuelve el número de horas de CPU consumidas por las lecturas de formas en la hora más reciente:

SELECT (avg_cpu_seconds * execution_count / 60 / 60)
  AS total_cpu_hours
FROM spanner_sys.read_stats_total_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_hour);
Salida de la consulta
total_cpu_hours
0.00026186111111111115

Consultar el número total de ejecuciones en un periodo determinado

La siguiente consulta devuelve el número total de formas de lectura ejecutadas en el intervalo de 1 minuto completo más reciente:

SELECT interval_end,
       execution_count
FROM spanner_sys.read_stats_total_minute
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.read_stats_total_minute);
Salida de la consulta
interval_end execution_count
2020-05-28 11:02:00-07:00 12861966

Conservación de datos

Como mínimo, Spanner conserva los datos de cada tabla durante los siguientes periodos:

  • SPANNER_SYS.READ_STATS_TOP_MINUTE y SPANNER_SYS.READ_STATS_TOTAL_MINUTE: intervalos que abarcan las 6 horas anteriores.

  • SPANNER_SYS.READ_STATS_TOP_10MINUTE y SPANNER_SYS.READ_STATS_TOTAL_10MINUTE: intervalos que abarcan los 4 días anteriores.

  • SPANNER_SYS.READ_STATS_TOP_HOUR y SPANNER_SYS.READ_STATS_TOTAL_HOUR: intervalos que abarcan los 30 días anteriores.

Solucionar problemas de uso elevado de la CPU con estadísticas de lectura

Las estadísticas de lectura de Spanner son útiles en los casos en los que necesitas investigar un uso elevado de la CPU en tu base de datos de Spanner o cuando solo quieres entender las formas de lectura que consumen mucha CPU en tu base de datos. La inspección de las formas de lectura que usan cantidades significativas de recursos de la base de datos ofrece a los usuarios de Spanner una forma de reducir los costes operativos y, posiblemente, mejorar las latencias generales del sistema. Siguiendo los pasos que se indican a continuación, te mostraremos cómo usar las estadísticas de lectura para investigar el uso elevado de la CPU en tu base de datos.

Seleccionar un periodo para investigar

Empieza tu investigación buscando un momento en el que tu aplicación empezara a experimentar un uso elevado de la CPU. Por ejemplo, en la siguiente situación, el problema empezó a producirse alrededor de las 17:20 del 28 de mayo del 2020.

Recoger estadísticas de lectura del periodo seleccionado

Una vez que hayamos seleccionado el periodo para iniciar la investigación, consultaremos las estadísticas recogidas en la tabla READ_STATS_TOTAL_10MINUTE en ese momento. Los resultados de esta consulta pueden darnos pistas sobre cómo han cambiado la CPU y otras estadísticas de lectura durante ese periodo. La siguiente consulta devuelve las estadísticas de lectura agregadas del 4:30 pm al 7:30 pm (ambos incluidos).

SELECT
  interval_end,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_locking_delay_seconds
FROM SPANNER_SYS.READ_STATS_TOTAL_10MINUTE
WHERE
  interval_end >= "2020-05-28T16:30:00"
  AND interval_end <= "2020-05-28T19:30:00"
ORDER BY interval_end;

Los siguientes datos son un ejemplo del resultado que obtenemos de nuestra consulta.

interval_end avg_cpu_seconds execution_count avg_locking_delay_seconds
2020-05-28 16:40:00-07:00 0,0004 11111421 8.3232564943763752e-06
2020-05-28 16:50:00-07:00 0,0002 8815637 8,98734051776406e-05
2020-05-28 17:00:00-07:00 0,0001 8260215 6.039129247846453e-06
2020-05-28 17:10:00-07:00 0,0001 8514387 9.0535466616680686e-07
2020-05-28 17:20:00-07:00 0,0006 13715466 2,6801485272173765e-06
2020-05-28 17:30:00-07:00 0,0007 12861966 4.6859741349028595e-07
2020-05-28 17:40:00-07:00 0,0007 3755954 2.7131391918005383e-06
2020-05-28 17:50:00-07:00 0,0006 4248137 1.4328191393074178e-06
2020-05-28 18:00:00-07:00 0,0006 3986198 2,6973481999639748e-06
2020-05-28 18:10:00-07:00 0,0006 3510249 3,7577083563017905e-06
2020-05-28 18:20:00-07:00 0,0004 3341542 4,0940589703795433e-07
2020-05-28 18:30:00-07:00 0,0002 8695147 1,9914494947583975e-05
2020-05-28 18:40:00-07:00 0,0003 11679702 1,8331461539001595e-05
2020-05-28 18:50:00-07:00 0,0003 9306619 1,2527332321222135e-05
2020-05-28 19:00:00-07:00 0,0002 8520508 6,2268448078447915e-06
2020-05-28 19:10:00-07:00 0,0006 13715466 2,6801485272173765e-06
2020-05-28 19:20:00-07:00 0,0005 11947323 3.3029114639321295e-05
2020-05-28 19:30:00-07:00 0,0002 8514387 9.0535466616680686e-07

Aquí vemos que el tiempo de CPU medio, avg_cpu_seconds, es mayor en los intervalos resaltados. El interval_end con el valor 2020-05-28 19:20:00 tiene un tiempo de CPU superior, por lo que elegiremos ese intervalo para investigar más a fondo en el siguiente paso.

Descubrir qué formas de lectura están provocando un uso elevado de la CPU

Si profundizamos un poco más, ahora consultamos la tabla READ_STATS_TOP_10MINUTE para el intervalo que se ha seleccionado en el paso anterior. Los resultados de esta consulta pueden ayudar a determinar qué formas de lectura provocan un uso elevado de la CPU.

SELECT
  read_columns,
  ROUND(avg_cpu_seconds,4) as avg_cpu_seconds,
  execution_count,
  avg_rows
FROM SPANNER_SYS.READ_STATS_TOP_10MINUTE
WHERE
  interval_end = "2020-05-28T19:20:00"
ORDER BY avg_cpu_seconds DESC LIMIT 3;

Los siguientes datos son un ejemplo del resultado que obtenemos de nuestra consulta, que devuelve información sobre las tres formas de lectura principales clasificadas por avg_cpu_seconds. Fíjate en el uso de ROUND en nuestra consulta para limitar la salida de avg_cpu_seconds a 4 decimales.

read_columns avg_cpu_seconds execution_count avg_rows
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.shares]1 0,4192 1182 11650.42216582
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.likes,globalTagAffinity.score] 0,0852 4 12784
[TestHigherLatency._exists,TestHigherLatency.lang_status,TestHigherLatency.score,globalTagAffinity.ugcCount] 0,0697 1140 310,7921052631

1 _exists es un campo interno que se usa para comprobar si existe una fila determinada.

Una de las razones por las que el uso de la CPU es elevado puede ser que empieces a ejecutar algunas lecturas de formas con más frecuencia (execution_count). Quizá haya aumentado el número medio de filas que ha devuelto la lectura (avg_rows). Si ninguna de esas propiedades de la lectura de formas revela nada interesante, puedes examinar otras propiedades, como avg_locking_delay_seconds, avg_client_wait_seconds o avg_bytes.

Aplicar prácticas recomendadas para reducir el uso elevado de la CPU

Una vez que hayas completado los pasos anteriores, plantéate si aplicar alguna de estas prácticas recomendadas te ayudará en tu situación.

  • El número de veces que Spanner ha ejecutado formas de lectura durante el intervalo es un buen ejemplo de una métrica que necesita un valor de referencia para indicarte si una medición es razonable o si indica que hay un problema. Una vez que hayas establecido una base para la métrica, podrás detectar e investigar la causa de cualquier desviación inesperada del comportamiento normal.

  • Si el uso de la CPU es relativamente constante la mayor parte del tiempo, pero de repente muestra un pico que se puede correlacionar con un pico repentino similar en las solicitudes de los usuarios o en el comportamiento de la aplicación, puede ser una indicación de que todo funciona correctamente.

  • Prueba la siguiente consulta para encontrar las formas de lectura principales ordenadas por el número de veces que Spanner ha ejecutado cada forma de lectura:

    SELECT interval_end, read_columns, execution_count
    FROM SPANNER_SYS.READ_STATS_TOP_MINUTE
    ORDER BY execution_count DESC
    LIMIT 10;
    
  • Si buscas las latencias de lectura más bajas posibles, sobre todo cuando usas configuraciones de instancias multirregión, utiliza lecturas obsoletas en lugar de lecturas sólidas para reducir o eliminar el componente AVG_LEADER_REFRESH_DELAY_SECONDS de la latencia de lectura.

  • Si solo vas a leer datos y puedes hacerlo con un único método de lectura, debes usarlo. Las lecturas únicas no bloquean, a diferencia de las transacciones de lectura y escritura, por lo que debes usar transacciones de solo lectura en lugar de transacciones de lectura y escritura más costosas cuando no escribas datos.

Siguientes pasos