Web-Seiten-Preformance messen...

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ich wollte mal eben schnell, den WebSpace von Alturo mit dem von 1blu vergleichen... Hab dafür mal ein kleines Skript zusammen gekackt:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: UTF-8 -*-

"""
Einfacher Web-Seiten Preformance Test.

Ruft eine Webseite x-mal hintereinander in x-Threads gleichzeitig ab und
ermittelt die Durchschnittszeit.
"""

__author__  = "Jens Diemer (www.jensdiemer.de)"
__license__ = """GNU General Public License v2 or above -
 http://www.opensource.org/licenses/gpl-license.php"""
__url__     = "http://www.python-forum.de/topic-7447.html"
__version__ = "0.2"
__history__ = """
v0.2
    - Nun mehrer Anfragen gleichzeitig :)
v0.1
    - erste Version
"""


import sys, socket, urllib2, time, threading


timeout = 10

socket.setdefaulttimeout(timeout) # Geht erst ab Python 2.3



class Requester(object):
    def __init__(self, count, threads, delete=2, verbose=False):
        """
        count - Anzahl der Prüfungsrunden
        threads - Anzahl der gleichzeitigen Seitenabrufe
        delete - Gibt an wieviele der schlechtesten und besten Zeiten, für die
            errechnung des Durchnitts gelöscht werden.
        verbose - Mehr Ausgaben :)
        """
        self.count = count
        self.threads = threads
        self.delete = delete

        self.verbose = verbose

    def measuring(self, url):
        """
        Führt die Messung der >url< durch.
        """
        self.url = url

        self.response_times = []

        print
        print ">", url,

        try:
            self.count_requests()
        except (urllib2.URLError, RuntimeError), e:
            print "\nError:", e
            return

        if self.verbose:
            print
            print "min: %0.2fsec, max: %0.2fsec" % (
                min(self.response_times), max(self.response_times)
            )

        average = sum(self.response_times) / len(self.response_times)
        print ">>> average: %0.2fsec" % average,

        target_len = (self.count * self.threads) - (2*self.delete)

        if len(self.response_times) < target_len:
            print "- %d timeouts!(>%dsec)" % (
                (target_len - len(self.response_times)), timeout
            )
            print "Note: Values are not in average calculation!"
        else:
            print

        if self.verbose: print "-"*79

    def count_requests(self):
        """
        Startet die Prüfrunden x-mal (Anzahl: self.count)
        """
        if self.verbose:
            print "\nRequest %s times %s requests:" % (
                self.count, self.threads
            )

        for i in xrange(self.count):
            self.threading_request()
            if self.verbose:
                print

        if len(self.response_times) == 0:
            raise RuntimeError("No Request successfully! URL incorrectly?")

        print

        if self.verbose:
            print "delete %d min time(s) and delete %d max time(s)" % (
                self.delete, self.delete
            )

        if len(self.response_times) - (2*self.delete) <= 0:
            raise RuntimeError("Too few measured values!")

        for dummy in xrange(self.delete):
            # schnellsten Request löschen:
            self.response_times.remove(min(self.response_times))
            # langsamsten Request löschen:
            self.response_times.remove(max(self.response_times))



    def threading_request(self):
        """
        Führt eine Prüfrunde durch
        """
        #
        # Threads erzeugen.
        #
        threads = []
        for dummy in xrange(self.threads):
            threads.append(threading.Thread(target=self.request))
        #
        # Threads starten.
        #
        for thread in threads:
            thread.start()
        #
        # Auf alle Threads warten.
        #
        for thread in threads:
            thread.join()

    def request(self):
        """
        Ruft die Seite einmal ab und trägt die Zeit in self.response_times ein
        """
        start_time = time.time()

        try:
            f = urllib2.urlopen(self.url)
            sidecontent = f.read()
            f.close()
        except urllib2.URLError,e:
            if self.verbose:
                print "Error:", e
            else:
                sys.stdout.write("X")
        else:
            duration_time = time.time() - start_time

            if self.verbose:
                print "%0.2fs" % duration_time,
            else:
                sys.stdout.write(".")

            self.response_times.append(duration_time)


#~ r = Requester(count=5, threads=5, delete=3, verbose=True)
r = Requester(count=5, threads=5, delete=3, verbose=False)

r.measuring("http://heise.de")
r.measuring("http://google.de")
Zum Ergebnis (PyLucid Index Seite, CGI, kein modPython):
Alturo: 0.69sec
HostEurope: 1.19sec
1blu: 0.27sec (Lokal installiertes Python!)

EDIT: Das Script ist mittlerweile mit Threading... Die Messwerte aber alt...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Dafür gäbs aber auch schon apachebench und siege (http://www.joedog.org/siege/).
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Den Apache Bench hab ich ausprobiert. Aber das Java-Programm hat doch gleich meinen Desktop zerschossen! :evil:

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und wer zu faul ist, den ab zu installieren, der kann ja noch das Online-Gateway verwenden.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten