Benchmarks : Connexions MySQL en PHP (mysql, mysqli, ssl)
Alors voila, il était question de sécuriser les connexions MySQL via SSL afin d’augmenter la sécurité.
Cela est possible aussi bien via la librairie mysql classique de PHP que via mysqli.
Est-ce qu’une librairie est plus rapide que l’autre ? A quel genre de pertes de performance faut-il s’attendre en utilisant le SSL ? C’est à ces questions que ce test comparatif va tenter de répondre.
Pourquoi sécuriser ?
La question de la sécurisation se pose lorsque le serveur exécutant PHP est physiquement séparé du serveur exécutant MySQL, dans ce cas, toutes les questions se font en clair entre les deux serveurs.
Comment activer le support SSL ?
Afin d’activer SSL, vous devez recompiler MySQL avec le support de openssl aussi bien sur le serveur MySQL même que sur le serveur PHP.
Pour ouvrir une connexion SSL en PHP il faut utiliser le code suivant avec la librairie classique :
$con = mysql_connect($this->db_host, $this->db_ssluser, $this->db_pass, null, MYSQL_CLIENT_SSL);
Ou le code ci-dessous via mysqli où $ssl_key représente le chemin vers le fichier pem contenant la clé du client, $ssl_cert le fichier pem contenant le certificat du client et $ssl_ca le fichier pem contenant le certificat de l’autorité de certification:
$con = mysqli_init();
$con->ssl_set($ssl_key, $ssl_cert, $ssl_ca, null, null);
$con->real_connect($this->db_host, $this->db_ssluser, $this->db_pass, $this->db_base);
Environnement
- Serveur MySQL
Processeur : Intel(R) Core(TM)2 Quad CPU Q6600 @ 2.40GHz
Mémoire : 2048Mo DDR2
Disque dur : 2x 250 Go SATA2 RAID HARD 1
Système : Debian 4.0 Etch 64bit
MySQL 5.0.51
- Serveur client
Processeur : Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz
Mémoire : 2048Mo DDR2
Disque dur : 2x 250 Go SATA2 RAID HARD 1
Système : Debian 4.0 Etch 64bit
MySQL 5.0.51 / PHP 5.2.6 (cli)
Lien 100Mbps entre les deux serveurs.
Base de test
mysql> DESCRIBE benchmark; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | val1 | int(11) | NO | | NULL | | | val2 | double | NO | | NULL | | | val3 | varchar(10) | NO | | NULL | | | val4 | datetime | NO | | NULL | | +-------+-------------+------+-----+---------+-------+
Requêtes de test
Nous allons effectuer trois requêtes de test que nous allons répéter 10 fois pour chaque configuration.
Config 1 : librairie mysql sans SSL
Config 2 : librairie mysqli sans SSL
Config 3 : librairie mysql avec SSL
Config 4 : librairie mysqli avec SSL
- Test 1
Requête du test : INSERT INTO benchmark VALUES ( 374943, 394.034, ‘dummydummy’, NOW( ) )
Nb de connexion par test : 1
Nb d’exécution de la requête par test : 20000
- Test 2
Requête du test : SELECT *, NOW() FROM benchmark LIMIT 0, 100
Nb de connexion par test : 1
Nb d’exécution de la requête par test : 2000
- Test 3
Requête du test : SELECT *, NOW() FROM benchmark LIMIT 0, 10
Nb de connexion par test : 1
Nb d’exécution de la requête par test : 2000
Note : Toutes les requête contiennent la fonction NOW() afin que MySQL ne puisse pas les mettre en cache.
Code du test
Voici les fichiers utilisés pour les tests.
mysql_test.php
Test.php
Benchmark.php
Résultats des tests
- Test 1 (INSERT * 20000)


- Test 2 & 3 (SELECT * 2000)



Résultats comparatifs
> Test 1
Perte mysqli (std) 0,227%
Perte mysqli (ssl) 0,619%
Perte ssl (mysql) 20,949%
Perte ssl (mysqli) 21,259%
> Test 2
Perte mysqli (std) -0,132%
Perte mysqli (ssl) 0,386%
Perte ssl (mysql) -8,913%
Perte ssl (mysqli) -8,439%
> Test 3
Perte mysqli (std) -0,062%
Perte mysqli (ssl) -0,222%
Perte ssl (mysql) -0,965%
Perte ssl (mysqli) -1,123%
Conclusions
L’écart de performances entre la librairie mysql classique et la librairie mysqli est très faible, cependant, mysqli semble plus lente que mysql pour les INSERT alors qu’elle apporte un léger gain de performances pour les sélections.
Sans surprise, l’ajout du spport SSL entraîne une perte de performances de l’ordre de 20% sur les requêtes INSERT.
Par contre, SSL peut apporter un gain de performances sur les requêtes SELECT de l’ordre de 1 à 8% selon la quantité de données renvoyées. Cette amélioration est due au fait que libssl est compilée avec le support de la librairie zlib, et que de ce fait, tous les échanges sont compressés et donc transmis plus rapidement sur le réseau. Toutefois cela à un prix, car le CPU des deux serveurs sera beaucoup plus sollicité que dans le cas de transactions en claires, d’abord par le cryptage symétrique du SSL puis par la compression des données.



May 13th, 2008 at 18:57
Très intéressant comme benchmark, bien joué ! Merci pour la lecture