Comparatif accès serveur base de données

© Christian PAULUS. Document créé le 16 décembre 2010 , mis à jour le 16 décembre 2010.

Un problème sans solution est un problème mal posé. Albert Einstein

Accueil du site > Astuces > Unix > Comparatif accès serveur base de données

Benchmark / PHP 5.3.3, MySQL 5.1

Résultat d’un test comparatif, un peu basique il est vrai :

  • temps d’accès à la base
  • temps passé sur une boucle SELECT

Pour deux Dedibox

  • V3 (fraîchement installée en FreeBSD 8. Pas encore en production)
  • XL (installée en 2009, FreeBSD 7, en production depuis le début).

A priori, globalement, en ce qui concerne les accès à la base MySQL via Apache/PHP, Dedibox XL est deux fois plus rapide que Dedibox V3.

La chose reste complexe à vérifier :

  • Efficacité de l’OS (testé rapidement sur Debian, le résultat n’est pas significatif) ;
  • temps d’accès du disque dur (le green consomme moins, mais le temps de re-démarrage est à prendre en compte. Il y a possibilité de forcer en mode non-green. N’a pas été testé ici) ;
  • Débit de la carte-mère, contrôleur disque (iozone permet peut-être de vérifier celà) ;
  • Débit mémoire (DDR ?)
  • Driver/pile/extensions MySQL. Les tests ont été réalisés via PHP 5.3.3 / APache 2.
  • etc.

Rappel : le bench tente ici de mesurer l’accès MySQL, uniquement.

Reste à voir peut-être l’optimisation des caches MySQL ? Une recherche avec Google sur les mots-clés tuning, mysql et autres donne des résultats intéressants. Notamment un script tuning-primer.sh, mais qu’il faut utiliser après un certain rodage du serveur.

Le résultat est donné ici à titre d’information. L’ensemble est probablement à refaire, vu le protocole de test mis en place quelque peu léger.

Script de test PHP/MySQL

Ce script de test ne fait qu’accéder en lecture à la base, et lit une table CHARACTER_SETS commune à toutes les installations, de taille identique. Il effectue ensuite un bench via la fonction MySQL benchmark() :

<?php

// b_sql.php
// petit bench sql
// - calcul via fonction benchmark mysql
// - lecture table

// http://www.quesaco.org


// login compte SQL
$login_db 'root';

// mot de passe du compte SQL
$passw_db 'METTRE_ICI_VOTRE_MOT_DE_PASSE';

$uname posix_uname();

define('_BR_''<br />');

$date_test date('r');

echo(
      
'<pre>' PHP_EOL
    
$uname['sysname'].' '
    
//. $uname['nodename'].' '.
    
$uname['release'].' '
    
//. $uname['version'].' '.
    
$uname['machine'] . '<br />' PHP_EOL
    
'Realisation date : '.$date_test._BR_
    
_BR_ PHP_EOL
    
'<table border="1">'
    
'<tr>'
    
'<th>nb. requests</th>'
    
'<th>sel. base</th>'
    
'<th>sel. data</th>'
    
'<th>total</th>'
    
'</tr>' PHP_EOL
);

// la 1' req est doublonnee pour reveiller les green 
foreach(array(1110100) as $nb_requests)
{
    
// connexion db
    
$time_start microtime(true);
    
$link_id mysql_connect('localhost'$login_db$passw_db);
    if(!
$link_id) {
           die(
'Connexion base : ' mysql_error());
    } 

    
// selection base
    
$time_sel_base microtime(true);
    if(!
mysql_select_db('information_schema'$link_id))
    {
        die(
' Selection base : ' mysql_error());
    }

    
// les req de lecture
    
for($done 0$done $nb_requests$done++)
    {
        
$sql_result mysql_query('select * from CHARACTER_SETS'$link_id);
        if(!
$sql_result){
            
$nb_requests--;
            break;
        }
        
mysql_free_result($sql_result);
    }

    
// fin du job
    
$time_end microtime(true);

    
$msg = ($done != $nb_requests) ? $done.'/'.$nb_requests $nb_requests;
    
$select_duration $time_sel_base $time_start;
    
$loops_duration $time_end $time_sel_base;
    
    
$total $select_duration $loops_duration;
    
    echo(
          
'<tr>'
        
'<td>'.$msg.'</td>'
        
'<td>'.$select_duration.'</td>'
        
'<td>'.$loops_duration.'</td>'
        
'<td>'.$total.'</td>'
        
'</tr>' PHP_EOL
    
);
    
    
mysql_close($link_id);
}

echo(
'</table>'.PHP_EOL);

// complète par la version mysql
$sql_result mysql_query('select version() as v');
$sql_result mysql_fetch_object($sql_result);
$mysql_version $sql_result->v;
echo(
'mysql version  : '.$mysql_version._BR_._BR_);

// et la fonction benchmark
// (via PHP + réseau ....)
$link_id mysql_connect('localhost'$login_db$passw_db);
$time_start microtime(true);
$sql_result mysql_query('SELECT benchmark(100000000,1+2)');
$time_end microtime(true);
mysql_close($link_id);
echo(
'mysql benchmark: '.($time_end $time_start)._BR_._BR_);


echo(
      
'</pre>' PHP_EOL
);

?>

Résultat sur Dedibox V3

FreeBSD 8.1-RELEASE amd64Realisation date : Thu, 16 Dec 2010 14:23:11 +0100
nb. requestssel. basesel. datatotal
10.00925707817077640.00168490409851070.010941982269287
10.000524997711181640.000480175018310550.0010051727294922
100.00042700767517090.00302505493164060.0034520626068115
1000.000365018844604490.0288989543914790.029263973236084
mysql version : 5.1.53

mysql benchmark : 4.4449481964111

Résultat sur Dedibox XL

 
FreeBSD 7.0-RELEASE-p11 i386
Realisation date : Thu, 16 Dec 2010 14:22:48 +0100
nb. requestssel. basesel. datatotal
10.000236988067626950.000330924987792970.00056791305541992
10.000179052352905270.000241994857788090.00042104721069336
100.000140190124511720.00176787376403810.0019080638885498
1000.000127077102661130.0168118476867680.016938924789429
mysql version :

mysql benchmark : 3.6542708873749

Plussoyez !

Les forums sont fermés.