Wie führe ich einen Webserver-Leistungsbenchmark durch?

Leistungstests für Ihre Webanwendung: Ein umfassender Überblick

Haben Sie sich jemals gefragt, wie schnell Ihre Website auf Anfragen reagiert oder wie viele gleichzeitige Nutzer sie bewältigen kann? Lasttests sind entscheidend, um die Kapazitäten Ihrer Webanwendung zu verstehen. Bevor Sie einen Webserver auswählen, sollten Sie unbedingt einen Belastungstest durchführen, um den optimalen Server für Ihre Bedürfnisse zu ermitteln.

Durch Benchmarking können Sie wichtige Entscheidungen treffen:

  • Welcher Webserver bietet die beste Leistung?
  • Wie viele Server benötigen Sie, um eine bestimmte Anzahl von Anfragen zu bearbeiten?
  • Welche Konfiguration erzielt die besten Ergebnisse?
  • Welche Technologie-Stacks sind am effizientesten?
  • Wann verlangsamt sich Ihre Website oder bricht zusammen?

Es gibt viele Online-Tools für Stresstests. Wenn Sie jedoch eine interne Lösung bevorzugen oder die Leistung Ihres Webservers detailliert messen möchten, können Sie ApacheBench und weitere hier vorgestellte Alternativen verwenden.

Ich habe Apache- und Nginx-Webserver auf DigitalOcean gehostet, um diese Tests durchzuführen.

ApacheBench (ab)

ApacheBench (ab) ist ein quelloffenes Befehlszeilenprogramm, das mit jedem Webserver funktioniert. In diesem Artikel zeige ich Ihnen, wie Sie dieses Tool installieren und verwenden, um Belastungstests durchzuführen und die Ergebnisse zu vergleichen.

Installation und erster Test mit Apache

Installieren Sie ApacheBench mit dem Befehl yum:

yum install httpd-tools

Wenn Sie die httpd-tools bereits installiert haben, können Sie diesen Schritt überspringen.

Lassen Sie uns nun sehen, wie sich Apache bei 5000 Anfragen mit einer Parallelität von 500 schlägt:

