Fix: Benchmark: Was sagt er aus?

Hi,

ich habe 2 Server, einen mit Single-Core und einen mit Dual-Core, einer hat 1 GB RAM, einer 4 GB. Ansonsten relativ ähnlich.

Wenn ich nun folgendes Benchmarkscript laufen lasse, bekomme ich folgende Ergebnisse. Aber die langsameren Ergebnisse auf dem "schneleeren" Server, und das reproduzierbar und immer wieder aufs Neue. Teilweise auch etwas gravierender als untenstehend.

Was haltet Ihr davon?

Script:

  
  
# http://www.free-webhosts.com/php-hosting-comparison.php  
#  
*/  
  
$iterations = 12;  
if(isset($_SERVER['PHP_SELF'])) $PHP_SELF = $_SERVER['PHP_SELF'];  
$starttime = explode(' ', microtime());  
$string1 = 'abcdefghij';  
  
for($i = 1; $i <= 20000; $i++)  
{  
$x=$i * 5;  
$x=$x + $x;  
$x=$x/10;  
$string3 = $string1 . strrev($string1);  
$string2 = substr($string1, 9, 1) . substr($string1, 0, 9);  
$string1 = $string2;  
}  
  
$endtime = explode(' ', microtime());  
$total_time = $endtime[0] + $endtime[1] - ($starttime[1] + $starttime[0]);  
$total_time = round($total_time * 1000);  
  
###################################################  
  
if(isset($_GET['test'])) $test = $_GET['test'];  
$test = (int)$test;  
if(empty($test)) $test=0;  
  
if(isset($_GET['ttimes']))  
{  
	$ttimes = $_GET['ttimes'];  
	if($test>0 AND empty($ttimes)) { echo 'error'; die; }  
	$itimes = explode('_', $ttimes);  
	if(count($itimes)<$test)  { echo 'error 2'; die; }  
}  
  
$itimes[$test] = number_format($total_time,0);  
$test_results = '';  
$ttimes2 = '';  
$TimesSum=0;  
  
for($i = 0; $i <= $test; $i++)  
{  
	$itimes[$i] = (int)$itimes[$i];  
	$TimesSum += $itimes[$i];  
	$j=$i+1;  
	$test_results .=  'Test #' . $j . ' completed in ' . $itimes[$i] . ' ms.<br>';  
	$ttimes2 .= $itimes[$i];  
	if($i < $test) $ttimes2 .= '_';  
}  
  
$test2 = $test+1;  
$tquery = 'test=' . $test2 . '&ttimes=' . $ttimes2;  
$tquery2 = $tquery . '&stop=1;';  
$AverageAll = round($TimesSum/$test2);  
$iterations2 = $iterations-1;  
sort($itimes);  
$lowest = $itimes[0];  
$highest = $itimes[$test];  
if(isset($_GET['stop'])) $stop = $_GET['stop'];  
if(isset($stop)) $test = $iterations;  
  
?>  
<html><head>  
<?  
if($test<$iterations2) echo '<META HTTP-EQUIV="REFRESH" CONTENT="5; URL=' . $PHP_SELF . '?' . $tquery . '">';  
?>  
<title>Free PHP Benchmark Performance Script from Free-Webhosts.com</title>  
<META name="ROBOTS" content="NOINDEX,NOFOLLOW">  
<meta content="text/html; charset=windows-1252" http-equiv=content-type>  
<meta http-equiv="Content-Style-Type" content="text/css">  
</head>  
  
<body>  
<h1>Free PHP Benchmark Performance Script</h1>  
<p><b><font face=Arial color="#999999" size=4>  
<?  
  
echo $test_results;  
echo "<br>Lowest time: $lowest ms , Highest time : $highest ms<br>\n";  
echo "Average of all $j times: <font size=\"+2\">$AverageAll ms</font><br>\n";  
if($test2>2)  
{  
	$j-=2;  
	$AverageMid = round(($TimesSum-$lowest-$highest)/$j);  
	echo "Average of middle $j times: <font size=\"+2\">$AverageMid ms</font><br>\n";  
}  
echo '<br><a href="' . $PHP_SELF . '">Begin again</a>';  
if($test<$iterations2) echo ' | <a href="' . $PHP_SELF . '?' . $tquery2 . '">Stop</a> | <font color=red>Doing ' . $iterations . ' iterations. Refreshing in 5 seconds...</font><br>';  
  
