ApacheBench – program, który został stworzony do wykonywania testów wydajnościowych serwerów HTTP, a w szczególności serwera Apache. „Jest to prosty klient protokołu HTTP, którego jedynym zadaniem jest wydawanie powtarzających się żądań pod adresem serwera. Żądania te spełniają szereg kryteriów, które możemy definiować. (...) Z uwagi na to, że jest to klient uniwersalny, można go użyć nie tylko do testowania serwera Apache, ale także do badania wydajności dowolnego innego serwera WWW.”[1] Program ten jest dystrybuowany jako element serwera Apache.

Poniższe informacje zostały opracowane na podstawie ab w wersji 2.0.40-dev (Revision: 1.146).

Sposób użycia edytuj

Najprostszy sposób użycia tego programu polega na podaniu adresu, który ma zostać pobrany, jako parametru. Adres ten powinien składać się przynajmniej z nazwy hosta zakończonej ukośnikiem (ukośnik będzie w tym przypadku stanowił ścieżkę do zasobu na serwerze; w przypadku jego braku zostanie wyświetlony komunikat błędu invalid URL):

ab example.com/

Oczywiście nic nie stoi na przeszkodzie, aby podać również określenie protokołu oraz port:

ab http://example.com:80/

Wykonanie dowolnego z powyższych poleceń spowoduje wykonanie jednego żądania HTTP na serwerze example.com i wyświetlenie statystyk dla niego. Jest to wystarczające, aby sprawdzić, czy serwer jest aktywny i generuje poprawne odpowiedzi, jednak zbyt mało, by wysnuć jakiekolwiek wnioski na temat statystyk jego pracy. W celu otrzymania reprezentatywnej próby niezbędne jest podanie dodatkowych parametrów. Za pomocą przełącznika -n możemy określić liczbę żądań do wykonania. Domyślnie są one wykonywane jedno po drugim, jednak podając dodatkowo parametr -c można uruchomić kilka równoległych wątków, które będą odpytywać serwer w tym samym czasie. Dla przykładu komenda

ab -n 100 -c 10 http://example.com/

spowoduje stukrotne pobranie strony spod adresu http://example.com/, przy czym jednocześnie będzie wykonywanych maksymalnie 10 żądań.

Jeśli całkowita liczba żądań (parametr -n) będzie większa niż 150, program ab po wykonaniu każdych stu z nich będzie wyświetlał na standardowym wyjściu błędów informacje o postępach, np. Completed 100 requests. Komunikaty te pozwalają na bieżąco orientować się w przebiegu testów. Istnieje możliwość wyłączenia ich za pomocą parametru -q.

Odczytywanie wyników pomiarów edytuj

Po przeprowadzeniu nakazanych testów, program ab wyświetla raport, który może wyglądać podobnie do poniższego:

Server Software:        Apache/2.2.3
Server Hostname:        example.com
Server Port:            80

Document Path:          /
Document Length:        438 bytes

