Aller au contenu
tests-performanceRechercherCtrl K
VuGen4 min de lecture

Scripting Vugen 12.57 – Datapool MySQL pour Vugen

Utiliser une base MySQL comme jeu de données VuGen quand le volume dépasse 500 000 informations : procédure complète, de l'installation de MySQL au script et au résultat dans le log.

L’essentiel

  • Au-delà de 500 000 informations, VuGen pose des problèmes pendant un tir avec un jeu de données classique.
  • La procédure couvre téléchargement, installation, configuration, création de la base et ajout d'enregistrements.
  • La procédure termine par la préparation des fichiers, le script MySQL et le résultat dans le log VuGen.
Sommaire
  1. 1 – Téléchargement
  2. 2 – Installer MySQL
  3. 3 – Configuration Mysql
  4. 4 – Exécuter les commandes de création de la base
  5. 5 – Ajouter des enregistrements
  6. 6 – Préparation des fichiers pour scripting Vugen
  7. 7 – Script Mysql
  8. 8 – Résultat Log Vugen
  9. 9 – Résultat Tir

L’utilisation d’un moteur de base de données comme Mysql pour gérer le jeu de données Vugen n’est pas qu’un exercice de style. En effet, dans des cas où le nombre d’informations à utiliser est très important (supérieur à 500 000), Vugen présente quelques problèmes lors de l’exécution d’un Tir de performance. La procédure décrite ci-dessous détaille un exemple opérationnel complet tout à fait adaptable et réalisé dans un environnement réel.

Concernant la version de la bibliothèque de lien dynamique utilisée du Connecteur C (libmysql.dll v6.1.9.0 et non la dernière version disponible), il faut savoir que les développeurs y ont implémenté depuis la version 6.1.10 le package Microsoft Visual C++. Conséquence, les dépendances de bibliothèques sont plus importantes alors que ces mêmes bibliothèques n’ont aucune utilité dans le cas présent.

La méthode employée ici consiste à adapter les librairies .h de la version Mysql 8.0 pour être utilisable avec le langage C et avec Vugen.

L’API complète des fonctions de Mysql 8.0 est disponible à :

1 – Téléchargement

mysql-installer-community-8.0.12.0.msi :

https://dev.mysql.com/downloads/installer/

Page de téléchargement de MySQL Installer 8.0.12 pour Windows : bouton Download du paquet complet de 273,4 Mo encadré

MySQL Connector/C (mysql-connector-c-6.1.11-winx64.zip) :

https://downloads.mysql.com/archives/c-c/

Archives de MySQL Connector/C, version 6.1.9 pour Windows : installeurs MSI 32 et 64 bits et archive ZIP 32 bits

2 – Installer MySQL

N’Installer que Mysql server 8.0

MySQL Installer, Choosing a Setup Type : option Server only cochée
MySQL Installer, étape Installation : MySQL Server 8.0.12 prêt à installer, bouton Execute
MySQL Installer, Group Replication : option Standalone MySQL Server / Classic MySQL Replication retenue
MySQL Installer, Type and Networking : Server Computer, TCP/IP sur le port 3306, X Protocol sur 33060, ports ouverts dans le pare-feu Windows
MySQL Installer, Authentication Method : chiffrement fort des mots de passe (SHA256, recommandé) retenu plutôt que la méthode compatible MySQL 5.x
MySQL Installer, Accounts and Roles : mot de passe du compte root saisi deux fois (masqué), aucun autre compte créé
MySQL Installer, Windows Service : service MySQL80 lancé au démarrage, sous le compte système standard

3 – Configuration Mysql

Texte
Connexion à Mysql :

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -p

Enter password: *********

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 30

Server version: 8.0.12 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

Afin d’autoriser l’insertion des données en base par un fichier externe (Authentication plugin ‘caching_sha2_password’) :

Texte
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '********';

Query OK, 0 rows affected (0.02 sec)

 mysql> SET GLOBAL local_infile=1;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'local_infile';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| local_infile  | ON    |

+---------------+-------+

1 row in set, 1 warning (0.00 sec)

4 – Exécuter les commandes de création de la base

Texte
mysql> create database loadrunner;

Query OK, 1 row affected (0.11 sec)

mysql> use loadrunner;

Database changed

mysql>

mysql> CREATE TABLE LRdata (

ID_valeur MEDIUMINT NOT NULL AUTO_INCREMENT,

valeur varchar(255) NOT NULL,

CREATION_TIMESTAMP varchar(29) NOT NULL,

PRIMARY KEY (ID_valeur)

) ENGINE=InnoDB;

Query OK, 0 rows affected (0.13 sec)

Visualiser la base :

Texte
mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| loadrunner         |

| mysql              |

| performance_schema |

| sys                |

+--------------------+

5 rows in set (0.01 sec)

Si besoin : Supprimer la table:

Texte
Mysql>drop table LRdata;

5 – Ajouter des enregistrements

Pour créer des enregistrements dans un fichier csv, utiliser le script vugen ci-dessous :

GenDatas.zip

Texte
Sortir de Mysql et se reconnecter :

