Wie leistungsfähig ein Webserver im aktiven Projekteinsatz ist,hängt von unterschiedlichen Faktoren sowohl im Hardware- als auch Softwarebereich ab. Bereits kleine Änderungen an den einen oder anderen Komponenten beeinflussen die Performance. Mit Hilfe von entsprechenden Programmen lässt sich die Serverperformance testen und analysieren. Dieser Artikel befasst sich speziell mit dem Jmeter Test und Apache Benchmark Test.
Apache Benchmarks (Leistungstest)
Apache kommt mit einen eigenen Programm für Lasttests: ab (Apache Benchmark). Die Anwendung ist nicht nur für Linux/UNIX-Systemen verfügbar und ist relativ einfach einzusetzen. Man startet das Kommandozeilen Programm mit folgenden Parametern:
ab -n500 -c5 http://example.com/
- “-n 500” legt fest, dass 500 Anfragen (Requests) abgefeuert werden
- “-c 5” legt fest, dass 5 Anfragen gleichzeitig abgefeuert werden
- Mit dritten Parameter wird hier die URL angegeben, auf welche der Tests angewandt werden soll. Wichtig: wenn nur die Domain (also ohne Skriptangaben) verwendet wird, muss ein abschließender Slash angegeben werden.
Zum obigen Beispiel erhält man folgendes Ergebnis:
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking example.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Finished 500 requests
Server Software: BigIP
Server Hostname: example.com
Server Port: 80
Document Path: /
Document Length: 0 bytes
Concurrency Level: 5
Time taken for tests: 44.918 seconds
Complete requests: 500
Failed requests: 0
Write errors: 0
Non-2xx responses: 500
Total transferred: 61500 bytes
HTML transferred: 0 bytes
Requests per second: 11.13 [#/sec] (mean)
Time per request: 449.183 [ms] (mean)
Time per request: 89.837 [ms] (mean, across all concurrent requests)
Transfer rate: 1.34 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 197 225 13.3 224 381
Processing: 198 222 9.0 221 263
Waiting: 196 222 8.6 221 258
Total: 394 448 19.2 446 599
Percentage of the requests served within a certain time (ms)
50% 446
66% 453
75% 458
80% 463
90% 470
95% 475
98% 482
99% 487
100% 599 (longest request)
Daraus kann man entnehmen, dass 11,13 Anfragen in der Sekunde erreicht wurden. 95% aller Anfragen wurde in 475ms ausgeliefert.
Es gibt eine ganze Reihe von Optionen. Hier liste ich mal alle Parameter, die mit ab
zur Verfügung stehen auf:
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make
-t timelimit Seconds to max. wait for responses
-b windowsize Size of TCP send/receive buffer, in bytes
-p postfile File containing data to POST. Remember also to set -T
-T content-type Content-type header for POSTing, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-h Display usage information (this message)
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol (SSL2, SSL3, TLS1, or ALL)
Eine weiterführende Dokumentation befindet sich auf der Website der Apache Software Foundation.
Aussagekraft eines Tests
Ein Test ist nur aussagekräftig, wenn man auch die Rahmenbedingungen zum Tests angibt:
- welche Hardwareumgebung wird verwendet (Prozessor, Speicherkapazität, Festplatten, u.s.w.)
- welche Softwareumgebung wird eingesetzt (Windows, Linux, PHP Version, Apache Version, MySQL, u.s.w.)
- welche Projekt Frameworks / Module wurden verwendet (z.B. Drupal Version, aktivierte Module mit Drupal)
Jmeter Tests
Jmeter ist ein Java Programm mit einem grafischen Benutzer-Interface. Mit Hilfe dieser Anwendung testet man die die Performance sowohl von statischen als auch dynamischen Komponenten (Dateien, Servlets, Perl Skripete, Javaobjekte, Datenbanken und Abfragen, FTP Server etc.). Es ist möglich die Last und Performance verschiedener Servertypen zu testen wie etwa:
- Web - HTTP, HTTPS
- SOAP
- LDAP
- JMS
- Mailserver - SMTP(S), POP3(S), IMAP(S)
- Native commands or shell scripts
Die ganze Konfiguration erfolgt über die grafische Oberfläche. Die Ausführung des Tests kann dann wahlweise über die GUI oder über die Kommandozeile durchgeführt werden. Mit Jmeter ist es sehr einfach Klickpfade des Benutzers anzulegen, oder auch über einen HTTP Proxy aufzuzeichnen. Oft wird bei Tests zwischen nicht-angemeldeten und angemeldeten Besuchern unterschieden, wofür ein Cookie gespeichert werden muss. Auch dies ist mit jmeter möglich.