[[email protected] ~]# ab -n 5000 -c 500 https://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, https://www.zeustech.net/
Licensed to The Apache Software Foundation, https://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        Apache/2.2.15
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        4961 bytes
Concurrency Level:      500
Time taken for tests:   13.389 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Non-2xx responses:      5058
Total transferred:      26094222 bytes
HTML transferred:       25092738 bytes
Requests per second:    373.45 [#/sec] (mean)
Time per request:       1338.866 [ms] (mean)
Time per request:       2.678 [ms] (mean, across all concurrent requests)
Transfer rate:          1903.30 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0   42  20.8     41    1000
Processing:     0  428 2116.5     65   13310
Waiting:        0  416 2117.7     55   13303
Total:         51  470 2121.0    102   13378
Percentage of the requests served within a certain time (ms)
50%    102
66%    117
75%    130
80%    132
90%    149
95%    255
98%  13377
99%  13378
100%  13378 (longest request)
[[email protected] ~]#

Wie Sie sehen, hat Apache 373 Anfragen pro Sekunde verarbeitet und benötigte 13,389 Sekunden für die Bearbeitung aller Anfragen.

Diese Ergebnisse zeigen die Leistung der Standardkonfiguration. Wenn Sie Änderungen vornehmen, können Sie den Test wiederholen, um die Effekte zu sehen und die beste Konfiguration zu wählen.

Vergleich mit Nginx

Führen wir den gleichen Test mit Nginx durch, um die Unterschiede zu sehen:

[[email protected] ~]# ab -n 5000 -c 500 https://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, https://www.zeustech.net/
Licensed to The Apache Software Foundation, https://www.apache.org/
Benchmarking localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software:        nginx/1.10.1
Server Hostname:        localhost
Server Port:            80
Document Path:          /
Document Length:        3698 bytes
Concurrency Level:      500
Time taken for tests:   0.758 seconds
Complete requests:      5000
Failed requests:        0
Write errors:           0
Total transferred:      19660000 bytes
HTML transferred:       18490000 bytes
Requests per second:    6593.48 [#/sec] (mean)
Time per request:       75.832 [ms] (mean)
Time per request:       0.152 [ms] (mean, across all concurrent requests)
Transfer rate:          25317.93 [Kbytes/sec] received
Connection Times (ms)
min  mean[+/-sd] median   max
Connect:        0    6  11.0      2      53
Processing:     5   19   8.2     17      53
Waiting:        0   18   8.2     16      47
Total:         10   25  17.4     18      79
Percentage of the requests served within a certain time (ms)
50%     18
66%     21
75%     21
80%     22
90%     69
95%     73
98%     75
99%     76
00%     79 (longest request)
[[email protected] ~]#

Beeindruckend, nicht wahr?

Nginx hat 6593 Anfragen pro Sekunde bearbeitet – ein klarer Gewinner!

Dieser Vergleich gibt Ihnen einen ersten Eindruck, welcher Server besser für Ihre Webanwendung geeignet sein könnte.

Der oben gezeigte Test wurde auf CentOS 6.8, 64 Bit durchgeführt. Sie können verschiedene Betriebssystem- und Webserverversionen testen, um die optimalen Ergebnisse zu erzielen.

Weitere Lasttest-Tools

Wenn ApacheBench nicht Ihren Bedürfnissen entspricht, gibt es viele weitere Tools für HTTP-Lasttests:

Siege

Siege ist ein HTTP-Lasttest-Dienstprogramm für UNIX-basierte Systeme. Es ermöglicht Tests mit mehreren URLs, die in einer Textdatei gespeichert sind. Siege kann mit yum installiert werden:

# yum install siege

Führen wir einen Test mit 500 gleichzeitigen Anfragen für 5 Sekunden durch:

[[email protected] ~]# siege -q -t 5S -c 500 https://localhost/
Lifting the server siege...      done.
Transactions:                       4323 hits
Availability:               100.00 %
Elapsed time:                       4.60 secs
Data transferred:        15.25 MB
Response time:                    0.04 secs
Transaction rate:       939.78 trans/sec
Throughput:                         3.31 MB/sec
Concurrency:                      37.97
Successful transactions:        4323
Failed transactions:                0
Longest transaction:            1.04
Shortest transaction:            0.00
[[email protected] ~]#

Erläuterung der Parameter:

  • -q: Stiller Modus (keine Detailausgabe).
  • -t: Dauer des Tests (5 Sekunden).
  • -c: Anzahl der gleichzeitigen Anfragen (500).

Wie Sie sehen, beträgt die Verfügbarkeit 100 % und die Reaktionszeit 0,04 Sekunden. Sie können die Parameter an Ihre spezifischen Anforderungen anpassen.

Ali

Ali ist ein modernes Lasttest-Tool für Echtzeitanalysen. Es unterstützt die Installation auf verschiedenen Plattformen, einschließlich Docker. Nach der Installation können Sie mit „ali“ die Nutzungsdetails anzeigen:

[email protected]:~# ali
no target given
Usage:
  ali [flags] <target URL>

Flags:
  -b, --body string         A request body to be sent.
  -B, --body-file string    The path to file whose content will be set as the http request body.
      --debug               Run in debug mode.
  -d, --duration duration   The amount of time to issue requests to the targets. Give 0s for an infinite attack. (default 10s)
  -H, --header strings      A request header to be sent. Can be used multiple times to send multiple headers.
  -k, --keepalive           Use persistent connections. (default true)
  -M, --max-body int        Max bytes to capture from response bodies. Give -1 for no limit. (default -1)
  -m, --method string       An HTTP request method for each request. (default "GET")
  -r, --rate int            The request rate per second to issue against the targets. Give 0 then it will send requests as fast as possible. (default 50)
  -t, --timeout duration    The timeout for each request. 0s means to disable timeouts. (default 30s)
  -v, --version             Print the current version.

Examples:
  ali --duration=10m --rate=100 https://host.xz

Author:
  Ryo Nakao <[email protected]>
[email protected]:~#

Wie Sie sehen, bietet Ali viele Optionen, wie HTTP-Header, Testdauer, Ratenbegrenzung und Timeout. Ein kurzer Test mit wdzwdz Tools zeigt diese Ausgabe. Der Bericht ist interaktiv und bietet detaillierte Latenzinformationen.

Gobench

Gobench ist ein einfaches, in der Programmiersprache Go geschriebenes Lasttest-Tool. Es kann mehr als 20.000 gleichzeitige Nutzer simulieren, was ApacheBench nicht leisten kann.

Apache JMeter

JMeter ist ein beliebtes Open-Source-Tool zur Messung der Leistung von Webanwendungen. Es ist eine Java-basierte Anwendung und kann nicht nur Webserver, sondern auch PHP, Java, ASP.net, SOAP, REST usw. testen. JMeter hat eine benutzerfreundliche GUI und benötigt ab Version 3.0 Java 7 oder höher. Es ist eine gute Wahl, wenn Sie die Leistung Ihrer Webanwendung optimieren möchten.

wrk

wrk ist ein weiteres modernes Tool zur Leistungsmessung. Es liefert Details zu Latenz, Anfragen pro Sekunde, Datendurchsatz und mehr. Mit wrk können Sie Lasttests mit mehreren Threads durchführen. Ein Beispiel für einen 5-minütigen Test mit 500 gleichzeitigen Nutzern und 8 Threads:

wrk –t8 –c500 -d300s https://localhost

Autocannon

Inspiriert von wrk ist Autocannon in Node.js geschrieben. Es kann programmatisch über eine API oder als eigenständiges Dienstprogramm genutzt werden. Es bietet eine Vielzahl von Optionen zur Steuerung von Verbindungen, Anfragen, Dauer, Workern, Timeouts und Verbindungsraten.

Curl-Loader

Curl-Loader ist in C geschrieben und simuliert Anwendungslasten mit SSL/TLS-Unterstützung. Neben Webseiten können auch FTP-Server getestet werden. Sie können einen Testplan mit einer Mischung aus HTTP, HTTPS, FTP und FTPS in einer einzigen Konfiguration erstellen.

httperf

httperf ist ein leistungsstarkes Tool für Benchmarks auf Mikro- und Makroebene mit Unterstützung für HTTP/1.1 und SSL. Um zu testen, ob Ihr Server eine bestimmte Anzahl von Anfragen bewältigen kann, können Sie folgenden Befehl nutzen:

httperf --server localhost --port 80 --num-conns 1000 --rate 100

Dieser Befehl führt einen Test mit 100 Anfragen pro Sekunde für 1000 HTTP-Anfragen durch.

Tsung

Tsung ist ein verteiltes Stresstest-Tool für verschiedene Protokolle, einschließlich HTTP, SOAP, PostgreSQL, LDAP, XAMP und MySQL. Es unterstützt HTTP/1.0 und HTTP/1.1 und kümmert sich automatisch um Cookies. Tsung bietet auch Berichtsfunktionen.

Fazit

Ich hoffe, diese Übersicht über Benchmarking-Tools hilft Ihnen bei der Einschätzung der Leistung Ihres Webservers, sodass Sie die beste Wahl für Ihr Projekt treffen können. Denken Sie daran, die Leistung Ihrer Website regelmäßig zu überwachen.