Spanner fournit des tables intégrées qui stockent des statistiques sur les lectures. Vous pouvez récupérer les statistiques de ces tables SPANNER_SYS.READ_STATS*
à l'aide d'instructions SQL.
Dans quels cas utiliser les statistiques de lecture
Les statistiques de lecture fournissent des informations sur l'utilisation d'une base de données par une application. Elles sont utiles pour analyser les problèmes de performances. Par exemple, vous pouvez vérifier les formes de lecture qui s'exécutent sur une base de données, leur fréquence d'exécution et les caractéristiques de performance de ces formes de lecture. Vous pouvez utiliser les statistiques de lecture de votre base de données pour identifier les formes de lecture qui suscitent une utilisation intensive du processeur. De manière générale, les statistiques de lecture vous aideront à comprendre le comportement du trafic entrant dans une base de données en termes d'utilisation des ressources.
Limites
Cet outil est particulièrement adapté à l'analyse des flux de lectures similaires qui représentent la majorité de l'utilisation du processeur. Il ne convient pas pour rechercher des lectures n'ayant été exécutées qu'une seule fois.
L'utilisation du processeur suivie dans ces statistiques représente l'utilisation du processeur côté serveur de Spanner, à l'exclusion de l'utilisation du processeur de préchargement et d'autres surcharges supplémentaires.
Les statistiques sont collectées de la manière la plus optimale possible. Par conséquent, il est possible que les statistiques soient oubliées en cas de problèmes liés à des systèmes sous-jacents. Par exemple, en cas de problème lié au réseau interne, il est possible que certaines statistiques ne soient pas prises en compte.
Disponibilité
Les données SPANNER_SYS
ne sont disponibles que via des interfaces SQL. Exemple :
Page Spanner Studio d'une base de données dans la console Google Cloud
La commande
gcloud spanner databases execute-sql
L'API
executeQuery
Les autres méthodes de lecture unique fournies par Spanner ne sont pas compatibles
SPANNER_SYS
Utilisation du processeur regroupée par forme de lecture
Les tables ci-dessous suivent les formes de lecture ayant entraîné le plus haut niveau d'utilisation du processeur pendant une période donnée :
SPANNER_SYS.READ_STATS_TOP_MINUTE
: statistiques de forme de lecture globales sur des intervalles d'une minute.SPANNER_SYS.READ_STATS_TOP_10MINUTE
: statistiques de forme de lecture globales sur des intervalles de 10 minutes.SPANNER_SYS.READ_STATS_TOP_HOUR
: statistiques de forme de lecture globales sur des intervalles d'une heure.
Ces tables ont les propriétés suivantes :
Chaque table contient les données correspondant à des intervalles de temps sans chevauchement de la durée spécifiée par le nom de la table.
Les intervalles sont définis selon l'heure réelle. Les intervalles d'une minute se terminent toutes les minutes, les intervalles de 10 minutes s'achèvent toutes les 10 minutes à partir de l'heure juste, et les intervalles d'une heure prennent fin toutes les heures. Après chaque intervalle, Spanner collecte les données serveurs, puis rend les données disponibles dans les tables SPANNER_SYS sous peu par la suite.
Par exemple, à 11:59:30, les intervalles les plus récents disponibles pour les requêtes SQL sont les suivants :
- 1 minute : 11:58:00 – 11:58:59
- 10 minutes : 11:40:00 – 11:49:59
- 1 heure : 10:00:00 – 10:59:59
Spanner regroupe les statistiques par forme de lecture. Si une balise est présente, FPRINT correspond au hachage de la balise. Sinon, il s'agit du hachage de la valeur
READ_COLUMNS
.Chaque ligne contient les statistiques correspondant à toutes les exécutions d'une forme de lecture donnée pour laquelle Spanner enregistre des statistiques pendant l'intervalle spécifié.
Si Spanner n'est pas en mesure de stocker des informations sur chaque lecture distincte de forme exécutée pendant l'intervalle, le système donne la priorité aux formes lues avec le paramètre l'utilisation la plus élevée du processeur pendant l'intervalle spécifié.
Schéma de la table
Nom de la colonne | Type | Description |
---|---|---|
INTERVAL_END |
TIMESTAMP |
Fin de l'intervalle de temps au cours duquel les exécutions de lecture retenues ont eu lieu. |
REQUEST_TAG |
STRING |
Tag de requête facultatif pour cette opération de lecture. Pour en savoir plus sur l'utilisation des tags, consultez la page Résoudre les problèmes liés aux tags de requête. Les statistiques de plusieurs lectures ayant la même chaîne de tag sont regroupées sur une seule ligne avec le "REQUEST_TAG" correspondant à cette chaîne de tag. |
READ_TYPE |
STRING |
Indique si une lecture est un PARTITIONED_READ ou
READ Une lecture avec
partitionToken obtenu à partir de l'API PartitionRead est représenté par le
le type de lecture PARTITIONED_READ et les autres API de lecture par
READ
|
READ_COLUMNS |
ARRAY<STRING> |
Ensemble de colonnes lues. Classées par ordre alphabétique. |
FPRINT |
INT64 |
Hachage de la valeur REQUEST_TAG , le cas échéant. Dans le cas contraire, hachage de la valeur READ_COLUMNS . |
EXECUTION_COUNT |
INT64 |
Nombre de fois où Spanner a exécuté la forme de lecture au cours de la l'intervalle. |
AVG_ROWS |
FLOAT64 |
Nombre moyen de lignes renvoyées par la lecture. |
AVG_BYTES |
FLOAT64 |
Nombre moyen d'octets de données renvoyés par la lecture, à l'exclusion de la surcharge liée à l'encodage de la transmission. |
AVG_CPU_SECONDS |
FLOAT64 |
Nombre moyen de secondes du processeur côté serveur Spanner exécutant la lecture, à l'exclusion du processeur de préchargement et d'autres surcharges. |
AVG_LOCKING_DELAY_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à attendre en raison du verrouillage. |
AVG_CLIENT_WAIT_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à attendre, car le client ne consomme pas les données aussi rapidement que Spanner peut les générer. |
AVG_LEADER_REFRESH_DELAY_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à attendre la confirmation, avec le leader Paxos, que toutes les écritures ont été observées. |
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT |
INT64 |
Nombre de fois où la lecture a été exécutée dans le cadre d'une transaction en lecture/écriture. Cette colonne vous aide à déterminer si vous pouvez éviter les conflits de verrouillage en déplaçant la lecture à une transaction en lecture seule. |
Exemples de requêtes
Cette section présente plusieurs exemples d'instructions SQL permettant d'extraire des statistiques de lecture. Vous pouvez exécuter ces instructions SQL à l'aide du bibliothèques clientes, gcloud spanner ou Console Google Cloud :
Répertorier les statistiques de base relatives à chaque forme de lecture sur une période donnée
La requête suivante renvoie les données brutes correspondant aux principales formes de lecture exécutées dans les intervalles d'une minute les plus récents.
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;
Sortie de la requête
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 |
Répertorier les formes de lecture, triées en fonction du plus haut niveau d'utilisation totale du processeur
La requête suivante renvoie les formes de lecture avec le plus haut niveau d'utilisation du processeur au cours de l'heure la plus récente :
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;
Sortie de la requête
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 |
Statistiques globales
SPANNER_SYS
contient également des tables pour stocker les statistiques de lecture agrégées capturées
par Spanner sur une période donnée:
SPANNER_SYS.READ_STATS_TOTAL_MINUTE
: statistiques globales pour toutes les formes de lecture pendant des intervalles d'une minute.SPANNER_SYS.READ_STATS_TOTAL_10MINUTE
: statistiques globales pour toutes les formes de lecture pendant des intervalles de 10 minutes.SPANNER_SYS.READ_STATS_TOTAL_HOUR
: statistiques globales pour toutes les formes de lecture pendant des intervalles d'une heure.
Les tableaux de statistiques globales présentent les propriétés suivantes :
Chaque table contient les données correspondant à des intervalles de temps sans chevauchement de la durée spécifiée par le nom de la table.
Les intervalles sont définis selon l'heure réelle. Les intervalles d'une minute se terminent toutes les minutes, les intervalles de 10 minutes s'achèvent toutes les 10 minutes à partir de l'heure juste, et les intervalles d'une heure prennent fin toutes les heures.
Par exemple, à 11:59:30, les intervalles les plus récents disponibles pour les requêtes SQL sur les statistiques de lecture globales sont les suivants :
- 1 minute : 11:58:00 – 11:58:59
- 10 minutes : 11:40:00 – 11:49:59
- 1 heure : 10:00:00 – 10:59:59
Chaque ligne contient les statistiques globales correspondant à l'ensemble des formes de lecture exécutées sur la base de données au cours de l'intervalle spécifié. Il n'y a par conséquent qu'une seule ligne par intervalle de temps.
Les statistiques capturées dans les tables
SPANNER_SYS.READ_STATS_TOTAL_*
peuvent inclure les formes de lecture que Spanner n'a pas capturéesSPANNER_SYS.READ_STATS_TOP_*
tables.Certaines colonnes de ces tables sont présentées en tant que métriques dans Cloud Monitoring. Les métriques exposées sont les suivantes:
- Nombre de lignes renvoyées
- Nombre d'exécutions de lecture
- Lire le temps CPU
- Retards de verrouillage
- Temps d'attente du client
- Délai d'actualisation du leader
- Nombre d'octets renvoyés
Pour en savoir plus, consultez la page Métriques Spanner.
Schéma de la table
Nom de la colonne | Type | Description |
---|---|---|
INTERVAL_END |
TIMESTAMP |
Fin de l'intervalle de temps au cours duquel les exécutions de formes de lecture retenues ont eu lieu. |
EXECUTION_COUNT |
INT64 |
Nombre d'exécutions de la forme de lecture par Spanner au cours de l'intervalle. |
AVG_ROWS |
FLOAT64 |
Nombre moyen de lignes renvoyées par les lectures. |
AVG_BYTES |
FLOAT64 |
Nombre moyen d'octets de données renvoyés par les lectures, à l'exclusion de la surcharge liée à l'encodage de la transmission |
AVG_CPU_SECONDS |
FLOAT64 |
Nombre moyen de secondes du processeur côté serveur Spanner exécutant la lecture, à l'exclusion du processeur de préchargement et d'autres surcharges. |
AVG_LOCKING_DELAY_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à attendre en raison du verrouillage. |
AVG_CLIENT_WAIT_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à attendre en raison de la limitation. |
AVG_LEADER_REFRESH_DELAY_SECONDS |
FLOAT64 |
Nombre moyen de secondes passées à coordonner les lectures entre instances dans des configurations multirégionales. |
RUN_IN_RW_TRANSACTION_EXECUTION_COUNT |
INT64 |
Nombre de fois où des lectures ont été exécutées dans le cadre de transactions en lecture/écriture. Cette colonne vous aide à déterminer si vous pouvez éviter les conflits de verrouillage en déplaçant certaines lectures vers des transactions en lecture seule. |
Exemples de requêtes
Cette section présente plusieurs exemples d'instructions SQL permettant d'extraire des statistiques de lecture globales. Vous pouvez exécuter ces instructions SQL à l'aide des bibliothèques clientes, de gcloud spanner ou de la console Google Cloud.
Déterminer l'utilisation totale du processeur pour toutes les formes de lecture
La requête suivante renvoie le nombre d'heures de processeur consommées par les formes de lecture au cours de la dernière heure :
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);
Sortie de la requête
total_cpu_hours |
---|
0.00026186111111111115 |
Déterminer le nombre total d'exécutions pour une période donnée
La requête suivante renvoie le nombre total de formes de lecture exécutées dans l'intervalle complet d'une minute le plus récent :
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);
Sortie de la requête
interval_end | execution_count |
---|---|
2020-05-28 11:02:00-07:00 |
12861966 |
Conservation des données
Spanner conserve les données de chaque table pendant une durée minimale variable selon le type de table :
SPANNER_SYS.READ_STATS_TOP_MINUTE
etSPANNER_SYS.READ_STATS_TOTAL_MINUTE
: intervalles couvrant les six heures précédentesSPANNER_SYS.READ_STATS_TOP_10MINUTE
etSPANNER_SYS.READ_STATS_TOTAL_10MINUTE
: intervalles couvrant les quatre derniers jours.SPANNER_SYS.READ_STATS_TOP_HOUR
etSPANNER_SYS.READ_STATS_TOTAL_HOUR
: intervalles couvrant les 30 derniers jours.
Résoudre les problèmes d'utilisation élevée du processeur à l'aide des statistiques de lecture
Les statistiques de lecture Spanner sont utiles lorsque vous devez analyser l'utilisation élevée du processeur dans votre base de données Spanner ou lorsque vous essayez simplement de comprendre les formes de lecture qui utilisent un processeur de manière intensive sur votre base de données. L'inspection des formes de lecture qui utilisent d'importantes quantités de ressources de base de données permet aux utilisateurs de Spanner de réduire les coûts opérationnels et d'améliorer éventuellement les latences générales du système. Les étapes suivantes vous expliquent comment utiliser les statistiques de lecture pour analyser l'utilisation élevée du processeur dans votre base de données.
Sélectionnez une période à examiner
Commencez votre évaluation en recherchant une heure à laquelle votre application a commencé à subir une utilisation élevée du processeur. Par exemple, dans le scénario suivant, le problème est survenu vers 17h20, le 28 mai 2020.
Collecter les statistiques de lecture pour la période sélectionnée
Après avoir sélectionné une période pour démarrer notre enquête, nous examinerons les statistiques collectées dans la table READ_STATS_TOTAL_10MINUTE
autour de cette période.
Les résultats de cette requête peuvent nous donner des indications sur la manière dont les statistiques du processeur et autres statistiques de lecture ont évolué au cours de cette période. La requête suivante renvoie les statistiques de lecture agrégées de 4:30 pm
à 7:30 pm
(inclus).
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;
Les données suivantes sont un exemple du résultat que nous obtenons de notre requête.
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 |
Ici, nous constatons que le temps CPU moyen (avg_cpu_seconds
) est plus élevé dans les intervalles mis en surbrillance. Le paramètre interval_end
présentant la valeur 2020-05-28 19:20:00 présente un temps CPU plus élevé. Nous allons donc choisir cet intervalle pour réaliser un examen plus approfondi.
Identifier les formes de lecture qui entraînent une utilisation élevée du processeur
Pour aller un peu plus loin, nous allons maintenant interroger la table READ_STATS_TOP_10MINUTE
pour l'intervalle sélectionné à l'étape précédente. Les résultats de cette requête peuvent aider à indiquer les formes de lecture qui entraînent une utilisation élevée du processeur.
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;
Les données suivantes constituent un exemple du résultat obtenu à la suite de notre requête, renvoyant des informations sur les trois principales formes de lecture classées par avg_cpu_seconds
. Notez l'utilisation de ROUND
dans notre requête pour limiter la sortie de avg_cpu_seconds
à 4 décimales.
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
est un champ interne utilisé pour vérifier si une ligne existe ou non.
L'utilisation élevée du processeur peut être due à l'exécution plus fréquente de formes de lecture (execution_count
). Le nombre moyen de lignes renvoyées par la lecture a peut-être augmenté (avg_rows
). Si aucune de ces propriétés de la forme de lecture ne révèle quelque chose d'intéressant, vous pouvez examiner d'autres propriétés, telles que avg_locking_delay_seconds
, avg_client_wait_seconds
ou avg_bytes
.
Appliquer les bonnes pratiques pour réduire l'utilisation élevée du processeur
Lorsque vous avez terminé les étapes précédentes, déterminez si l'une de ces bonnes pratiques peut vous aider.
Parmi les bons exemples de métrique nécessitant une référence pour vous indiquer si une mesure est raisonnable ou plutôt synonyme de problème, l'on retrouve le nombre d'exécutions des formes de lecture par Spanner pendant l'intervalle. Après avoir établi une référence pour la métrique, vous pourrez détecter et examiner la cause d'écarts inattendus par rapport au comportement normal.
Si l'utilisation du processeur est relativement constante, mais montre soudainement un pic pouvant être mis en corrélation avec un pic soudain de demandes d'utilisateurs ou de comportement d'application, cela peut indiquer que tout fonctionne comme prévu.
Essayez la requête suivante pour trouver les formes de lecture les plus classées par nombre de nombre d'exécutions de Spanner pour chaque forme de lecture:
SELECT interval_end, read_columns, execution_count FROM SPANNER_SYS.READ_STATS_TOP_MINUTE ORDER BY execution_count DESC LIMIT 10;
Si vous recherchez les latences de lecture les plus faibles possibles, en particulier lors de l'utilisation de configurations d'instances multirégionales, utilisez des lectures non actualisées plutôt que des lectures fortes pour réduire ou supprimer le composant
AVG_LEADER_REFRESH_DELAY_SECONDS
de la latence de lecture.Si vous n'effectuez que des lectures et que vous pouvez les exprimer à l'aide d'une méthode de lecture unique, utilisez cette méthode. Contrairement aux transactions en lecture-écriture, les lectures uniques ne se verrouillent pas. Par conséquent, lorsque vous n'écrivez pas de données, il est donc recommandé d'utiliser des transactions en lecture seule plutôt que des transactions en lecture-écriture plus coûteuses.
Étape suivante
- Découvrez d'autres outils d'introspection.
- Pour en savoir plus sur les autres informations stockées par Spanner pour chaque base de données, consultez la du schéma d'informations de la base de données.
- En savoir plus sur les bonnes pratiques SQL pour Spanner.
- En savoir plus sur l'investigation de l'utilisation élevée du processeur.