Niejednokrotnie wprowadzamy rozwiązania, co do wydajności których nie możemy być pewni. Warto jest wówczas skorzystać z narzędzia pozwalającego na jej kontrolę. Moim ulubionym narzędziem jest Apache Benchmark (ab.exe), dostępny razem z dystrybucją serwera Apache.
AB (Apache Benchmark) pozwala na wielokrotne wywołanie URL i przygotowuje statystyki czasu wykonania.
Program wywołujemy z linii poleceń, jego najważniejsze parametry to:
- n - ilość zapytań
- c - ilość zapytań w tym samym czasie
- k - wymusza użycie stałego połączenia - HTTP KeepAlive
Przykładowe wywołanie może mieć postać:
ab.exe -n100 -c100 -k http://www.example.org/ab_test.php
Spowoduje ono pobranie pliku ab_test.php z serwera www.example.org 100 razy, przy czym w jednym czasie będą przeprowadzane 3 połączenia.
Podczas testowania wydajności skryptów, warto pamiętać o włączeniu opcji stałego połączenia HTTP (parametr -k). Dzięki temu, czasy nawiązywania połączeń z serwerem nie wpłyną znacząco na wyniki. Jeżeli natomiast testujemy ogólną wydajność serwera oraz jego dostępność z innych sieci, warto pozostawić domyślne ustawienie.
Przykładowe wyniki działania Apache Benchmark:
Wynik 1
This is ApacheBench, Version 2.0.40-dev <
$Revision: 1.121.2.8 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,
http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation,
http://www.apache.org/
Benchmarking xxxxxxxxxxxxxxx (be patient).....done
Server Software: Apache/2.0.49
Server Hostname: xxxxxxxxxxxxxxx
Server Port: 80
Document Path: /xxxxxxxxxxxxxxx/normal.php
Document Length: 7496 bytes
Concurrency Level: 3
Time taken for tests: 6.879892 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 766700 bytes
HTML transferred: 749600 bytes
Requests per second: 14.54 [#/sec] (mean)
Time per request: 206.397 [ms] (mean)
Time per request: 68.799 [ms]
(mean, across all concurrent requests)
Transfer rate: 108.72 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 5.2 0 30
Processing: 130 196 38.3 190 310
Waiting: 90 172 41.0 160 300
Total: 130 198 38.5 190 310
Percentage of the requests served within a certain time (ms)
50% 190
66% 210
75% 220
80% 230
90% 260
95% 270
98% 300
99% 310
100% 310 (longest request)
Wynik 2
This is ApacheBench, Version 2.0.40-dev <
$Revision: 1.121.2.8 $> apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,
http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation,
http://www.apache.org/
Benchmarking xxxxxxxxxxxxxxx (be patient).....done
Server Software: Apache/2.0.49
Server Hostname: xxxxxxxxxxxxxxx
Server Port: 80
Document Path: /xxxxxxxxxxxxxxx/normal.php
Document Length: 7496 bytes
Concurrency Level: 3
Time taken for tests: 5.988612 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 766700 bytes
HTML transferred: 749600 bytes
Requests per second: 16.70 [#/sec] (mean)
Time per request: 179.658 [ms] (mean)
Time per request: 59.886 [ms]
(mean, across all concurrent requests)
Transfer rate: 124.90 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 4.7 0 20
Processing: 90 168 48.7 160 350
Waiting: 70 144 50.3 140 330
Total: 90 170 48.5 160 350
Percentage of the requests served within a certain time (ms)
50% 160
66% 180
75% 190
80% 210
90% 230
95% 260
98% 330
99% 350
100% 350 (longest request)
W obu przypadkach testowany był jeden skrypt PHP. Podczas pierwszego testu, skrypt łączył się z serwerem MySQL za pomocą funkcji mysql_connect(). Podczas drugiego testu, skrypt został zmodyfikowany tak, aby do połączenia z serwerem MySQL używał funkcji mysql_pconnect() która otwiera stałe połączenie z serwerem MySQL. Jak widać, użycie stałego połączenia z bazą przyspieszyło stukrotne wykonanie skryptu o 0,89 sekundy.
Polecam uwadze