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)
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/
A jak to się ma do kilku serwerów wirtualnych. Np. na jednej maszynie stoi apache z 15 wirtualnymi serwerami. Jak sprawdzić średnią wydajność?
ReplyDeleteNadal 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.
ReplyDeleteKró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"?
"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! :)
ReplyDeleteMalutkie pytanie. Czy wg. kolegów wynik takiego testu jest wystarczający aby założyć że serwer wytrzyma natężenie klientów?
ReplyDeleteTen tekst to tylko wskazówka, a nie kompletne rozwiązanie.
ReplyDeleteMoż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.