netcoffee.pl*po godzinach - reaktywacja

Ten blog jest kontynuacją bloga dostępnego ongiś pod adresem netcoffee.pl/pogodzinach.
Artykuły, które na to zasługują są przenoszone do nowej wersji bloga. Pozostałe wkrótce znikną.

2006-02-11

Kontrola wydajności - Apache Benchmark

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