Hologres est un moteur d'entrepôt de données en temps réel compatible avec le protocole PostgreSQL. Il prend en charge l'écriture et la mise à jour en temps réel, ainsi que le traitement analytique en ligne (OLAP) sur des pétaoctets de données, tout en offrant des services de données en ligne à faible latence et haute concurrence.
Cette rubrique explique comment exécuter des tests de performance pour l'écriture, la mise à jour et les requêtes ponctuelles de données à l'aide de l'outil holo-e2e-performance-tool, et fournit des résultats de référence obtenus sur une instance disposant de 64 vCPU.
Scénarios de test
|
Scénario |
Objet du test |
Formats de stockage |
|
Écriture de données |
Débit d'écriture vers des tables orientées ligne, colonne ou hybrides (ligne-colonne) |
Les trois formats |
|
Mise à jour de données |
Débit de mise à jour globale et partielle sur des tables dotées d'une clé primaire |
Les trois formats |
|
Requête ponctuelle |
Performance des requêtes ponctuelles filtrées par clé primaire |
Uniquement les formats orientés ligne et hybrides (ligne-colonne) |
Les tables orientées colonne ne sont pas adaptées aux requêtes ponctuelles et sont exclues de ce scénario.
Fonctionnement
Les trois scénarios de test s'enchaînent logiquement :
Test d'écriture -- Remplissez une table avec des données de test.
Test de mise à jour -- Réutilisez la même table pour mesurer le débit de mise à jour (conservez la table créée à l'étape 1).
Test de requête ponctuelle -- Interrogez la même table via sa clé primaire.
Mécanismes d'écriture et de mise à jour
L'outil prend en charge deux modes d'écriture :
Mode Fixed Copy -- Utilise l'instruction PostgreSQL
COPY, optimisée grâce aux plans fixes pour accélérer l'exécution des instructions SQL.Mode Insert -- Utilise des instructions
INSERTstandard, également optimisées via les plans fixes.
Dans les deux modes, l'outil ajoute automatiquement deux colonnes à la table :
|
Colonne |
Rôle |
Comportement |
|
|
Clé primaire et clé de distribution |
Commence à 1 et s'incrémente pour chaque ligne |
|
|
Clé de segment |
Définie avec l'horodatage actuel à chaque écriture |
Pour chaque colonne TEXT configurée, l'outil écrit une chaîne de la longueur spécifiée, à laquelle est ajoutée la valeur de id. Le test s'arrête lorsque le nombre cible de lignes ou la durée définie est atteint.
Lors des mises à jour, le même schéma incrémental pour id est utilisé. Pour les mises à jour partielles, seul un sous-ensemble des colonnes TEXT est réécrit.
Mécanismes des requêtes ponctuelles
L'outil prend en charge deux modes de requête :
Mode asynchrone -- L'API de requête ponctuelle est non bloquante. Plusieurs requêtes sont regroupées dans une seule instruction SQL, ce qui maximise le débit. Ce mode convient particulièrement aux scénarios à haut débit, tels que les jointures de tables en temps réel basées sur Flink.
Mode synchrone -- L'API de requête ponctuelle est bloquante. Chaque requête correspond à une instruction SQL distincte et doit se terminer avant que la suivante ne démarre. Ce mode est idéal pour les scénarios sensibles à la latence.
Pendant le test, l'outil sélectionne aléatoirement une clé primaire dans la plage configurée et exécute une requête ponctuelle. Le test s'arrête lorsque la durée cible est atteinte.
Prérequis
Avant de commencer, préparez les éléments suivants :
Une instance Hologres (dédiée, paiement à l'utilisation). Les résultats de référence présentés dans cette rubrique ont été obtenus sur une instance disposant de 64 vCPU et de 256 Go de mémoire. Utilisez une instance nouvellement créée plutôt qu'une instance ayant fait l'objet d'un upgrade ou d'un downgrade, afin de minimiser les variables susceptibles d'affecter les résultats.
-
Une instance Elastic Compute Service (ECS) servant de client de test :
Type d'instance recommandé :
ecs.g6.4xlargeSystème d'exploitation : Alibaba Cloud Linux 3.2104 LTS 64 bits
Stockage : SSD entreprise (ESSD)
L'instance ECS doit se trouver dans la même région, le même Virtual Private Cloud (VPC) et la même zone que l'instance Hologres.
Une base de données créée sur l'instance Hologres. Pour plus de détails, consultez la rubrique Créer une base de données.
Java Development Kit (JDK) 11 installé sur l'instance ECS. Pour plus de détails, consultez la rubrique Déployer manuellement OpenJDK.
Le fichier JAR holo-e2e-performance-tool, téléchargé sur l'instance ECS. Pour les instructions de téléchargement, consultez la rubrique Utiliser Workbench.
Les spécifications ECS mentionnées ci-dessus sont des recommandations, non des exigences absolues. Pendant les tests, surveillez l'utilisation du processeur et la bande passante réseau de l'instance ECS pour vous assurer que le client ne constitue pas un goulot d'étranglement.
À propos de l'outil de test
holo-e2e-performance-tool est un outil open source développé par l'équipe Hologres. Il intègre la création de table, la génération de données de test et la mesure des performances dans un seul fichier JAR, éliminant ainsi le besoin de préparer séparément les données de test. La clé primaire des données générées est une série d'entiers consécutifs, ce qui garantit un taux de hit complet lors des tests de mise à jour et de requêtes ponctuelles.
Exécuter un test d'écriture de données
Étape 1 : Créer le fichier de configuration
Sur l'instance ECS, créez un fichier nommé test_insert.conf avec le contenu suivant :
# Connection configuration
holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME>
holoClient.username=<AccessKey_ID>
holoClient.password=<AccessKey_Secret>
holoClient.writeThreadSize=100
# Write configuration
put.threadSize=8
put.testByTime=false
put.rowNumber=200000000
put.testTime=600000
# Table configuration
put.tableName=kv_test
put.columnCount=20
put.columnSize=20
put.orientation=row
# Other configurations
put.createTableBeforeRun=true
put.deleteTableAfterDone=false
put.vacuumTableBeforeRun=false
Cet exemple crée une table orientée ligne. Pour tester une table orientée colonne ou hybride (ligne-colonne), modifiez la valeur du paramètreorientationencolumnourow,column.
Remplacez les espaces réservés par vos valeurs réelles :
|
Espace réservé |
Description |
Où le trouver |
|
|
Nom de domaine VPC de l'instance Hologres |
Instance Details > Network Information dans la console Hologres |
|
|
Numéro de port de l'instance Hologres |
Même emplacement que ci-dessus |
|
|
Nom de la base de données de test |
La base de données créée lors des prérequis |
|
|
ID AccessKey de votre compte Alibaba Cloud |
Page AccessKey Management |
|
|
Secret AccessKey de votre compte Alibaba Cloud |
Même emplacement que ci-dessus |
Paramètres de configuration
Module | Paramètre | Description | Notes |
Connexion |
| Chaîne de connexion Java Database Connectivity (JDBC). Format : | Utilisez le nom de domaine VPC pour |
| ID AccessKey | ||
| Secret AccessKey | ||
| Nombre de threads d'écriture par Holo Client. Chaque thread utilise une connexion. S'applique uniquement au mode Insert. | En mode Fixed Copy, le nombre de connexions équivaut à | |
Écriture |
| Nombre de threads de génération de données | En mode Fixed Copy, chaque thread utilise une connexion (nombre total de connexions = |
| Contrôle si le test s'exécute pendant une durée fixe ou pour un nombre fixe de lignes |
| |
| Nombre cible de lignes. S'applique uniquement lorsque | ||
| Durée cible en millisecondes. S'applique uniquement lorsque | ||
Table |
| Nom de la table de test | |
| Nombre de colonnes TEXT dans la table | ||
| Longueur en caractères de chaque colonne TEXT | ||
| Format de stockage de la table |
| |
Autre |
| Indique si la table doit être créée avant le début du test |
|
| Indique si la table doit être supprimée après la fin du test | Définissez ce paramètre sur | |
| Indique si la commande | La commande |
Étape 2 : Exécuter le test
# Fixed Copy mode
java -jar holo-e2e-performance-tool-1.0.0.jar test_insert.conf FIXED_COPY
# Or, Insert mode
java -jar holo-e2e-performance-tool-1.0.0.jar test_insert.conf INSERT
Étape 3 : Consulter les résultats
cat result.csv
Consultez la section Champs de résultat pour connaître le format de sortie.
Conservez la table de test (définissez deleteTableAfterDone=false) si vous prévoyez d'effectuer ensuite des tests de mise à jour ou de requêtes ponctuelles.
Exécuter un test de mise à jour de données
Le test de mise à jour réutilise la table remplie lors du test d'écriture. Deux types de mise à jour sont pris en charge : la mise à jour globale (toutes les colonnes) et la mise à jour partielle (un sous-ensemble de colonnes).
Mise à jour globale
-
Créez un fichier nommé
test_update.conf. Utilisez la même configuration que pour le test d'écriture, mais remplacez la valeur decreateTableBeforeRunparfalse:La seule modification par rapport à la configuration du test d'écriture consiste à définir
createTableBeforeRun=false. Cela permet de conserver la table et les données existantes.# Connection configuration holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.writeThreadSize=100 # Write configuration put.threadSize=8 put.testByTime=false put.rowNumber=200000000 put.testTime=600000 # Table configuration put.tableName=kv_test put.columnCount=20 put.columnSize=20 put.orientation=row # Other configurations put.createTableBeforeRun=false put.deleteTableAfterDone=false put.vacuumTableBeforeRun=false -
Exécutez le test :
java -jar holo-e2e-performance-tool-1.0.0.jar test_update.conf FIXED_COPY -
Consultez les résultats :
cat result.csv
Mise à jour partielle
Une mise à jour partielle écrit dans un sous-ensemble des colonnes TEXT. Le paramètre writeColumnCount contrôle le nombre de colonnes mises à jour.
-
Créez un fichier nommé
test_update_part.conf. Ajoutez le paramètrewriteColumnCountà la section de configuration de la table :Avec
writeColumnCount=10, 10 des 20 colonnes TEXT sont mises à jour (soit 50 %). Ajustez ce ratio en fonction de votre charge de travail.# Connection configuration holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME> holoClient.username=<AccessKey_ID> holoClient.password=<AccessKey_Secret> holoClient.writeThreadSize=100 # Write configuration put.threadSize=8 put.testByTime=false put.rowNumber=200000000 put.testTime=600000 # Table configuration put.tableName=kv_test put.columnCount=20 put.columnSize=20 put.writeColumnCount=10 put.orientation=row # Other configurations put.createTableBeforeRun=false put.deleteTableAfterDone=false put.vacuumTableBeforeRun=false -
Exécutez le test :
java -jar holo-e2e-performance-tool-1.0.0.jar test_update_part.conf FIXED_COPY -
Consultez les résultats :
cat result.csv
Exécuter un test de requête ponctuelle
Étape 1 : Créer le fichier de configuration
Créez un fichier nommé test_get.conf :
# Connection configuration
holoClient.jdbcUrl=jdbc:hologres://<ENDPOINT>:<PORT>/<DBNAME>
holoClient.username=<AccessKey_ID>
holoClient.password=<AccessKey_Secret>
holoClient.readThreadSize=32
# Test configuration
get.threadSize=8
get.testTime=300000
get.tableName=kv_test
get.async=true
get.vacuumTableBeforeRun=true
get.keyRangeParams=L1-200000000
# Table initialization configuration (used only in PREPARE_GET_DATA mode)
prepareGetData.rowNumber=200000000
prepareGetData.orientation=row
put.columnCount=20
put.columnSize=20
Cet exemple configure des requêtes ponctuelles asynchrones sur une table orientée ligne. Pour tester des requêtes synchrones, définissezget.async=falseet ajustez les paramètresthreadSizeetreadThreadSizeen conséquence (consultez le tableau des paramètres ci-dessous).
Paramètres des requêtes ponctuelles
Module | Paramètre | Description | Notes |
Connexion |
| Nombre de connexions de requête | Mode asynchrone : définissez ce paramètre sur 2 à 4 fois la valeur de |
Test |
| Nombre de threads générant des requêtes | Mode asynchrone : 8 constitue une bonne valeur par défaut sur une instance à 64 vCPU. Mode synchrone : augmentez cette valeur à 500 pour un débit plus élevé. |
| Durée du test en millisecondes | ||
| Nom de la table cible | ||
| Indique si les requêtes ponctuelles doivent être asynchrones |
| |
| Indique si la commande | L'exécution de la commande | |
| Plage de clés primaires pour les requêtes. Format : |
| |
Init table (mode PREPARE_GET_DATA uniquement) |
| Nombre de lignes à générer | |
| Format de stockage |
| |
| Nombre de colonnes TEXT | ||
| Longueur en caractères par colonne |
Étape 2 : Exécuter le test
Si la table contient déjà des données issues des tests d'écriture ou de mise à jour, ignorez la préparation des données et exécutez directement la requête ponctuelle :
# (Optional) Prepare data -- only if the table has no data
java -jar holo-e2e-performance-tool-1.0.0.jar test_get.conf PREPARE_GET_DATA
# Run the point query test
java -jar holo-e2e-performance-tool-1.0.0.jar test_get.conf GET
Pour utiliser vos propres données métier au lieu des données générées, la table doit disposer d'une clé primaire à colonne unique de type INT ou BIGINT avec des valeurs consécutives.
Étape 3 : Consulter les résultats
cat result.csv
Champs de résultat
Tous les modes de test écrivent les résultats dans le fichier result.csv situé dans le répertoire courant. Le fichier contient les champs suivants :
|
Champ |
Description |
|
|
Heure de début du test |
|
|
Heure de fin du test |
|
|
Nombre total de lignes traitées |
|
|
QPS moyen sur la dernière minute |
|
|
QPS moyen sur les 5 dernières minutes |
|
|
QPS moyen sur les 15 dernières minutes |
|
|
Latence moyenne (ms). Collectée uniquement en modes Insert et GET. |
|
|
Latence P99 (ms). Collectée uniquement en modes Insert et GET. |
|
|
Latence P999 (ms). Collectée uniquement en modes Insert et GET. |
|
|
Version de l'instance Hologres |
Résultats de référence
Les résultats suivants ont été collectés sur une instance Hologres V3.0.22 dotée de 64 vCPU, en utilisant JDK 11 et le mode Fixed Copy. Chaque scénario a utilisé 200 millions de lignes avec une taille de colonne de 20 caractères. Le volume total de données recommandé pour une instance à 64 vCPU se situe entre 40 et 400 millions de lignes. Les nombres de colonnes testés sont 20, 50 et 100. Les valeurs QPS proviennent de la métrique qps1 et les valeurs de latence de latencyMean.
Le type d'instance, le schéma de table, le volume de données et la concurrence influencent considérablement les performances. Utilisez ces chiffres comme base de référence et ajustez la concurrence lors de plusieurs exécutions de test pour votre configuration spécifique. Si l'utilisation du processeur n'est pas totalement saturée après une exécution de test, augmentez la concurrence pour trouver le débit optimal.
Choisir un format de stockage
Avant d'examiner les chiffres, utilisez ce guide pour sélectionner le format de stockage adapté à votre charge de travail :
|
Charge de travail |
Format recommandé |
Raison |
|
Forte intensité d'écriture, sans requêtes ponctuelles |
Orienté ligne |
Débit d'écriture et de mise à jour le plus élevé (environ 3 fois plus rapide que l'orienté colonne) |
|
Écritures mixtes et requêtes ponctuelles |
Hybride (ligne-colonne) |
Prend en charge à la fois les écritures à haut débit et les requêtes ponctuelles à faible latence |
|
Requêtes analytiques sur des tables larges |
Orienté colonne |
Optimisé pour les analyses de colonnes, mais le débit d'écriture est plus faible |
|
Mises à jour de colonnes partielles |
Orienté ligne |
Les mises à jour partielles sur les tables orientées ligne atteignent le QPS le plus élevé |
20 colonnes
Format de stockage | Scénario | Concurrence | QPS (x 10 000) | Latence (ms) |
Orienté ligne | Écriture (Fixed Copy) | threadSize=8 | 88,3 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 91,1 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 136,7 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 43,6 | 8,60 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 26,1 | 7,88 | |
Orienté colonne | Écriture (Fixed Copy) | threadSize=8 | 29,9 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 18,5 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 12,8 | -- | |
Hybride (ligne-colonne) | Écriture (Fixed Copy) | threadSize=8 | 25,0 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 17,3 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 17,5 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 40,4 | 8,75 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 27,0 | 8,12 |
50 colonnes
Format de stockage | Scénario | Concurrence | QPS (x 10 000) | Latence (ms) |
Orienté ligne | Écriture (Fixed Copy) | threadSize=8 | 41,9 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 38,2 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 69,8 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 35,7 | 10,20 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 24,0 | 9,28 | |
Orienté colonne | Écriture (Fixed Copy) | threadSize=8 | 15,5 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 11,7 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 6,4 | -- | |
Hybride (ligne-colonne) | Écriture (Fixed Copy) | threadSize=8 | 13,7 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 10,5 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 11,6 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 31,5 | 12,29 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 24,2 | 10,00 |
100 colonnes
Format de stockage | Scénario | Concurrence | QPS (x 10 000) | Latence (ms) |
Orienté ligne | Écriture (Fixed Copy) | threadSize=8 | 24,4 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 22,5 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 38,1 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 26,6 | 14,34 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 21,4 | 12,12 | |
Orienté colonne | Écriture (Fixed Copy) | threadSize=8 | 8,4 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 6,9 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 3,1 | -- | |
Hybride (ligne-colonne) | Écriture (Fixed Copy) | threadSize=8 | 7,6 | -- |
Mise à jour globale (Fixed Copy) | threadSize=8 | 5,3 | -- | |
Mise à jour partielle (Fixed Copy) | threadSize=8 | 6,8 | -- | |
Requête ponctuelle (asynchrone) | threadSize=8, readThreadSize=32 | 25,0 | 15,66 | |
Requête ponctuelle (synchrone) | threadSize=100, readThreadSize=100 | 21,4 | 13,79 |
Points clés à retenir
Les tables orientées ligne offrent le débit d'écriture le plus élevé -- environ 3 fois plus rapide que les tables orientées colonne pour un même nombre de colonnes.
Les mises à jour partielles surpassent les mises à jour globales sur les tables orientées ligne, car moins de colonnes sont réécrites. Sur les tables orientées colonne et hybrides (ligne-colonne), les mises à jour globales peuvent égaler ou dépasser le débit des mises à jour partielles.
La latence des requêtes ponctuelles est similaire entre les tables orientées ligne et hybrides (ligne-colonne), généralement inférieure à 10 ms pour les tables comportant 20 colonnes.
Les requêtes ponctuelles asynchrones atteignent un QPS plus élevé que les requêtes synchrones, mais avec une latence légèrement supérieure.
Le débit d'écriture et de mise à jour diminue à mesure que le nombre de colonnes augmente -- une table orientée ligne comportant 100 colonnes atteint environ 28 % du QPS d'écriture d'une table à 20 colonnes. Le débit des requêtes ponctuelles est moins affecté, conservant 50 à 60 % du QPS à 100 colonnes par rapport à 20 colonnes.
Dépannage
Le client ECS devient un goulot d'étranglement
Symptôme : Le QPS plafonne malgré une faible utilisation du processeur sur l'instance Hologres.
Cause : L'instance ECS exécutant l'outil de test a atteint sa limite d'utilisation du processeur ou de bande passante réseau.
Solution : Surveillez les métriques de processeur et de réseau de l'instance ECS pendant le test. Si l'une des deux ressources est saturée, passez à un type d'instance ECS plus puissant ou réduisez la valeur de threadSize.
QPS inférieur aux attentes
Symptôme : Le QPS est nettement inférieur aux résultats de référence indiqués ci-dessus.
Causes possibles et solutions :
Concurrence insuffisante -- Si l'utilisation du processeur Hologres est faible, augmentez la valeur de
threadSize(pour les écritures et mises à jour) ou dereadThreadSize(pour les requêtes ponctuelles).L'instance a fait l'objet d'un upgrade ou d'un downgrade -- Les caractéristiques de performance diffèrent entre les instances nouvelles et celles redimensionnées. Créez une nouvelle instance pour les tests de référence.
Latence réseau -- Vérifiez que l'instance ECS et l'instance Hologres se trouvent dans le même VPC et la même zone.
Biais de données -- Si vous utilisez des données personnalisées, une distribution inégale des valeurs de clé de distribution peut concentrer la charge sur un sous-ensemble de shards.
Erreurs de connexion
Symptôme : L'outil de test échoue avec des exceptions liées à la connexion.
Solution : Vérifiez la chaîne de connexion JDBC, l'ID AccessKey et le secret AccessKey. Confirmez que l'instance Hologres autorise les connexions depuis le VPC de l'instance ECS.