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)

Résultats test 1

Graph test 1

- Test 2 & 3 (SELECT * 2000)

Résultats test 2

Résultats test 3

Graph tests 2 & 3

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.

One Response to “Benchmarks : Connexions MySQL en PHP (mysql, mysqli, ssl)”

  1. Damien Says:

    TrÚs intéressant comme benchmark, bien joué ! Merci pour la lecture :)

Leave a Reply