?><br><br>  
Copyright &copy; 2006 , <a href="http://www.free-webhosts.com/" target="_top"><b>Free Web Hosting</a> (Free-Webhosts.com)<br></font></b>  
</BODY></HTML>  

Server1:

Test #1 completed in 111 ms.
Test #2 completed in 113 ms.
Test #3 completed in 113 ms.
Test #4 completed in 111 ms.
Test #5 completed in 108 ms.
Test #6 completed in 111 ms.
Test #7 completed in 112 ms.
Test #8 completed in 111 ms.
Test #9 completed in 112 ms.
Test #10 completed in 111 ms.
Test #11 completed in 110 ms.
Test #12 completed in 110 ms.

Lowest time: 108 ms , Highest time : 113 ms
Average of all 12 times: 111 ms
Average of middle 10 times: 111 ms

Server2:

Test #1 completed in 110 ms.
Test #2 completed in 110 ms.
Test #3 completed in 110 ms.
Test #4 completed in 105 ms.
Test #5 completed in 111 ms.
Test #6 completed in 105 ms.
Test #7 completed in 111 ms.
Test #8 completed in 110 ms.
Test #9 completed in 110 ms.
Test #10 completed in 101 ms.
Test #11 completed in 110 ms.
Test #12 completed in 110 ms.

Gruß, Fix

  1. Hi!

    ich habe 2 Server, einen mit Single-Core und einen mit Dual-Core, einer hat 1 GB RAM, einer 4 GB. Ansonsten relativ ähnlich.
    Wenn ich nun folgendes Benchmarkscript laufen lasse, bekomme ich folgende Ergebnisse. Aber die langsameren Ergebnisse auf dem "schneleeren" Server, und das reproduzierbar und immer wieder aufs Neue. Teilweise auch etwas gravierender als untenstehend.

    Die Taktgeschwindigkeit eines Prozessors sagt sehr wenig über die Ausführungsgeschwindigkeit von Code aus. Die Anzahl der Verarbeituzngsschritte je Takt kann je nach Modell unterschiedlich sein. Sie kann nur dann verglichen werden, wenn die Prozessorfamilie die selbe ist. Für Programme kommt noch hinzu, dass sie ungestört von anderen Tasks arbeiten können und genügend Ressourcen bereitstehen.

    Was haltet Ihr davon?

    Nichts, weil es nicht weiter als ein in der Praxis irrelevanter Laborversuch ist. Wann hat man schonmal 20000 Rechen- und Stringoperationen in einem Script und noch dazu mit nicht verwendetem Ergebnis?

    $starttime = explode(' ', microtime());

    microtime() hat schon seit langem einen zusätzlichen Parameter bekommen, mit dem die Zeit in günstiger verarbeitbarer Form zurückgegeben wird.

    Lo!

    1. Hallo dedlfix,

      schön, dass Du mir geantwortet hast.

      Sie kann nur dann verglichen werden, wenn die Prozessorfamilie die selbe ist.

      Ja, das ist sie.

      Was haltet Ihr davon?

      Nichts, weil es nicht weiter als ein in der Praxis irrelevanter Laborversuch ist. Wann hat man schonmal 20000 Rechen- und Stringoperationen

      Ok. Trotzdem: Ich hatte Webspace, da warens max. 35ms und jetzt mit eigenem Server ca. 105ms und mit leistungsstärkerem Server gar 111ms. Finde ich schon komisch.

      Gibt es andere Möglichkeiten, einen Server auf die nötige Performance zu testen?

      Gruß, Fix

      1. Hallo,

        Gibt es andere Möglichkeiten, einen Server auf die nötige Performance zu testen?

        selbstverständlich. Beispielsweise gibt es ab für apache.

        Freundliche Grüße

        Vinzenz

        1. Hallo,

          Gibt es andere Möglichkeiten, einen Server auf die nötige Performance zu testen?

          selbstverständlich. Beispielsweise gibt es ab für apache.

          Hi Vinzenz,

          auch an Dich nochmal Danke für den Tip. Habs ausprobiert, siehe weiter oben.

          Gruß, Fix

      2. Hi!

        Was haltet Ihr davon?
        Nichts, weil es nicht weiter als ein in der Praxis irrelevanter Laborversuch ist. Wann hat man schonmal 20000 Rechen- und Stringoperationen
        Gibt es andere Möglichkeiten, einen Server auf die nötige Performance zu testen?

        Was ist denn wichtig bei einem Webserver? Nicht nur, dass er eine einzelne Seite schnell berechnet, sondern vor allem der gesamte Prozess zwischen Anforderung seitens eines Browsers und der fertig angezeigten Seite - und das auch noch wenn mehrere Anwender gleichzeitig was wollen. Da spielt nicht nur die Schnelligkeit des Prozessors sondern auch die Netzwerkanbindung eine Rolle. Und dann gibt es natürlich auch noch Optimierungspotential bei den Ressourcen, die die Seiten so haben wollen (zum Beispiel CSS-Sprites statt Einzelbilder).

        Jedenfalls wäre eine einigermaßen relevante Aussage die Anzahl der abgearbeiteten Requests. Tools wie "ab" (oder "ab2" = Apache Benchmark) können Requests in beliebiger Anzahl abfeuern und ermitteln Daten wie Laufzeiten oder die Anzahl Requests pro Zeit.

        Lo!

        1. Jedenfalls wäre eine einigermaßen relevante Aussage die Anzahl der abgearbeiteten Requests. Tools wie "ab" (oder "ab2" = Apache Benchmark) können Requests in beliebiger Anzahl abfeuern und ermitteln Daten wie Laufzeiten oder die Anzahl Requests pro Zeit.

          Danke. Habe ich mal gemacht. Aber bisher nur für 1 der beiden Server.
          Ich werde mal den nächsten hinterhermachen und ggf. hier posten.

          Welche Werte sind die relavanten im Ergebnis von ab?

          Gruß, Fix

          1. Hi!

            Welche Werte sind die relavanten im Ergebnis von ab?

            Kann ich dir jetzt nicht sagen, wie die genau heißen, weil ich das lange nicht gemacht habe. Du musst da praxisorientiert an die Sache rangehen. Was passiert denn auf so einem Server in der freien Wildbahn? Er bekommt jede Menge Requests. Ein Benchmark-Wert wäre, wieviel pro Zeiteinheit er schafft. Für den Anwender wäre aber eher interessant, wie lange er warten muss. Das wird umso kritischer, je mehr Requests gleichzeitig laufen.

            Lo!

            1. Hi dedlfix,

              Kann ich dir jetzt nicht sagen, wie die genau heißen, weil ich das lange nicht gemacht habe. Du musst da praxisorientiert an die Sache rangehen. Was passiert denn auf so einem Server in der freien Wildbahn? Er bekommt jede Menge Requests. Ein Benchmark-Wert wäre, wieviel pro Zeiteinheit er schafft. Für den Anwender wäre aber eher interessant, wie lange er warten muss. Das wird umso kritischer, je mehr Requests gleichzeitig laufen.

              Ok. Ich habe jetzt beide verglichen und ein "Hello World" Script 10000 mal bei 10 gleichzeitigen Verbindungen aufgerufen und siehe da, der größere Server schaffts das jedesmal in um die 8 Sekunden, während sein "kleiner Bruder" jedesmal 10 Sekunden braucht.

              Das würde ich als Laie nun auch für einen adäquaten Unterschied zwischen den beiden Servervarianten einstufen.

              Letztlich gehts mir darum, dass ich nachvollziehen können muß, dass der größere (und teuerere) Server auch tatsächlich der Schnellere sein sollte.

              Gruß, Fix

  2. Hallo,

    Wenn ich nun folgendes Benchmarkscript laufen lasse, bekomme ich folgende Ergebnisse. Aber die langsameren Ergebnisse auf dem "schneleeren" Server [...]

    Server1:

    Test #1 completed in 111 ms.
    Test #2 completed in 113 ms.
    Test #3 completed in 113 ms.
    Test #4 completed in 111 ms.
    Test #5 completed in 108 ms.
    Test #6 completed in 111 ms.
    Test #7 completed in 112 ms.
    Test #8 completed in 111 ms.
    Test #9 completed in 112 ms.
    Test #10 completed in 111 ms.
    Test #11 completed in 110 ms.
    Test #12 completed in 110 ms.

    Server2:

    Test #1 completed in 110 ms.
    Test #2 completed in 110 ms.
    Test #3 completed in 110 ms.
    Test #4 completed in 105 ms.
    Test #5 completed in 111 ms.
    Test #6 completed in 105 ms.
    Test #7 completed in 111 ms.
    Test #8 completed in 110 ms.
    Test #9 completed in 110 ms.
    Test #10 completed in 101 ms.
    Test #11 completed in 110 ms.
    Test #12 completed in 110 ms.

    wo siehst du jetzt die signifikaneten Unterschiede? Die ermittelten Zeiten liegen durchweg um 110ms, das würde ich als "gleich" bezeichnen. Dass die Ergebnisse im Einzelfall immer kleinen Schwankungen unterworfen sind, ist bei einem Multitasking-System ohne garantiertes Echtzeitverhalten völlig normal.

    Dass die Ergebnisse so nahezu gleich ausfallen, lässt mich übrigens vermuten, dass die CPUs der beiden Maschinen nahezu die gleiche Leistungsfähigkeit haben. Mehr kann man nicht sagen, weil der Benchmark-Test nur auf interne Rechenoperationen abzielt und weder Netzwerkkommunikation, noch Festplattenzugriffe, noch Speicherzugriffe mit einbezieht, denn der Code ist spätestens nach dem ersten Schleifendurchlauf komplett compiliert im CPU-Cache.
    Oder die beiden Server sind virtuelle Maschinen auf der gleichen Hardware mit der gleichen Konfiguration.

    Praxisrelevant ist das also nicht, was du hier ermittelst.

    Ciao,
     Martin

    --
    F: Was ist eigentlich aus deinem schlimmen Durchfall geworden?
    A: Mein Arzt hat mir Valium verschrieben.
    F: Und das hilft?
    A: Naja, ich mach mir immer noch in die Hose. Aber inzwischen ist es mir egal.
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    1. Hi,

      Dass die Ergebnisse so nahezu gleich ausfallen, lässt mich übrigens vermuten, dass die CPUs der beiden Maschinen nahezu die gleiche Leistungsfähigkeit haben.

      Single-Core
      Opteron™ 1210 HE
      2 x 1,8 GHz
      1 GB
      2 x 250 GB

      zu

      Dual-Core
      Opteron™ 1214 HE
      2 x 2,2 GHz
      4 GB
      2 x 500 GB

      Das sind die beiden Servervarianten und ich hätte Version 2 schon als lesitungsfähigerbezeichnet?

      Gruß, Fix

      1. Moin,

        Dass die Ergebnisse so nahezu gleich ausfallen, lässt mich übrigens vermuten, dass die CPUs der beiden Maschinen nahezu die gleiche Leistungsfähigkeit haben.

        ich hatte bewusst geschrieben: "vermuten"  :-)

        Single-Core
        Opteron™ 1210 HE
        2 x 1,8 GHz

        Dual-Core
        Opteron™ 1214 HE
        2 x 2,2 GHz

        Das sind die beiden Servervarianten und ich hätte Version 2 schon als lesitungsfähigerbezeichnet?

        Nach den reinen technischen Spezifikationen, ja. Aber offensichtlich kann der Dual-Core bei deiner spezifischen Aufgabenstellung seinen Vorteil nicht ausspielen. Zumindest den Dual-Core-Vorteil schon mal nicht, denn dein Testcode läuft streng linear ab und hat nichts, was effizient nebenläufig ausgeführt werden könnte. Bleibt die Taktfrequenz - nun ja, gut 20% mehr. Aber das kann der "Kleinere" anscheinend durch andere Vorzüge wettmachen. Vielleicht ist auch die Auslastung beider Maschinen durch andere Prozesse hoch genug, dass "des bissle" kaum noch ins Gewicht fällt.

        Nochmal: Bezogen auf die Gesamtanforderungen, die an einen Webserver gestellt werden, ist das Paket 2 sicher höherwertig und leistungsfähiger. Aber deine Testmethode ist nicht geeignet, diesen Unterschied festzustellen.

        Ciao,
         Martin

        --
        Wenn dir jemand eine unschlagbare Abkürzung empfiehlt, gehe einen Umweg.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(