Concurrency Level:      10
Time taken for tests:   111.737800 seconds
Complete requests:      110
Failed requests:        0
Write errors:           0
Total transferred:      77110 bytes
HTML transferred:       48180 bytes
Requests per second:    0.98 [#/sec] (mean)
Time per request:       10157.982 [ms] (mean)
Time per request:       1015.798 [ms] (mean, across all concurrent requests)
Transfer rate:          0.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:      183 4386 8433.4    188   21186
Processing:   188  208  72.0    189     844
Waiting:      185  205  71.9    186     840
Total:        375 4595 8424.6    379   21383

Percentage of the requests served within a certain time (ms)
  50%    379
  66%    387
  75%    520
  80%  21361
  90%  21367
  95%  21369
  98%  21370
  99%  21375
 100%  21383 (longest request)

Zawiera on informacje takie jak:

  • nazwa i wersja oprogramowania serwera
  • nazwa hosta i port, z którym łączy się program, a także ścieżka do żądanego zasobu
  • wielkość pobieranego pliku
  • liczba wykonywanych równocześnie żądań – Concurrency Level (jest to zawsze wartość podana w parametrze -c i nie mówi ona nic o faktycznej ilości żądań, które serwer jest w stanie obsłużyć równocześnie)
  • całkowity czas, jaki był potrzebny na przeprowadzenie testów – Time taken for tests
  • ilość zakończonych poprawnie żądań – Complete requests
  • ilość żądań, które zakończyły się niepowodzeniem – Failed requests
  • liczba błędów zapisu – Write errors
  • całkowita liczba przesłanych bajtów – Total transferred – obejmuje ona również rozmiar nagłówków
  • liczba bajtów, z których składają się same pobrane pliki. Określenie „HTML transferred” użyte przez twórców programu może być mylące, ponieważ nie zawsze pobierane są dokumenty HTML. Mogą to być obrazki, filmy czy innego rodzaju pliki binarne, które nie mają nic wspólnego z językiem HTML, a ich rozmiar również będzie wyświetlony w tym miejscu.
  • średnia liczba żądań wykonanych w ciągu sekundy – Requests per second
  • średni czas wykonania jednego żądania – Time per request
  • średni czas wykonania zapytania przy uwzględnieniu tego, że zapytania wykonywane są równocześnie. Jeśli będziemy wykonywać 10 zapytań jednocześnie i czas wykonania ich wszystkich wyniesie 20 sekund, to zostanie w tym miejscu wyświetlony czas 2 sekundy, nawet jeśli tak naprawdę każde z zapytań trwało 20 sekund. W praktyce podawany jest tutaj zawsze średni czas żądania podzielony przez liczbę żądań wykonywanych równocześnie.
  • średni transfer w kilobajtach na sekundę – Transfer rate

Po nich następuje tabela z zestawieniem czasów. Wyszczególnione zostały w niej minimalne wartości, średnie arytmetyczne (z odchyleniami standardowymi), mediany oraz maksymalne wartości dla następujących czasów:[2]

  • Connect – czas oczekiwania na nawiązanie połączenia z serwerem (w przypadku połączeń keep-alive może on być zerowy)
  • Processing – czas od nawiązania połączenia z serwerem aż do zakończenia pobierania całego dokumentu i zamknięcia połączenia
  • Waiting – czas od zakończenia wysyłania żądania do serwera (tzn. od zakończenia wysyłania nagłówków HTTP) do odebrania pierwszych bajtów odpowiedzi serwera (tzn. odebrania początku dokumentu). Jest to czas, w którym serwer generuje odpowiedź (następuje wtedy całe przetwarzanie po stronie serwera, działają skrypty CGI, PHP i inne).
  • Total – suma czasów Connect i Processing, czyli czas od momentu rozpoczęcia nawiązywania połączenia aż do jego zamknięcia.

Ostatnia część raportu jest zatytułowana „Ilość żądań wykonana w określonym czasie”. Dodać należy, że jest to czas względem najdłuższego żądania. Podawane jest, ile żądań trwało mniej lub tyle samo, ile wynosi połowa czasu najdłuższego żądania. Następnie to samo jest podawane dla czasu stanowiącego 66% czasu najdłuższego żądania, 75%, 80%, 90% itd. Ten fragment raportu można wyłączyć za pomocą przełącznika -d.

Omówienie parametrów edytuj

Poza parametrami wymienionymi powyżej, ApacheBench można dostosować do potrzeb użytkownika również za pomocą następujących przełączników:

  • -A użytkownik:hasło – wysyła do serwera podaną nazwę użytkownika i hasło. Pozwala to na zalogowanie się na serwerze, który wspiera podstawowy sposób uwierzytelniania protokołu HTTP (BASIC Authentication). Podane informacje są wysyłane zawsze, nawet wtedy, gdy serwer ich nie żąda.
  • -c liczba – liczba żądań, które będą wykonywane jednocześnie (domyślnie: jedno); parametr został szerzej omówiony powyżej
  • -C nazwa=wartość – dodanie ciasteczka (cookie) do wysyłanych nagłówków HTTP. Parametr ten można podawać wielokrotnie.
  • -d – wyłączenie wyświetlania tabeli „Percentage of the requests served within a certain time”
  • -e nazwa-pliku-csv – tworzy plik, który w każdej linii zawiera liczbę w postaci procentu oraz czas, w którym wykonał się dany procent wszystkich żądań. Linii jest 100 (wartości od 1% do 100%), a wartości w każdej z nich rozdzielone są przecinkami. Taki typ pliku nazywany jest CSV – Comma Separated Values (wartości rozdzielone przecinkami).
  • -g plik-dla-programu-gnuplot – zapisuje zmierzone czasy dla każdego wykonanego żądania do pliku typu TSV (Tab Separated Values – wartości rozdzielone znakami tabulacji), który może być łatwo zaimportowany do narzędzia do tworzenia wykresów gnuplot oraz innych narzędzi, takich jak IDL, Mathematica, Igor czy Excel. Etykiety wartości znajdują się w pierwszej linii pliku. Dokładniejsze omówienie tego formatu znajduje się w rozdziale „Format pliku TSV” poniżej.
  • -h – wyświetlenie krótkiego opisu i listy parametrów programu
  • -H nagłówek – dopisanie dodatkowego nagłówka do wysyłanego żądania. Argument powinien zostać podany w formie zgodnej z protokołem HTTP, gotowej do bezpośredniego dodania, np. Referer: http://example.com/.
  • -i – wysyła do serwera żądanie HEAD zamiast GET
  • -k – włącza właściwość KeepAlive, która pozwala na wykonywanie wielu żądań HTTP w jednej sesji, bez konieczności rozłączania i ponownego zestawiania połączenia z serwerem. Domyślnie KeepAlive jest wyłączony.
  • -n liczba – liczba żądań do wykonania, parametr został szczegółowo omówiony wyżej. Domyślna wartość to 1.
  • -p plik-post – pozwala na podanie pliku, którego zawartość będzie wysłana jako treść żądania POST. Zawartość pliku zostanie przekazana bez żadnych zmian, zatem jeśli zamierzamy wysłać do serwera zmienne, należy zakodować je zgodnie z dokumentem RFC-1738[3], np. zmienna=wartosc1&druga=wartosc2&trzecia=wartosc3.
  • -P login:hasło – powoduje wysłanie podanego loginu i hasła do serwera proxy, który pośredniczy w połączeniu do serwera WWW. Dane te są kodowane za pomocą algorytmu base64. Program ab wysyła je niezależnie od tego, czy serwer proxy zgłosi taką potrzebę (w postaci nagłówka 407 proxy authentication needed) czy nie.
  • -q – gdy wykonywane jest więcej niż 150 żądań, ab będzie wyświetlał na standardowym wyjściu błędów informację o postępie co 100 żądań. Parametr -q pozwala na wyłączenie tych wiadomości.
  • -s – jeśli ta funkcja jest wkompilowana (czego można się dowiedzieć wywołując polecenie ab -h), zostanie użyte połączenie poprzez protokół HTTPS zabezpieczony SSL zamiast standardowego HTTP. Funkcja ta jest jednak eksperymentalna i oficjalna instrukcja nie zaleca jej używania.
  • -S – zapobiega wyświetlaniu wartości mediany i odchylenia standardowego oraz ostrzeżeń, gdy średnia jest większa od odchylenia standardowego lub mediana jest dwa razy większa od odchylenia standardowego.
  • -t limit_czasu – maksymalna liczba sekund, które ab może wykonywać pomiary. Domyślnie nie ma limitu czasu.
  • -T content-type – typ MIME zawartości przesyłanej w żądaniu POST. Jest on wpisywany do nagłówka Content-type.
  • -v liczba – ustawia dokładność wyświetlanych komunikatów. Podanie liczby 4 lub większej powoduje wyświetlanie informacji o nagłówkach, 3 lub większa wyświetla kody odpowiedzi HTTP, liczba 2 lub większa pokazuje ostrzeżenia i informacje.
  • -V – powoduje wyświetlenie numeru wersji programu ab.
  • -w – wysyła na standardowe wyjście kod HTML tabeli z wynikami. Domyślnie tabela ta ma szerokość dwóch kolumn i białe tło.
  • -x atrybuty – pozwala na ustawienie atrybutów tagu <table> dla tabeli HTML
  • -X adres_serwera_proxy[:port] – używa serwera proxy o podanym adresie do wykonywania żądań
  • -y atrybuty – pozwala na ustawienie atrybutów tagu <tr> dla tabeli HTML
  • -z atrybuty – pozwala na ustawienie atrybutów tagu <td> dla tabeli HTML

Format pliku TSV edytuj

Program ab generuje plik w formacie TSV (Tab Separated Values – wartości rozdzielone znakami tabulacji) przy uruchomieniu z parametrem -e i podaniu nazwy pliku wyjściowego. Plik ten składa się z wierszy. Każdy z nich (począwszy od drugiego) odpowiada jednemu żądaniu i zawiera sześć wartości zmierzonych podczas jego wykonywania. Wartości te są oddzielone od siebie znakami tabulacji (kod 09 w tablicy ASCII) – stąd nazwa formatu pliku. Znaki te sprawiają, że oglądając plik w dowolnym edytorze tekstu widzimy wartości ułożone w sześciu kolumnach. Znaczenie poszczególnych wartości zostało bardzo enigmatycznie wyjaśnione w pierwszej linii pliku. Znajdują się tam nazwy kolumn. Oto one:

  • starttime
  • seconds
  • ctime
  • dtime
  • ttime
  • wait

Niestety, są to wszystkie informacje, które dostajemy od twórców ApacheBench. Nie znajdziemy dodatkowych wyjaśnień ani w oficjalnym podręczniku użytkownika (tzw. manualu), ani w tekstach wyświetlanych przez program. Pozostaje jedynie zajrzeć do kodu tej aplikacji. Po jego analizie można wywnioskować, co dokładnie jest zapisane w pliku TSV:

  • starttime – data i czas rozpoczęcia żądania
  • seconds – wbrew swojej nazwie, kolumna ta zawiera liczbę mikrosekund (nie sekund), które upłynęły od 1 stycznia 1970, godziny 00:00:00 czyli od tzw. Epoki Unixa (ang. Unix Epoch). Liczba ta to odpowiednik tzw. uniksowego znacznika czasu (ang. unix timestamp), który podaje tę samą wartość, ale w sekundach (jest on używany powszechnie w systemach komputerowych do zapisu czasu).
  • ctime – czas nawiązywania połączenia z serwerem
  • dtime – czas od nawiązania połączenia z serwerem do końca żądania (tj. do zamknięcia połączenia)
  • ttime – całkowity czas trwania żądania (tj. od rozpoczęcia nawiązywania połączenia aż do zamknięcia połączenia)
  • wait – czas od zakończenia wysyłania żądania do serwera (tzn. od zakończenia wysyłania nagłówków HTTP) do odebrania pierwszych bajtów odpowiedzi serwera. Jest to czas, w którym klient oczekuje na odpowiedź serwera.

Wszystkie czasy podawane są w milisekundach.

Przypisy edytuj

  1. Peter Wainwright, „Apache 2.0 dla zaawansowanych”, Helion, Gliwice, 2003
  2. Znaczenie tych wartości nie jest podane w oficjalnej dokumentacji programu ab. Zostało ono ustalone na podstawie analizy źródeł programu (źródła te są dystrybuowane w ramach źródeł serwera Apache, które można pobrać ze strony projektu). Wiele wyjaśniają zwłaszcza następujące linie z pliku ab.c: 1261 (w której na podstawie znaczników czasowych zapisywanych podczas komunikacji z serwerem obliczane są wartości czasów Connect, Processing, Waiting i Total) oraz 235 (w której znajdują się komentarze wyjaśniające, co zawierają znaczniki czasowe używane w linii 1261) (podane numery linii dotyczą ab w wersji 2.0.40-dev, revision 1.146).
  3. T. Berners-Lee, L. Masinter, M. McCahill, „Uniform Resource Locators (URL)”, dokument dostępny w wielu miejscach w Internecie, np. http://www.faqs.org/rfcs/rfc1738