Wednesday, October 5, 2011

Testowanie wydajności serwera Apache

Posiadasz serwer HTTP Apache, który po prostu działa i nigdy wcześniej nie musiałeś przejmować się kwestią wydajności, aż do dziś? Jeżeli tak to przyda Ci się narzędzie do testowania wydajności serwera HTTP.

Ten wpis nie jest o tym, jak poprawić wydajność serwera Apache czy MySQL, lecz o tym jak przetestować maksymalne obciążenie serwera Apache oraz pośrednio bazy danych i skryptów PHP. Niemniej jednak wspomnę o pewnych ustawienia dot. wydajności tych serwerów.

Więc, gdy już staniesz przed zadaniem polegającym na oszacowaniem, czy Twój serwer sprosta określonemu zadaniu czas zapoznać się z co najmniej jednym narzędziem przeznaczonym to testowania jego wydajności. Ponieważ mowa tu o konkretnym serwerze jakim jest Apache, to najlepszym wyborem będzie narzędzie ab (skrót od ApacheBench).

ApacheBench możemy zainstalować w systemie Debian instalując paczkę apache2-utils. Dobrze jest te same testy wykonać bezpośrednio z samego serwera (czyli testujemy sam serwer) oraz ze zdalnego hosta, gdzie do testu wydajności serwera zostanie wkomponowana wydajność łącza, którym posługuje się serwer.

Najciekawszymi opcjami programu ab są parametry:
-c - określa ilość jednoczesnych zapytań
-t - określa czas trwania testu
-n - określa całkowitą ilość zapytań, które mają zostać wysłane

Serwer można testować na różne sposoby. Możemy kazać mu obsłużyć np. 2 tyś. zapytań i patrzeć ile mu to zajmie czasu (z określaniem ilości maksymalnych połączeń lub bez). Taki test ma następująca składnię:

ab -c 150 -n 200 <adres serwera>

Wynik takiego testu odpowie na pytanie ile czasu zajmie dla serwera obsłużenie 200 zapytań przy założeniu, że maksymalna ilość jednoczesnych zapytań nie będzie większa niż 150.

grzesiek@home:~$ ab -c 150 -n 200 http://abc.defgh.pl/sklep/
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 abc.defgh.pl (be patient)
Completed 100 requests
Completed 200 requests
Finished 200 requests


Server Software:        Apache
Server Hostname:        abc.defgh.pl
Server Port:            80

Document Path:          /sklep/
Document Length:        4180 bytes

Concurrency Level:      150
Time taken for tests:   27.192 seconds
Complete requests:      200
Failed requests:        0
Write errors:           0
Total transferred:      929000 bytes
HTML transferred:       836000 bytes
Requests per second:    7.36 [#/sec] (mean)
Time per request:       20393.908 [ms] (mean)
Time per request:       135.959 [ms] (mean, across all concurrent requests)
Transfer rate:          33.36 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       56  652 1002.6    189    3453
Processing:  1039 14081 7456.0  16816   26197
Waiting:      991 10618 5224.2  12306   21415
Total:       1100 14733 7740.0  19039   26429

Percentage of the requests served within a certain time (ms)
  50%  19039
  66%  20760
  75%  21232
  80%  21387
  90%  22152
  95%  23612
  98%  23821
  99%  24356
 100%  26429 (longest request)


Z przedstawionego wydruku wynika, że 27 sekund.

Drugim sposobem testowania może być test, który sprawdza ile zapytań serwer zdoła obsłużyć np. w czasie 3 minut przy założeniu, że maksymalna ilość jednoczesnych połączeń  nie będzie większa niż 300. Oto przykład:

ab -c 300 -t 300  <adres serwera>

Oczywiście podane w przykładach obciążenia są przesadzone, chyba że posiadasz bardzo dobre łącze.

Poza ab watro również zainteresować się programem httperf, który potrafi wykonywać testy z obciążeniem podobnym do rozkładu Poissona oraz http_load. Ten ostatni pod Debianem należy samemu skompilować.

http://httpd.apache.org/docs/2.0/programs/ab.html
http://www.hpl.hp.com/research/linux/httperf/
http://acme.com/software/http_load/