C:\Program Files\MySQL\MySQL Server 8.0\bin>mysql -u root -p --local-infile loadrunner

mysql> LOAD DATA LOCAL INFILE 'C:\\JDD\\import1.csv' INTO TABLE LRdata FIELDS terminated by ';' LINES TERMINATED BY '\n' (valeur,CREATION_TIMESTAMP);

Query OK, 1000000 rows affected, 65535 warnings (25.35 sec)

Records: 1000000  Deleted: 0  Skipped: 0  Warnings: 899531

6 – Préparation des fichiers pour scripting Vugen

Copier les fichiers de Mysql dans un nouveau répertoire C:\Mysql8Lib

C:\Program Files\MySQL\MySQL Server 8.0\include :

Contenu du dossier include de MySQL Server 8.0 : sous-dossiers mysql et openssl, en-têtes mysql.h, mysql_com.h, mysql_time.h, errmsg.h et autres

C:\Mysql8Lib :

Contenu du dossier C:\Mysql8Lib : les en-têtes copiés, dont mysql.h, mysql_com.h, client_plugin.h et plugin_auth_common.h adaptés le 28/08/2018

Comme le type booléen n’existe pas en C, il faut changer toutes les déclarations de variables bool en un nouveau type entier « my_bool » (déclaration dans global.h du script Vugen, ci-dessous).

Exemple :

typedef struct UDF_INIT {

my_bool maybe_null ; /** 1 if function can return NULL */

Ce changement est à faire pour les fichiers

udf_registration_types.h

mysql.h

mysql_com.h

mysql_time.h

Remplacer dans les fichiers :

mysql.h

mysql_com.h

udf_registration_types.h

#include <stdbool.h>

Par

//#include <stdbool.h>

Remplacer dans le fichier mysql.h

#include <sys/types.h>

#include « mysql/client_plugin.h »

#include « errmsg.h »

Par

//#include <sys/types.h>

#include « client_plugin.h »

//#include « errmsg.h »

Remplacer dans le fichier mysql_com.h

#include <mysql/udf_registration_types.h>

Par

#include <udf_registration_types.h>

Remplacer toutes les références aux autres fichiers .h en suffixant par le repertoire C:\\Mysql8Lib\\ dans les fichiers :

client_plugin.h

mysqlx_ername.h

plugin_auth_common.h

udf_registration_types.h

mysql.h

Exemple :

#include « plugin_auth_common.h »

Par

#include ” C:\\Mysql8Lib\\plugin_auth_common.h”

Librairies modifiées comme expliqué ci-dessus:

Mysql8Lib.zip

7 – Script Mysql

Récupérer libmysql.dll de mysql-connector-c-6.1.9-win32\lib

Renommer libmysql.dll en libmysql-6.1.9.0.dll et l’inclure dans les extra files d’un nouveau script vugen Web http/html

C
Script MysqlV3:

vuser_init()
{

// La documentation MySQL 8.0 C API est disponible à:
// http://dev.mysql.com/doc/refman/8.0/en/c-api-functions.html

lr_load_dll("libmysql-6.1.9.0.dll");

lr_start_transaction("001_Init_Cnx");

//initialise la connexion mySQL
mySQL = mysql_init(NULL);
if (mySQL == NULL) {
lr_error_message("Mémoire Insuffisante");
lr_abort();
}

// Connect to the database
if (!mysql_real_connect(mySQL,MySQLServer, MySQLuser, MySQLpassword, MySQLdatabase, MySQLport,NULL,0)) {
lr_error_message("%s", mysql_error(mySQL));
mysql_close(mySQL);
lr_abort();
}

//save SQL statement into variable into sqlQuery
//This stamentement returns result that matches UserName = {Vuser} parameter
lr_param_sprintf("sqlQuery", "SELECT %s FROM LRData", MySQLChamps);

//Execute SQL statement
MyRC = mysql_query(mySQL, lr_eval_string ("{sqlQuery}"));
if (MyRC != 0) {
lr_error_message("%s", mysql_error(mySQL));
mysql_close(mySQL);
lr_abort();
}

//result of the sql statement is placed into MYSQL_RES result structure
result = mysql_use_result(mySQL);
if (result == NULL) {
lr_error_message("%s", mysql_error(mySQL));
mysql_free_result(result);
mysql_close(mySQL);
lr_abort();
}

lr_end_transaction("001_Init_Cnx", LR_AUTO);
return 0;
}

 

Action()
{

double dRes;
lr_start_transaction("002_make_Data");

row=mysql_fetch_row(result);

// Si plus de données, on reviens au 1er enregistrement
if(row==NULL)
{
mysql_data_seek(result,0);
row=mysql_fetch_row(result);
}

lr_output_message("res = %.3f", atof(row[0]));
dRes=atof(row[0]);
lr_user_data_point("valeur", dRes);

lr_end_transaction("002_make_Data", LR_AUTO);
lr_think_time(1);

return 0;
}

 

vuser_end()
{
lr_start_transaction("003_decnx");

mysql_free_result(result);
mysql_close(mySQL);

lr_end_transaction("003_decnx", LR_AUTO);
return 0;
}

 

Global.h :

#ifndef _GLOBALS_H
#define _GLOBALS_H

typedef int my_bool;

//--------------------------------------------------------------------
// Include Files
#include "lrun.h"
#include "web_api.h"
#include "lrw_custom_body.h"

#include "C:\\Mysql8Lib\\binary_log_types.h"
#include "C:\\Mysql8Lib\\client_plugin.h"
#include "C:\\Mysql8Lib\\my_command.h"
#include "C:\\Mysql8Lib\\my_list.h"
#include "C:\\Mysql8Lib\\mysql.h"
#include "C:\\Mysql8Lib\\mysql_com.h"
#include "C:\\Mysql8Lib\\mysql_time.h"
#include "C:\\Mysql8Lib\\mysql_version.h"
#include "C:\\Mysql8Lib\\mysqld_error.h"
#include "C:\\Mysql8Lib\\mysqlx_error.h"
#include "C:\\Mysql8Lib\\mysqlx_version.h"
#include "C:\\Mysql8Lib\\plugin_auth_common.h"
#include "C:\\Mysql8Lib\\udf_registration_types.h"

//--------------------------------------------------------------------
// Global Variables

MYSQL *mySQL;
MYSQL_ROW row;
MYSQL_RES *result;
int i=0, MyRC, num_fields;

char *MySQLServer = "localhost";
char *MySQLuser = "root";
char *MySQLpassword = "********";
char *MySQLdatabase = "loadrunner";
char *MySQLChamps = "valeur";
int MySQLport = 3306;

#endif // _GLOBALS_H

Script complet :

MysqlV3.zip

8 – Résultat Log Vugen

Première exécution du script:

Si erreur suivante (car serveur Mysql distant):

vuser_init.c(20): Error: Host ‘150.62.9.226’ is not allowed to connect to this MySQL server

Dans ce cas, lancer les 4 commandes ci-dessous :

Texte
mysql> use Loadrunner;

Database changed

mysql> CREATE USER 'root'@'150.62.9.226' IDENTIFIED BY 'root';

Query OK, 0 rows affected (0.12 sec)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'150.62.9.226' WITH GRANT OPTION;

Query OK, 0 rows affected (0.07 sec)

mysql> ALTER USER 'root'@'150.62.9.226' IDENTIFIED WITH mysql_native_password BY '********';

Query OK, 0 rows affected (0.02 sec)

Log Vugen:

Texte
Virtual User Script started at: 31/08/2018 15:29:06

Starting action vuser_init.

Web Turbo Replay of LoadRunner 12.57.0 for Windows 7; build 281 (mai 06 2018 20:03:54)        [MsgId: MMSG-26983]

Run mode: HTML  [MsgId: MMSG-26993]

Replay user agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)              [MsgId: MMSG-26988]

