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/

5 comments:

  1. A jak to się ma do kilku serwerów wirtualnych. Np. na jednej maszynie stoi apache z 15 wirtualnymi serwerami. Jak sprawdzić średnią wydajność?

    ReplyDelete
  2. Nadal korzystają ze wspólnych zasobów maszyny, to że w konfiguracji jest 15 "Virtual Host", rozumiem że o to chodzi, nie zmienia to faktu, że obsługuje je ten sam demon apache.
    Krótko mówiąc w takim przypadku wydajność serwera nie jest dzielona po równo dla każdej np. domeny. Jeżeli pierwsza domena zajmie serwer na 100% to pozostałe będą zapchane.
    Natomiast czy da się temu zaradzić - nie wiem. Znając życie jakoś się da, tylko czy to nadal będą "Virtual Host"?

    ReplyDelete
  3. "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." W końcu ktoś to po ludzku wyjaśnił. Dzięki! :)

    ReplyDelete
  4. Malutkie pytanie. Czy wg. kolegów wynik takiego testu jest wystarczający aby założyć że serwer wytrzyma natężenie klientów?

    ReplyDelete
  5. Ten tekst to tylko wskazówka, a nie kompletne rozwiązanie.
    Możnaby powiedzieć: tak wystarczy, pod warunkiem, że warunki panujące w systemie się nie zmienią - czego pewnym być nie możesz :)
    Ale jak doliczysz do tego jakieś 20% zapasu i dobrze przeanalizujesz zużycie zasobów w systemie to jaknajbardziej.

    ReplyDelete