IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Boost C++ Discussion :

Détecter l'effondrement d'un serveur


Sujet :

Boost C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Points : 50
    Points
    50
    Par défaut Détecter l'effondrement d'un serveur
    Bonjour,

    J'utilise les librairies Thread et Asio de Boost pour faire un aspirateur de pages web (c'est pour un projet)
    Mon but est donc de traiter le plus de pages en même temps. Chaque thread lancé se connecte au serveur pour récupérer une page et la traiter.
    Seulement on me demande d'optimiser la gestion des threads, c'est-à-dire d'en lancer jusqu'à ce que le serveur commence à s'effondrer.

    C'est cette dernière chose qui me pose problème : comment repérer le début de l'effondrement d'un serveur ?
    Il me semble que les serveurs ont un nombre limité de connexions simultanées, mais que celui-ci varie en fonction de la configuration du serveur.

    Pour info j'ai tenté de lancer 250 threads sur un même serveur (celui de mon école), et en 7 secondes 210 threads (en moyenne) me ramènent le contenu de la page visée, et les autres je ne sais pas ce qu'ils deviennent, car apparament aucune exception n'est lancée.

    Avez-vous des infos qui pourraient m'aider svp ?
    Merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    En gros, si un thread parmi n met plus de temps (de manière significative) qu'une application mono-threadée pour récupérer une page, tu es en train de saturer ton ordinateur, ta connexion ou le serveur.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Lancer plus de threads qu'il n'y a de threads physiques ne sert à rien.
    Boost ftw

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 183
    Points
    5 183
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Lancer plus de threads qu'il n'y a de threads physiques ne sert à rien.
    mince alors, j'ouvre le gestionnaire de taches et je vois que j'ai plusieurs centaines de threads qui tournent simultanément sur ma machine bi-coeur
    déjà quand tu parles d'effondrement, j'imagine que c'est par rapport à la bande passante de ton serveur ?
    si la resource à exploiter au maximum c'est le CPU ok, mais s'il s'agit de la bande passante cette remarque ne s'applique pas

    ce que je te propose c'est de suivre la vitesse de téléchargement de chaque thread et de sommer la vitesse de chaque thread pour connaitre l'occupation globale de ta bande passante
    si en lancant un thread supplémentaire tu ne consomme pas plus de bande passante (si la somme totale est inchangée) c'est que ce thread n'utilise pas de surplus, il est donc inutile (tu le laisses se terminer et tu n'en lance pas d'autre)

    la difficulté réside dans le calcul de vitesse, cette dernière pouvant être très variable il vaut mieux calculer une moyenne
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Lancer plus de threads qu'il n'y a de threads physiques ne sert à rien.
    Pour du réseau, ça a un sens.

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Au contraire, non, ça n'en a pas, en particulier avec Boost.Asio.
    Tant qu'on a pas d'appels bloquants, ça ne sert à rien.
    Boost ftw

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Points : 50
    Points
    50
    Par défaut
    Voici comment je crée mes threads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    boost::thread_group group;
    for(unsigned int i = 0; i < 250; ++i)
            group.create_thread(&tryToConnect);
    group.join_all();
    Et la fonction tryToConnect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    void tryToConnect(void)
    {
        int i=0;
     
        boost::mutex::scoped_lock lock(mutexTraitement);
        int r = nbThreads++;
     
        try
        {
               string contenu = aspirerPage("www.isima.fr", "/isima/vie_etudiante/vie_etudiante.php?sousmenu=01");
                if (contenu.length() == 0)
                    cout << "FAILED" << endl;
                else
                {
                    ofstream fic("ok.txt", ios_base::app);
                    fic << contenu << endl;
                    fic.close();
                }
        }
        catch (exception& e)
        {
                cout << r << " a tente de se connecter, mais a echoue" << endl;
        }
    }
    Ce que je trouve un peu bizarre c'est que les 250 threads ont ramené les pages assez rapidement (j'ai aussi fait le test avec 500 threads, ils ont mis environ 45 secondes à tout ramener). Je pensais que le serveur aurait saturé, ou qu'il aurait au moins refusé une socket.

    déjà quand tu parles d'effondrement, j'imagine que c'est par rapport à la bande passante de ton serveur ?
    si la resource à exploiter au maximum c'est le CPU ok, mais s'il s'agit de la bande passante cette remarque ne s'applique pas
    Je crois que le prof nous avais parlé d'effondrement du serveur, mais aussi d'utiliser au mieux le CPU

  8. #8
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Ce que je trouve un peu bizarre c'est que les 250 threads ont ramené les pages assez rapidement (j'ai aussi fait le test avec 500 threads, ils ont mis environ 45 secondes à tout ramener). Je pensais que le serveur aurait saturé, ou qu'il aurait au moins refusé une socket.
    Est-ce que tu sais comment fonctionne le serveur cible? synchrone / asynchrone? un thread par connexion ?
    En tout cas, ça me parait pas débile qu'avec 500 threads tu mettes beaucoup plus de temps qu'avec 250!

    Peut-être le mieux c'est de tester un paquet de valeurs : 1, 50, 100, 150, ..., 500. Et puis tu plot ça sur un graphique pour avoir une meilleur idée de ton optimum pour ce cas là.
    Ensuite, t'as essayé de lancer plusieurs connexions dans un même thread, en mode asynchrone ?

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par loufoque Voir le message
    Au contraire, non, ça n'en a pas, en particulier avec Boost.Asio.
    Tant qu'on a pas d'appels bloquants, ça ne sert à rien.
    Chez lui, il s'agissait d'appels bloquants. Effectivement, si on passe en non bloquant, plus de problème.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 106
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par poukill Voir le message
    Est-ce que tu sais comment fonctionne le serveur cible? synchrone / asynchrone? un thread par connexion ?
    Non je ne sais pas du tout. Et je n'ai pas de serveur cible particulier Le projet doit marcher pour tout type de serveur

    Citation Envoyé par poukill Voir le message
    En tout cas, ça me parait pas débile qu'avec 500 threads tu mettes beaucoup plus de temps qu'avec 250!
    Je me suis mal exprimé ^^
    En fait je trouve ça assez rapide 45secondes pour 500 pages

    Citation Envoyé par poukill Voir le message
    Peut-être le mieux c'est de tester un paquet de valeurs : 1, 50, 100, 150, ..., 500. Et puis tu plot ça sur un graphique pour avoir une meilleur idée de ton optimum pour ce cas là.
    oui ça pourrait être une bonne idée, mais comme je n'ai pas de serveur cible particulier, il faut que je fasse quelque chose qui soit bon pour tout type de serveur. Donc je suppose que mes résultats pour 1 serveur donné ne seraient peut-être pas les mêmes que pour un autre serveur

    Citation Envoyé par poukill Voir le message
    Ensuite, t'as essayé de lancer plusieurs connexions dans un même thread, en mode asynchrone ?
    Non je n'ai pas essayé. Mais j'avoue que je ne comprends pas vraiment comment faire, étant donné que je dois traiter la page aspirée directement après m'être connecté

    Si je me souviens bien de la définition d'asynchrone, ça veut dire que je me connecte, mais que je n'attends pas que la connexion ait fini de faire son boulot, j'avance dans l'exécution de ma fonction. Or si j'avance je traite ma chaine de caractères... que je n'ai peut-être pas si la connexion n'est pas finie, non ?

Discussions similaires

  1. Réponses: 13
    Dernier message: 04/04/2011, 15h06
  2. Réponses: 12
    Dernier message: 13/06/2009, 12h15
  3. Client Serveur, détecter la fin d'envoi du client
    Par Link3 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/07/2008, 09h56
  4. Réponses: 1
    Dernier message: 19/05/2008, 17h42
  5. Détecter l'arriver d'un mail sur un serveure Exchange
    Par LefortLudovic dans le forum Windows Forms
    Réponses: 3
    Dernier message: 27/09/2007, 22h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo