Blog

Auf dem geheimnisvoll schnellen Sprühdosen-Webserver

Wilco Koorn

Aktualisiert Oktober 22, 2025
4 Minuten

Ich bin süchtig nach einem Problem: dem Umgang mit unbekannten Lastspitzen im Netz. Ein Teil der Lösung, die mir vorschwebt, beinhaltet natürlich einen schnellen Webserver. Einer der schnellsten ist Spray-can (siehe GitHub - spray/spray-can) und ich mag das Ding aus mehreren Gründen, die ich hier nicht erläutern werde. Wie dem auch sei, ich bin mir sicher, dass Sie meine allererste Frage bereits erraten können: Wie schnell ist Spray-can wirklich?

Ich bin also dabei, die Geschwindigkeit von Spray-can zu bewerten. Ich kann den Jungs von spray.io glauben, die getwittert haben (mein Kollege Raymond Roestenburg hat mich darauf hingewiesen, danke!):

Bildschirmfoto 2013-08-02 um 1.52.25 PM

Es ist unnötig zu sagen, dass es absolut keinen Spaß macht, diesen Typen zu glauben. Hier ist, was ich getan habe, um es selbst herauszufinden. Der Server. Ich habe dieses Stück Scala geschrieben, um eine Antwort zu erhalten, die leicht zu zählen ist:

   case HttpRequest(GET, "/dispatcher", _, _, _) =>
      counter = counter + 1;
      sender ! HttpResponse(entity = counter.toString())

Mal sehen, ob das funktioniert. Es funktioniert! Die erste Anfrage xebia.com/blog:8080/dispatcher ) ergibt '1', die nächste ergibt '2', dann '3'. Toll!

Der Client In den letzten Monaten habe ich verschiedene Techniken für den Client verwendet. Ich habe mit JMeter begonnen und JMeter in die Luft gejagt, nicht Spray-can. Dann habe ich einen wirklich gemeinen Low-Level-Client in Java geschrieben, Tausende von Threads verwendet und Ergebnisse erhalten, die ich immer noch nicht verstehe. Darauf gehe ich vielleicht in einem späteren Blog ein. Letzten Dienstag erzählte ich meinem Kollegen Joris de Winne davon und er fragte, warum Sie nicht einfach den Unix-Befehl 'wget' verwenden. Also haben wir dieses Experiment noch am selben Tag gestartet.

Erstes Experiment: ein Mac Auf meinem Mac gibt es kein 'wget', also haben wir 'curl' verwendet, aber das ist nur ein Detail. Wir haben zwei kleine Shell-Skripte verwendet. Das erste ("testit.sh") ruft mit curl einfach den Server auf. Es sieht wie folgt aus:

#!/bin/sh
curl https://xebia.com/blog:8080/dispatcher 2>&1 > /dev/null

Und ein zweites, um uns das Leben leicht zu machen. Ich setze das erste Skript in eine Endlosschleife und starte die Schleife 30 Mal im Hintergrund. Etwa so:

#!/bin/sh while [ "" = "" ] ; do ./testit.sh 2>&1 > /dev/null; done & while [ "" = "" ] ; do ./testit.sh 2>&1 > /dev/null; done & while [ "" = "" ] ; do ./testit.sh 2>&1 > /dev/null; done & <snip> while [ "" = "" ] ; do ./testit.sh 2>&1 > /dev/null; done & while [ "" = "" ] ; do ./testit.sh 2>&1 > /dev/null; done &

Das mysteriöse Ergebnis Beachten Sie, dass ich sowohl Spray-can als auch meine Testskripte auf demselben Rechner (2Ghz Intel core i7) ausführe Das ist, was ich sehe. Ein sich wiederholendes Muster, das einen CPU-gebundenen Prozess zeigt, der häufig auf fast keine CPU-Nutzung abfällt.... Grün ist die von Benutzerprozessen genutzte CPU-Leistung, Rot ist die vom System genutzte CPU-Leistung.

Bildschirmfoto 2013-08-02 um 10.57.45 Uhr

Aber warum dieses Muster???? Ich habe JConsole angeschlossen, um zu sehen, ob die Garbage Collection ausgelöst wurde. Fehlanzeige! Ich könnte hier wirklich Ihre Hilfe gebrauchen. Brechen meine Akka-Aktoren zusammen und werden von den überwachenden Aktoren wieder in die Luft gesetzt???? Und in Kürze wird es noch mysteriöser, wenn wir unser zweites Experiment durchführen. Bleiben Sie dran.

Durchsatz Ich habe mein Experiment 5 Minuten lang laufen lassen und dann einen Browser verwendet, um zu sehen, wie viele Anfragen bearbeitet wurden. Es waren 161447 Anfragen. Das entspricht einem Durchsatz von etwa 538 Anfragen pro Sekunde.

Zweites Experiment: zwei Macs Heute habe ich den Mac meiner Frau benutzt, um die Clients auszuführen. Es ist ein etwas älterer Rechner und im Vergleich zu meinem eigenen nicht so leistungsstark (2,53 Ghz Intel Core 2 Duo). Da wir jetzt zwei Rechner haben, gibt es natürlich ein Netzwerk dazwischen und ich habe mir ein paar UTP-Kabel besorgt, um die Kommunikation so schnell wie möglich zu machen. Das schien unnötig! Bei der Nutzung des WLANs habe ich das hier gesehen: Mac, auf dem die Clients laufen:

Schermafbeelding 2013-08-02 om 13.04.24

Mac läuft Sprühdose:

Bildschirmfoto 2013-08-02 um 1.04.14 Uhr

Der Rechner, auf dem die Clients laufen, ist eindeutig an die CPU gebunden, wie wir bereits gesehen haben. Und der Rechner, auf dem Spray-can läuft, verhält sich wie erwartet. Aber wo ist jetzt mein sich wiederholendes Muster? Ich habe keinen blassen Schimmer....

Durchsatz Ich habe 44697 Anfragen in 5 Minuten gesehen, das sind etwa 150 Anfragen pro Sekunde.

Und was nun? Ich habe vor, eine "Please Break My System"-Sitzung mit allen meinen Mitarbeitern zu organisieren. Ich erlaube jede Technik, die für die Kunden verwendet wird, außer dass sie ihre Laptops verwenden müssen, denn die Verwendung von Servern in der Cloud ist kein Spaß. Beobachten Sie diesen Raum.

Verfasst von

Wilco Koorn

Contact

Let’s discuss how we can support your journey.