Annonce

Réduire
Aucune annonce.

WebBenchmark

Réduire
X
 
  • Filtre
  • Heure
  • Afficher
Tout nettoyer
nouveaux messages

  • WebBenchmark

    Bonjour à tous (et à toutes ?),

    Je poste un petit script que j'ai fait et qui permet de faire des Benchmarks de serveurs Web en HTTP.

    N'hésitez surtout pas à me faire des remarques dessus, je suis loin d'être expertisé en python !
    Par contre, je serai très heureux de l'améliorer.

    Voici le script :
    Dans un pastebin : http://pastebin.com/rg0N1hXf

    Sur le forum :
    Code:
    #!/usr/bin/python
    from threading import Thread
    import urllib2
    from Queue import *
    import time
    import sys
    
    class HttpRequest(Thread):
    	def __init__(self,queue,name,url):
    		print ("Creation de la requete {}".format(name))
    		self.queue=queue
    		self.creation=time.time()
    		Thread.__init__(self,name=name)
    	def run(self):
    		content = urllib2.urlopen(url).read()
    		print("Requete {} terminee : {} secondes écoulées".format(self.getName(),(time.time()-self.creation)))
    		self.queue.task_done()
    
    def usage():
    	print("Usage : {} URL nbReqParSeconde nbSec".format(sys.argv[0]))
    	sys.exit()
    
    def atoi(chaine):
    	retour=0
    	try:
    		retour=int(chaine)
    	except:
    		usage()
    	return retour
    
    if __name__ == '__main__':
    	if(len(sys.argv)==4):
    		nbReqParSeconde=atoi(sys.argv[2])
    		nbSec=atoi(sys.argv[3])
    		url=sys.argv[1]
    		queues = list()
    		cpt=0
    
    		try:
    			while(True):
    				q=Queue(nbReqParSeconde)
    				for i in range(0,nbReqParSeconde):
    					http=HttpRequest(q,"%d"%cpt,url)
    					http.start()
    					q.put(http)
    					cpt+=1
    				queues.append(q)
    				time.sleep(nbSec)
    		except KeyboardInterrupt:
    			print("Fermeture des queues")
    			cpt=1
    			for qu in queues:
    				print("Fermeture de la queue %d"%cpt)
    				q.join()
    				cpt+=1
    	else:
    		usage()
    L'utilisation se fait via la ligne de commande et de la manière suivante :
    WebBenchmark.py http://monsite.com 80 10

    Dans cet exemple, on envoie au site http://monsite.com 80 requêtes toutes les 10 secondes.
    On pourra ainsi voir le temps nécessaire pour chaque requête. Il peut également être intéressant de combiner ça avec un petit htop sur la machine ciblée.

    Pour stopper l'utilisation un simple CTRL+C suffit.

    Petit Disclaimer:
    L'utilisation de ce script peut s'apparenter à du Déni de Service, utilisez le donc uniquement sur vos machines ou avec une autorisation préalable

  • #2
    Bonsoir,

    Pas trop le temps ce soir de regarder, mais vite fait il y a des choses à revoir niveau syntaxes et conceptuelles, on pourra voir ça ensemble...

    Petites questions préparatrices:
    1. Qu'est qu'un web benchmark pour toi ?
    2. Tu travailles sous quel OS ?
    3. Pourquoi utiliser Queue ?
    4. Pourquoi utiliser les Thread ?


    Pas que les décisions soient mauvaises, mais j'aime bien connaître ton mode de pensée pour éviter de proposer quelque chose de trop éloigné...

    Bonne soirée

    Commentaire


    • #3
      Mon but est de vérifier les performances de serveurs Web, c'est pour ça que chaque requête est chronométrée. Ca me permet de voir le temps de traitement de la requête par rapport à la charge.

      Je suis sous MacOs mais du coup, ça devrait aussi fonctionner sur Linux non ?

      Alors, concernant les queues, je les utilise pour pouvoir gérer mes paquets de threads et pouvoir faire des joins dessus. Je l'utilise aussi parce que c'était présenté ainsi dans mon ouvrage de Python pour la gestion de threads multiples.

      Pour les threads, je les utilises pour envoyer des paquets de requêtes et les envoyer toutes en même temps. Ainsi, je stocke mes threads dans une queue, qui représente un paquet de requêtes et finalement je stocke mes paquets, les queues dans une liste afin de pouvoir les arrêter à la demande.

      Commentaire


      • #4
        Ok,

        Si tu travailles sous Unix, il est préférable de se tourner vers time.clock plutôt que time.time

        Un peu HS, mais je pose quand même, pourquoi python 2.x plutôt que 3.x ?

        Maintenant on passe à la syntaxe,

        La fonction atoi:

        Pour moi je trouve qu'elle est pas mal, mais acceptes-tu une variable nbReqParSeconde et nbSec prenant la valeur 0 ?

        La partie principale du code:

        La variable queues pourrait être plus sympa

        Code:
        class File(Queue):
            queues = [] # gestion de chaque Thread
            def __init__(self, ...):
                # suite de l'initialisation
                self.queues.append(self)
            # suite de la classe
        Sinon à part ça, je sais pas si c'est le forum, mais j'ai l'impression que l'indentation n'est pas très conforme (4 espaces) à ce qui est définie dans les conventions python

        Honnêtement, si je devais faire ce travail avec des vrai threads, j'utiliserais le langage Java...(à prendre ou à laisser)
        Dernière modification par fred, 30 juin 2015, 13h11.

        Commentaire


        • #5
          Quelle est la différence entre time.clock et time.time ?

          Pour python 2 et python 3, aucune idée, j'ai juste appris le python lors de la version 2 mais je n'ai fait qu'effleurer ce langage. Je ne le connais pas à sa juste mesure.

          Concernant atoi, c'est vrai que des valeurs <=0 ne sont pas acceptables, je vais de ce pas changer ça.

          Pour la variable queues, comment pourrait elle être plus sympa ? Enfin, dans un sens, que lui reproches tu ;-) ?

          Concernant l'indentation, elle est normalement de 4 espaces, je suppose aussi que ça doit venir du forum.

          Pourquoi préfères tu le java pour l'utilisation des threads ?

          Commentaire


          • #6
            Quelle est la différence entre time.clock et time.time ?
            Tu aurais au moins pu lire la documentation que je t'ai mis en lien, il y a une spécificité due à l'OS employé...

            Pour la variable queues, comment pourrait elle être plus sympa ? Enfin, dans un sens, que lui reproches tu ;-) ?
            Eh bien je donne un exemple avec une classe où à chaque instance de la classe Queue créée, tu ajoutes à ta liste queues cette instance.

            Je ne lui reproche rien à elle spécifiquement, juste le niveau conceptuel où on souhaiterait par exemple maintenir le code plus facilement (détection des erreurs et modification plus simples)

            Pourquoi préfères tu le java pour l'utilisation des threads ?
            Eh bien on fait du vrai threading, pas sur un seul processeur comme avec python, on gère le multi-processeurs naturellement.

            Commentaire


            • #7
              Je reconnais que je n'ai pas passé assez de temps sur ta réponse. Je n'avais d'ailleurs pas vu ton lien.

              Je comprends ce que tu veux dire pour les queues du coup. Je n'avais pas bien saisi ou tu voulais en venir.

              Le python ne gère qu'un seul processeur ? Je ne le savais pas ca.

              Commentaire


              • #8
                Le python ne gère qu'un seul processeur ?
                Voir cette discussion et les réponses de Ned Batchelder et ninjagecko

                Commentaire

                Chargement...
                X