JMeter – współbieżne testowanie przy użyciu wielu serwerów

Categories Artykuły, Jak to zrobić

Aby bardziej urealnić wyniki testów wydajnościowych, warto przeprowadzać je z wielu niezależnych od siebie lokalizacji. Oczywiście, można w tym celu wykorzystać N serwerów VPS a na każdym z nich uruchomić dowolne narzędzie generujące ruch do testowanej lokalizacji jednak w jaki sposób koordynować takie działania? Bardzo dobrym rozwiązaniem okazuje się tutaj JMeter.

Środowisko

Aby przeprowadzić testy wielu lokalizacji jednocześnie, musimy mieć przygotowane odpowiednie środowiska:

  • Serwer kliencki z zainstalowaną maszyną Java do obsługi JMeter’a
  • Serwery wykonujące testy z zainstalowaną maszyną Java do obsługi JMeter’a

W moim przypadku serwerem klienckim będzie mój komputer podpięty do sieci działający pod kontrolą Ubuntu 14.04 oraz zainstalowaną maszyną Java w wersji build 1.8.0_66-b17. Na czas przeprowadzania testów konieczne jest upewnienie się, że ruch sieciowy na portach, których będziemy używali do komunikacji z serwerami nie jest blokowany.

W przypadku serwerów służących do przeprowadzania testów skorzystam z oferty DigitalOcean, a konkretniej dwóch dropletów rozliczanych za każdą godzinę pracy. Jest to o tyle wygodne rozwiązanie, że w bardzo krótkim czasie dostajemy gotowe i skonfigurowane systemy z własnym adresem IP, znajdujące się w wybranej przez nas lokalizacji, których koszt zależy od czasu przeprowadzania testów.

Tworzenie i konfiguracja dropletów

W celu stworzenia dropletów na DigitalOcean konieczne jest posiadanie u nich zarejestrowanego konta. Rozliczanie odbywa się na zasadzie prepaid, a więc konieczne będzie dokonanie wpłaty niewielkiej kwoty, która posłuży do opłacenia czasu działania serwerów.

W momencie gdy konto jest gotowe, przystępujemy do tworzenia pierwszego dropletu. W tym celu wybieramy opcję „Create Droplet” oraz określamy parametry:

  • nazwa: jmeter-demo-1
  • rozmiar planu wyceniony na 0.015 dolara za godzinę pracy,
  • serwer znajdujący się w lokalizacji: Amsterdam 3
  • jako system operacyjny decyduję się na Ubuntu 14.04 x64
  • podpinam swój klucz SSH, aby móc połączyć się z serwerem

Kiedy wszystko jest gotowe potwierdzam tworzenie dropletu, i po około 1 minucie dostaję informacje, że mój system jest już gotowy do użycia.

Digital Ocean - ready droplet
Rys 1. Informacje o droplecie w DigitalOcean

Aby podłączyć się do naszego nowego serwera, konieczne jest dodanie odpowiedniego wpisu do konfiguracji połączeń SSH aktualnego użytkownika. A więc dopisuję do pliku ~/.ssh/config

Jeżeli wszystko zostało poprawnie skonfigurowane, nie powinienem mieć żadnych problemów aby podłączyć się do mojego nowego dropletu:

Po zalogowaniu się na serwerze, konieczna jest instalacja maszyny Java (wymaga tego JMeter), a więc instaluje ją, pamiętając, że jestem zalogowany jako root:

Po zainstalowaniu Javy przystępuję do pobrania JMetera:

W tej chwili mamy już gotowy droplet wraz z JMeterem oraz Javą, niezbędną do jego obsługi.

Analogicznie postępujemy aby utworzyć drugi, trzeci, czwarty i N-ty serwer, który posłuży nam jako serwer podczas testów. ja skorzystam z dwóch:

  • jmeter-demo-1
  • jmeter-demo-2

 Konfiguracja połączenia JMeter klient – serwery

Podczas komunikacji klienta z serwerem zestawiane są trzy połączenia.

JMeter - client - server
Rys 2. Połączenia JMeter pomiędzy klientem a serwerem

Pierwsze z nich to połączenie JMeter’a służące do komunikacji i zawsze nawiązywane jest przez klienta. Dwa pozostałe to połączenia TCP służące do zdalnego wywoływania metod (RMI) i są w tym przypadku specyficzne dla Javy.

