Voir un article

PHP : vérifiez la charge de votre serveur et adaptez vos scripts php

Pour éviter les surcharges de votre serveur web, il convient de surveiller sa charge cpu et de s'y adapter

Si la charge CPU est trop importante, vous pouvez par exemple forcer l'utilisation de vos fichiers de cache (si vous utilisez un CMS), vous pouvez retarder les scripts pour les délayer (usleep), vous pouvez court circuiter certains traitement facultatifs (comptabilisation de visite pour les stats) etc etc

Pour obtenir la charge CPU de votre serveur il suffit de lire le 1er chiffre dans /proc/loadavg
Ce chiffre est un radio / 100 pour 1 CPU : 1 vaut 100%, 2 vaut 200% (cf man pages). 
Mais il convient de diviser cette charge CPU par le nombre de CPU (de coeurs) du serveur, car une charge de processus de 200% équivaut à une charge de 100 sur un processeur bi core.

Voici le script PHP qui va bien : 

// --- by tito of Amigang
// -------------------------------------

session_start();

// ---  1/ récupérer le nombre de coeurs du serveur qui vous héberge :
if ( $_SESSION["cores"] == '') {
    exec("grep cores /proc/cpuinfo |head -n 1 |sed 's/.* //'", $out,$rc );
    if ( ereg('^[0-9]+$',$out[0])) $_SESSION["cores"] = $out[0];
}

// --- 2/ verifie la charge CPU
$loadavg =0 ;
$fd=@fopen('/proc/loadavg','r');
if ( $fd ) {
    if ( $loadavg =  fscanf($fd, "%f")) {  // --- lit la charge systeme
        fclose ($fd);

        // ramene en % et divise par le nb de coeurs :
        $loadavg = ceil( $loadavg[0] *100 /$_SESSION["cores"]  ) ; 

        // si besoin :
        if ( $loadavg > 200 ) { echo "Je sature à 200%. A+.";  exit();  }
        if ( $loadavg >= 100 ) {
            sleep( ceil($loadavg/20) ) ;
        }
    }
}



Voila, après avoir éxecuter ce bout de code, la variable $loadavg vous donne à peu pres la charge CPU en % de votre machine (à peu pres car il ne tient pas compte des iostats et autres variables d'ajustement)

A vous de mettre ensuite les if qui vont bien pour faire des usleep et autre court circuits ...


Je vous invite à combiner ceci avec une détection des crawlers PHP : comment détecter les robots (php crawler detect), pour ralentir les crawler proportionellement à la charge cpu de votre machine , ce qui pourrait vous donner aprs avoir compiler ces 2 scripts :

// si crawler et charge > 100 % : bye bye
if ( $crawler && $loadavg >=100 ) {
  echo "g bo etre matinal g mal (cpu  à $loadavg%), reviens plus tard...";
  exit();
}

// si crawler : temporize d'autant que la charge cpu est grande
if ( $crawler ) usleep( 500000 + $loadavg * 10000 );

// pour les autres : temporize aussi mais un peu moins : 
else usleep( $loadavg * 10000 );


7 115 clics - Créé le 05/05/2010 par Tito - Modifié le 05/05/2010



Réagissez, commentez, discutez ...

7 réactions.

  • par nike pas cher (non connecté) - 15/08/2013 13:41

    Très bon pints, learn 2013 vue de la plus vache x, impatients de plusieurs de vos idées merveilleuses, merci, que Dieu vous bénisse!

  • par ugg pas cher (non connecté) - 15/08/2013 13:37

    Très bon screw, learn 2008 vue de la plus vache B, impatients de plusieurs de vos idées merveilleuses, merci, que Dieu vous bénisse!

  • par louis vuitton pas cher (non connecté) - 15/08/2013 13:37

    Très bon voins, learn 2005 vue de la plus vache d, impatients de plusieurs de vos idées merveilleuses, merci, que Dieu vous bénisse!

   [...] pour voir les réactions précédentes cliquer ici »




Partager ?

diaspora  G+  facebook  twitter  Digg  Yahoo  Delicious  Technorati  myspace


Voir d'autres articles en rapport avec celui-ci ?



Stats des clics sur cet article : cliquez ici »



Vous voulez contribuer et publier un article dans cette rubrique ?

Merci de vous identifier ou de vous créer un compte si ce n'est pas déjà fait.