Runtime Settings file: "D:\DATA\ESPDEV\ScriptsVugen\Datapool Mysql\MysqlV3\\default.cfg"                 [MsgId: MMSG-27141]

vuser_init.c(9): Notify: Transaction "001_Init_Cnx" started.

vuser_init.c(46): Notify: Transaction "001_Init_Cnx" ended with a "Pass" status (Duration: 4,1010).

Ending action vuser_init.

Running Vuser...

Starting iteration 1.

Starting action Action.

Action.c(5): Notify: Transaction "002_make_Data" started.

Action.c(16): res = 0,700

Action.c(18): Notify: Data Point "valeur" value = 0,7000.

Action.c(20): Notify: Transaction "002_make_Data" ended with a "Pass" status (Duration: 0,1318).

Ending action Action.

Ending iteration 1.

Ending Vuser...

Starting action vuser_end.

vuser_end.c(3): Notify: Transaction "003_decnx" started.

vuser_end.c(8): Notify: Transaction "003_decnx" ended with a "Pass" status (Duration: 0,1171).

Ending action vuser_end.

Vuser Terminated.

9 – Résultat Tir

Le million de lignes de la table LRdata a été lu lors de ce tir.

Analysis Summary du tir Mysql8 : 58 min 43 s, 200 Vusers au plus, 1 176 119 transactions réussies, 0 en échec ; 002_make_Data passée 1 175 719 fois
Graphe Running Vusers : montée linéaire de 0 à 200 utilisateurs virtuels en 17 minutes environ, puis palier jusqu’à la fin du tir

200 Vu en charge

Graphe Data Points (Average) de la mesure valeur : données lues dans MySQL, stables autour de 0,55 (de 0,49 à 0,69)

Valeurs des données issues de Mysql

Graphe Windows Resources du serveur MySQL : mémoire engagée vers 18 à 23 %, processeur et disque proches de 0 hormis deux pointes brèves

Consommation système du serveur Mysql

Graphe Average Transaction Response Time : connexion 001_Init_Cnx vers 0,06 s, lecture 002_make_Data proche de 0 s

Temps de lecture très faible via Mysql

Graphe Transactions per Second : 002_make_Data monte jusqu’à 400 par seconde vers 17 minutes et s’y maintient jusqu’à la fin du tir

400 lectures/s sans erreur

Dans la même catégorie.

↑ ↓ choisirEntrée ouvrirÉchap fermer