Bardzo często zdarza się, że klient (a nawet któryś z serwerów), mogą znajdować się za NAT. Wówczas zestawienie takich połączeń może być bardzo trudne do skonfigurowania a wręcz niemożliwe. Można wybrnąć z tego problemu korzystając z techniki przekierowywania portów SSH.

Przekierowywanie portów SSH dla JMeter

Jak już wspomniałem poprzednio, do skonfigurowania połączenia JMeter klient – serwer, konieczne są trzy połączenia. Potrzebne są zatem trzy tunele, które zrealizują te połączenia. ja skorzystałem z odblokowanych portów 2400x, 2500x oraz 2600x

  1. port 24000 dla połączenia JMeter
  2. port 25000 dla połączenia RMI od serwera do klienta
  3. port 26000 dla połączenia RMI od klienta do serwera

Należy przy tym pamiętać, że połączenie JMeter (1) oraz RMI od klienta do serwera (3), musi dotyczyć unikalnego numeru portu dla każdego serwera. Inaczej wygląda port RMI służący do komunikacji w kierunku serwer – klient. W tym przypadku wszystkie serwery mogą komunikować się z klientem, który nasłuchuje na jednym tylko porcie.

jmeter_ssh_forwarding
Rys 3. Przekierowywanie portów SSH dla JMeter

Aby osiągnąć taki stan wystarczy odpowiednio skonfigurować przekierowanie portów przez tunel SSH:

Po podłączeniu się do serwera, wszystkie połączenia na tych portach będą odpowiednio przekierowywane.

Konfiguracja klienta JMeter

Wiemy już jak będzie wyglądała komunikacja pomiędzy klientem a serwerem, czas odpowiednio skonfigurować JMeter.

Konfiguracja znajduje się w pliku bin/jmeter.properties i od niego zaczniemy, ustawiając:

Gdzie:

  • remote_hosts – informuje JMeter o wszystkich serwerach, które będą służyły do uruchomienia testów
  • client.rmi.localport – numer portu, na który będą przychodziły odpowiedzi z serwerów do klienta
  • mode – bardzo ważny parametr określający sposób wysyłania odpowiedzi z serwerów do klienta. JMeter oferuje wiele różnych sposobów wysyłania odpowiedzi. Wybór odpowiedniego ma duże znaczenie na wydajność komunikacji pomiędzy serwerami a klientem.

Konfiguracja serwerów JMeter

Po skonfigurowaniu klienta, konieczna jest konfiguracja wszystkich serwerów. W tym celu logujemy się przez ssh na każdy z nich oraz przechodzimy do konfiguracji JMetera, która znajduje się w tym samym pliku co w przypadku klienta (bin/jmeter.properties), pamiętając o tym, aby wpisać odpowiednie porty dla każdego z serwerów.  

Gdzie:

  • server_port – na tym porcie serwer będzie nasłuchiwał połączenia od klienta
  • server.rmi.localport – na tym porcie serwer będzie nasłuchiwał połączeń RMI

Uruchomienie testów z wielu serwerów

Aby uruchomić testowanie logujemy się na wszystkie serwery konfigurując przekierowywanie portów (jak opisałem poprzednio), oraz uruchamiam wszędzie JMetera w trybie serwera:

jeżeli wszystko jest skonfigurowane poprawnie, powinniśmy zobaczyć informację podobną do:

oznacza to, że serwer jest gotowy do przyjęcia komunikatów od klienta.

Po uruchomieniu wszystkich serwerów przechodzimy do uruchomienia aplikacji klienta. W tym celu korzystamy z:

Po uruchomieniu GUI, gdy wszystko mamy skonfigurowane poprawnie, JMeter sam rozpozna możliwość przeprowadzania testów z wielu serwerów.

JMeter - remote options
JMeter – Testowanie przy użyciu wielu serwerów

Podumowanie

Przy użyciu narzędzia JMeter możliwe jest przeprowadzenie testów wydajnościowych przy użyciu N serwerów realizujących plany testowe. Należy przy tym jednak pamiętać o ograniczeniach jakie niesie ze sobą odbieranie tak dużej ilości danych a już tym bardziej przetwarzanie w czasie rzeczywistym wyników testów.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*