Aller au contenu

Greywolf

Membres
  • Compteur de contenus

    9 320
  • Inscription

  • Dernière visite

  • Jours gagnés

    1

Messages posté(e)s par Greywolf

  1. Les PC reliés au switch accède à 192.168.1.0/24 puisque c'est par là qu'ils ont accès à internet (DNS 192.168.1.1 route par défaut 192.168.0.1 qui possède une route par défaut via 192.168.1.1).

     

    Le pont réseau peut peut-être fonctionner (bien que les tentatives sous windows soient souvent infructueuses).

     

    Le réseau 192.168.1.0/24 ne sait pas comment accéder au réseau 192.168.0.0/24

     

    On peut conserver cet adressage et créer une route sur 192.168.1.1 qui redirige les requêtes vers 192.168.0.0/24 via 192.168.1.4 (ou créer cette route sur chaque PC du réseau 192.168.1.0)

    (+ activer le routage IP sur 192.168.1.4)

     

    netbios fonctionnant par diffusion (et étant donc limité à son sous-réseau), un serveur WINS serait le bienvenu ou 192.168.1.4 fait maître explorateur sur les 2 réseaux.

  2. euh dites.... windows ne démarre pas, comment faire "Démarrer => Exécuter" :P

     

    -solution 1: trouver un CD de XP Home et tenter une copie de la dll via la console de récupération

    -solution 2: démarrer sur un LiveCD linux proposant l'écriture sur ntfs (la dernière Knoppix par exemple) et copier la dll

  3. Salut,

     

    le pont réseau ne semble pas fonctionnel.

     

    La connexion à la livebox se fait-elle en DHCP ou non?

     

    Y-a-t-il un filtrage sur les adresses MAC sur la livebox (probablement si tu es en wifi)?

    quelle est l'adresse MAC de ton bridge?

    si tu sniffes les paquets émis par ton PC ou ta machine virtuelle, quelle est l'adresse MAC associée aux paquets?

     

    as tu moyen d'essayer ce type de connexion de ta machine virtuelle à ton réseau par une interface filaire?

  4. bingo!

     

    en effet, beaucoup de données étaient envoyées au navigateur. En les regardant, il s'avérait qu'ils contenaient des messages d'erreurs en rapport avec la fonction fprintf...

     

    En re-regardant le code ci-dessus, l'erreur saute maintenant aux yeux:

    fprintf attendait 9 arguments séparés par des tabulations et je ne lui en fournissait que 7 :P

     

    Comme quoi sniffer les paquets, ça a du bon.

    Merci beaucoup.

     

    J'ai fait une refonte entière du code source selon tes conseils et j'obtiens ces performances

    Avant, avec 1 seul analyseur sélectionné (~100000 entrées / analyseur), la requête mettait entre 15 et 20 minutes à apparaitre

    Maintenant, avec 8 analyseurs sélectionnées, la requête met :

    Temps d'exécution du script : 19.618790149689 secondes

     

    :P

     

    c'était donc bien le développeur qui codait avec ses pieds (gauche de surcroît :P)

  5. bon, j'améliore doucement les choses.

    Je stocke la requête construite pour chaque analyseur dans une variable de session dont je récupère la partie WHERE .... dans le script jpgraph et en fonction des choix de l'utilisateur, je fais les SELECT qui vont bien.

     

    Du coup, j'ai mis de côté la fonction FetchAllData() pour réaliser un

    while ($row = mysql_fetch_array($mysql_result, MYSQL_ASSOC)) {
     fprintf($fp,"%s\t%s\t%s\t%s\t%s\t%.3f\t%.3f\t%.3f\t%s\n", \
      $row["travel_date"],$row["travel_month"],$row["travel_type"],$row["section_type"],\
      $row["my_hour"],$row["count"],$row["period"]);
     array_push($data,$row["count"]);
    }

     

    $mysql_result est issue de mysql_query($query); qui est exécutée si il existe des enregistrements correspondant aux critères (SELECT COUNT)

    Donc cette boucle while est censée m'écrire dans un fichier txt en local sur le serveur les différentes valeurs retournées par la requête et remplir un tableau de data pour une colonne en particulier.

     

    Si je ne commente pas la fonction fprintf, je fais planter mon navigateur :P La charge en mémoire virtuelle ne cesse d'augmenter jusqu'à faire planter le navigateur.

    Le php étant exécuté côté serveur pourquoi la charge du client augmente-t-elle?

  6. Quel est l'ordre de grandeur ?

     

    pour la même requête, je suis passé de + de 15 minutes à 30 secondes :P

     

    je vais regarder du côté du resultset (?).

     

    Pour jpgraph, l'étape 4 décrite dans mon premier post est la création du formulaire pour l'utilisateur:

    - choix du type de graphique

    - choix des abscisses à représenter

    - choix des analyseurs et, in extenso, choix du ou des polluants associés à tracer

    - validation et envoi au script jpgraph par POST

     

    Au tout début, j'ai un peu honte de le dire, j'avais explosé mon tableau de résultats en une chaîne de caractère avec implode pour les coller dans le champ value du formulaire.... j'ai rapidement abandonné au vu des performances réseau nécessaires: balancer 150M de data au client pour qu'il les renvoie au serveur par la méthode POST ce n'était pas génial. :P

     

    Selon la doc de jpgraph, soit les data sont statiques (on oublie), soit elles sont extraites d'une BDD par le script de création jpgraph soit elles sont envoyées par POST.

     

    Comme je n'avais pas envie de refaire une requête mysql pour récupérer les data précédemment extraites, j'ai pensé aux variables de session...

    Sinon comme alternative, je peux peut-être stocker les requêtes mysql créées par les choix de l'utilisateur dans une variable de session et refaire un mysql_query dans le script jpgraph afin de récupérer les data à tracer. L'avantage c'est que la requête mysql sera dans le cache et sera censément traitée rapidement.

    Je vais tenter les deux approches.

  7. <?php
    session_start();
    
    ini_set('error_reporting', E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('max_execution_time',0);
    
    require_once 'Math/Stats.php';
    include 'scr/fetchdata.php';
    $temps_debut = microtime_float();
    
    //Rappel des choix postés par l'utilisateur
    ...
    //connexion à la BDD
      $hote="localhost";
      $utilisateur=$_SESSION['login'];
      $password=$_SESSION['password'];
      $connexion = mysql_connect($hote,$utilisateur,$password);
    
    //si la connexion est active et si au moins un analyseur a été choisi
    if ($connexion>0 && isset($_POST['analyseur'])) {
    mysql_select_db("mabase") or die("Could not select database");
    //écriture d'une div contenant un tableau
    
    //Construction d'une requete par analyseur  
     foreach ($analyseur as &$value) {
       //Sélection des champs a extraire en fonction de l'analyseur
       switch ($value) {
           case a:
                $champs="......";
           case b:
          ...
       }
       //requete commune
       $query = "SELECT $champs FROM `$value` 
                 INNER JOIN `urban_section` ON `$value`.`urban_section_idurban_section` = urban_section.idurban_section
                 INNER JOIN `travel_date` ON `$value`.`travel_date_idtravel_date` = travel_date.idtravel_date
                 INNER JOIN `travel` ON `$value`.`travel_idtravel` = travel.idtravel
                 WHERE `valid` = '1'";
    
     //Construction de la requ?te en fonction des choix de l'utilisateur
     //rajout de clauses WHERE
    
     //nom de fichier
       $filename ="requete_".$value.".txt";
    
    //Récupération des résultats
     $mysql_result = mysql_query($query);
    
    //création d'un tableau associatif $assoc_result qui comporte $nrows lignes
     $assoc_result=array();
     $nrows=fetchAllData($mysql_result,$assoc_result);
    
     mysql_free_result($mysql_result);
    

     

    jusqe là ça va à peu près, la fonction fetchAllData est gourmande en mémoire mais ça passe plutôt pas trop mal

    //Création d'un fichier de résultat
     $repertoire = "uploadtemp/";
     if (!($fp = fopen("$repertoire$filename", 'w'))) {
       return;
       }
    
    //Si la requete retourne des résultats, on extrait des arrays du tableau associatif pour chaque analyseur
     if (isset($nrows) && $nrows != 0) {
     switch($value) {
           case a:
               $res_a_date = $assoc_result['TRAVEl_DATE'];
             ....
    
             fprintf($fp,"date\tMois\tType trajet\ttron?on\theure\tNOx\tNO\tNO2\tperiodes\n");
             for ($i = 0; $i < $nrows; $i++) {                                      fprintf($fp,"%s\t%s\t%s\t%s\t%s\t%.3f\t%.3f\t%.3f\t%s\n",$res_a_date[$i],$res_a_month[$i],$res_a_type[$i],$res_a_section[$i],$res_a_hour[$i],$res_a_NOx[$i],$res_a_NO[$i],$res_a_NO2[$i],$res_a_period[$i]);
              }
    
             fclose($fp);        
             $s = new Math_Stats();
             $s->setData($res_a_NOx);
             $mean = $s->mean();
             $median = $s->median();
             $quartiles = $s->quartiles();
             $min = $s->min();
             $max = $s->max();
            unset($s);
           printf ('<tr><td>%s</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td>%.3f</td><td><a href="uploadtemp/%s">%s</a></td></tr>', $value, $mean, $median, $quartiles[25], $quartiles[75], $min, $max, $quartiles[10], $quartiles[90],$filename,$value);
            break;
          case b:
             ....
     }
    unset($assoc_result);
    }
     else {
       echo '<tr><td>'. $value .'</td><td>Aucune valeur pour l\'analyseur ' . $value . '</td></tr>';
       unset ($assoc_result);
       }
    
    //fin de la boucle foreach($analyseur as &$value)
    }
    
    //fermeture de la div
    echo '</table></div>';
    
    //fin de la condition if ($connexion >0)
    }
    else {
       echo "Impossible de se connecter à la base de données !";
       }

     

    Si je laisse la partie dans laquelle j'explose $assoc_result en plusieurs arrays $res_[nom_de_l'analyseur]_[nom_du_champ] le temps de traitement explose

     

    Peut-être y-a-t-il des grosses erreurs dans ce code? l'utilisation de boucle foreach et de switch n'arrange probablement pas le système.

    Y-a-t-il un moyen plus simple de récupérer les résultats d'une requête mysql non pas en ligne mais en colonne? faire une requête par champ plutôt qu'une seule requête sur plusieurs champs?

     

    edit:

    Si je n'explose plus $assoc_result en petits tableaux, ça va tout de suite beaucoup mieux. :P

    J'ai besoin tout de même d'accéder aux résultats extraits pour chaque analyseur pour le script de création de graphique jpgraph. J'ai donc associé dans ma boucle foreach($analyseur as &$value) le tableau $assoc_result à une variable de session $_SESSION['nom_de_l'analyseur']

    il faudrait que j'accède facilement à $_SESSION['nom_de_l'analyseur']['type_de_polluant'][$i]

     

    Les variables de session sont-elles faites pour trimbaler de grosses quantités de data?

  8. Hello Kewlcat,

     

    merci de ta réponse et des pistes indiquées.

    En fait la page n'est reçue (en fait affichée par le navigateur) qu'au bout de 15 minutes :-/. Le navigateur reste sur le formulaire initial et l'indicateur de chargement tourne, tourne, tourne...

     

    Comment est configuré ton "accélérateur de PHP" ? Peut-on forcer un flush des buffers ? Y aurait-il des erreurs de Content-Length qui forceraient le navigateur à attendre des données alors que PHP a fini ?

     

    la configuration est celle par défaut, je vais essayer de le désactiver pour voir si ça change quelquechose.

    Comment puis-je voir de potentielles erreurs de Content-Length? (en sniffant les headers HTTP ?)

     

    Te sens-tu prêt à ajouter des traces partout (messages sur la console, messages dans la page, ou autre solution de ton choix), vraiment partout et pas uniquement globalement, pour déterminer quelle méthode démarre / finit à quelle heure, et ainsi avoir des infos beaucoup plus précises que ce que top te fournit ?

     

    je vais essayer de logger un maximum de choses dans syslog, la page ne s'affichant pas au fur et à mesure, je vais peut être commenter encore des bouts de code pour espérer trouver où cela coince (si ça vient du code) :-/

     

    edit: ce qui semble prendre du temps, c'est la manipulation de mon tableau associatif, je mets mon code dans un autre post.

     

    Peux-tu essayer d'utiliser ethereal ou tcpdump (ou un autre outil de ton choix) pour savoir exactement ce qui transite (entêtes HTTP comprises) sur le réseau pendant tout le temps de la requête ? "Ce qui transite", mais aussi et surtout "quand" ...

    Je vais utiliser wireshark sur le serveur pour voir ce qui est envoyé et quand c'est envoyé

    edit: bon rien de transcendant apparemment, 8 paquets envoyés pour le formulaire, la réponse vient plus de 15 minutes après

    ta6l56u2.png

     

    Pour MyISAM, on me disait que c'était plus rapide pour une base destinée essentiellement à des requêtes SELECT.

  9. Bonjour,

     

    Dans le cadre du boulot, j'ai créé une base de données sous MySQL v5 type MyISAM associé à Apache2 (mpm-prefork) avec php5 en module, le tout sous Debian Testing sur un AMD 64 3500+ 1Go DDR-RAM.

     

    La BdD grossissant de jour en jour je suis confronté à des problèmes de performances lorsque l'on réalise des requêtes qui retournent beaucoup de résultats (> 100000) avec un processus Apache2 qui tourne sans arrêt.

     

    Ma BdD consiste en 15 tables correspondant chacune à un analyseur; chaque table comporte entre 10 et 20 champs selon les analyseurs; + 3 tables d'identifiant divers (date, lieu,...) exportées en clés étrangères dans les 15 premières.

     

    L'application PHP développée consiste en

    • authentification de l'utilisateur avec stockage des infos de login/pass dans des variables de session
      formulaire de sélection pour une construction personnalisée des requêtes mysql à réaliser (Cf mon précédent
    topic)
    construction de la requête en fonction des choix récupérées par la méthode POST, interrogation de la base MySQL
    Calculs sur les résultats retournés avec des fonctions statistiques fournies par Stats.php du projet PEAR et écriture dans un fichier texte sur le serveur des data extraites
    transformation des résultats fournis en ligne par Mysql pour les récupérer en colonne *
    création d'un formulaire pour tracer des graphiques à partir des résultats récupérés à l'aide de la librairie Jpgraph*

    tout ceci marche pas trop mal du moment que la requête n'englobe pas trop d'analyseurs (boucle foreach sur chaque analyseur sur les étapes 2 et 3) ou si la requête est limitée à un analyseur et quelques dates/lieux/....

     

    Au niveau optimisation, je me suis inspiré de ce site http://www.onlamp.com/pub/a/onlamp/2004/02...amp_tuning.html

    • j'ai mis les grosses requêtes en cache SQL; lorsque je réalise une grosse requête directement via le client mysql, celle ci met moins d'une seconde à sortir (et moins de 0.1 seconde quand il y a un hit dans le cache)
      j'ai créé des index sur les champs utilisés dans les clauses WHERE des requêtes mysql
      j'ai compilé un accélérateur php basé sur Zend (eaccelerator)
      j'ai modifié les paramètres mpm_perfork comme suit
    <IfModule mpm_prefork_module>
    StartServers		  5
    MinSpareServers	   5
    MaxSpareServers	  10
    MaxClients		  10
    MaxRequestsPerChild   100
    </IfModule>


    Je pense avoir deux goulots d'étranglements dans mon appli PHP au niveau des étapes 3 et 4 (celles avec les *)

    -mysql_fetch_array retourne les éléments du tableau de résultat ligne par ligne et moi je les veux colonne par colonne; j'ai donc une fonction fetch_AllDataqui lit ligne à ligne le tableau de résultat et fait une rotation à 90° de tout ce monde là dans un tableau associatif avec le noms de mes champs en en-tête.

    - le tableau associatif est ensuite éclaté en autant de variables de session qu'il y a de champs sélectionnés (multipliés par le nombre d'analyseurs choisis) pour pouvoir les passer au script jpgraph

     

    J'ai dans un premier temps commenté cette dernière partie (l'étape 4 n'est donc pas réalisée) et j'ai inséré des fonctions microtime en début et fin de mon script php pour évaluer son temps d'éxécution global:

     

    Sur une requête globale sur 1 table (avec des inner join sur les 3 tables date/lieu/...), le script php m'indique un temps d'exécution de 3.3 secondes dont 1.5 seconde pour la fonction fetch_Alldata.

     

    sauf que avant de voir ce score s'afficher sur mon navigateur, j'ai du patienter 10-15 minutes :-/

    Pendant ce temps, un processus apache2 occupe 99,9% de la charge CPU avec une charge mémoire comprise entre 10 et 20% (infos données par top)

     

    Si je stoppe le processus apache en insérant une clause max_execution_time dans le script php, j'obtiens la même page beaucoup plus rapidement mais avec une erreur de temps d'exécution dépassé (sauf que tout y est...)

     

    si certains ont des idées sur la question, parce que là..... :P

     

    merci

  10. Pareil, pas d'objections. Cependant, il faut se méfier des liens morts. Un lien peut être actif aujourd'hui et mort le lendemain (ou quelques mois plus tard).

    Il convient donc de reprendre les éléments clé du lien en plus de citer ce dernier afin de ne pas perdre l'information en cas de problème avec l'autre site.

     

    Je parle bien d'éléments clé et pas de "pompage intégral" bien évidemment.

×
×
  • Créer...