Apache Jmeter dziwne wyniki

0

Witam, podczas wysłania 3k per sec req dostaje w miare miarodajne wyniki, natomiast podczas uruchomienia 8k per sec req średni czas odpowiedzi req jest szybszy niz w przypadku probki 3k, na dodatek nie ma żadnego błędu w tej większej próbce.
Wydaje mi się, że program dotarł do granicy i nie jest w stanie stworzyć wiecej uzytkowników na sekunde w tym programie i uruchamia ich sekwencyjnie?
Co może być przyczyną i dlaczego tak się dzieję?

1

Najlepiej pokaż te wyniki bo opisałeś sytuację z lekka chaotycznie.

Masz dwa scenariusze:

  • wysyłasz 3k req/s - serwer obsługuje 3k req/s
  • wysyłasz 8k req/s - serwer obsługuje X req/s, X > 3k, nie podałeś X

W jaki sposób odpalasz test? Czy serwer i JMeter muszą współdzielić zasoby na jednej stacji? Czy monitorujesz zużycie zasobów CPU / pamięci / sieci przez oba? Na jakiej podstawie twierdzisz, że to JMeter dotarł do granicy, a nie serwer nie potrafi obsłużyć więcej requestów? Próbowałeś rozproszyć userów na kilka maszynek, żeby pojedynczy JMeter miał mniej req/s do wystrzelenia by się upewnić, "kto" nie wydala?

0

Co to za program? Zakładam, że testujesz jakiś endpoint HTTP - co on robi? Jaka implementacja serwera? Ile wątków na serwerze?

0
superdurszlak napisał(a):

Najlepiej pokaż te wyniki bo opisałeś sytuację z lekka chaotycznie.

Masz dwa scenariusze:

  • wysyłasz 3k req/s - serwer obsługuje 3k req/s
  • wysyłasz 8k req/s - serwer obsługuje X req/s, X > 3k, nie podałeś X

W jaki sposób odpalasz test? Czy serwer i JMeter muszą współdzielić zasoby na jednej stacji? Czy monitorujesz zużycie zasobów CPU / pamięci / sieci przez oba? Na jakiej podstawie twierdzisz, że to JMeter dotarł do granicy, a nie serwer nie potrafi obsłużyć więcej requestów? Próbowałeś rozproszyć userów na kilka maszynek, żeby pojedynczy JMeter miał mniej req/s do wystrzelenia by się upewnić, "kto" nie wydala?

Tak na jednej stancji są współdzielone zasoby jmeter i apka ;/
Jak badać cpu pamieć i sieć dla takich testów na widnowsie i linuxie?

0

Pod Windowsem -> monitor zasobów i/lub menedżer zadań
Pod Linuxem -> jakiś systemowy monitor z okienkami i/lub np. top

Takie rzeczy powinny w zupełności wystarczyć, chodzi tylko o to by skontrolować co czego ciągnie najwięcej.

Tak na jednej stancji są współdzielone zasoby jmeter i apka ;/

No to tym bardziej mogą sobie nawzajem przeszkadzać.

1
Pytajnikkk skomentował(a):

W przypadku jak wysyłam dużą ilość żądań na sekundę przy użyciu JMetera, to raczej nie zaoobserwuje tego w menadzerze zadan, bo to bedzie trwać tylko chwille co nie?

Przecież to zależy od tego, jak długo ma trwać test, a nie ile żądań w ciągu sekundy wysyłasz o.O Możesz ustawić test na np. 1 minutę i rejestrować, jak się zmieniało zużycie poszczególnych zasobów w tym czasie. Mało tego, podejrzewam, że sam JMeter oferuje tego typu funkcjonalność i nie trzeba wlepiać oczu w jakiś systemowy menedżer, to były jedynie przykłady.

0

skad wiesz ze faktycznie wysylasz tyle requestow a nie tylko myslisz ze tak jest? daj jakiekolwiek dane/wyniki

0
WhiteLightning napisał(a):

skad wiesz ze faktycznie wysylasz tyle requestow a nie tylko myslisz ze tak jest? daj jakiekolwiek dane/wyniki

np. takie mi generujejmeter (zestawiłem je w formie tabelki)

Ilosc Srednia Blad Przepustowosc
3k 11123 81,62% 215/s
6k 10223 89 % 421/s
0

Czy dobrze widzę, że błąd masz powyżej 80%? Jeśli tak to strzelałbym, że wyczerpuje się pula wątków na serwerze + zapełnia backlog socketu i wtedy wszystkie requesty kończą się momentalnie czymś typu "Connection refused". Ale to tylko zgadywanie, bo nadal nie napisałeś co tak naprawdę testujesz :)

0
damianem napisał(a):

Czy dobrze widzę, że błąd masz powyżej 80%? Jeśli tak to strzelałbym, że wyczerpuje się pula wątków na serwerze + zapełnia backlog socketu i wtedy wszystkie requesty kończą się momentalnie czymś typu "Connection refused". Ale to tylko zgadywanie, bo nadal nie napisałeś co tak naprawdę testujesz :)

Mala aplikacja core mvc na linuxie przy uzyciu Jmetera. (nie wiem jak na linuxie przydzielic pule aplikacji w kestrelu, moze to jest to?)

0

Nie rozumiem metryki zawartej w załączniku, bo pokazała że dla 100 użytkowników procesor ma 100 procent, natomiast ja w teście odpaliłem 10k użytkowników na sekundę. Czyli wychodzi na to, ze procek nie wyrabia i zaczyna ich uruchamiać sekwencyjnie, dodatkowo jestem wstanie wysłać tylko 100 requestow na sekunde, a nie tak jak myślałem 10k ?
Póżniej testowałem i zobaczyłem, że podczas uruchomienia 1k użytkownik procek idzie do 100 procent w przypadku np 700 użytkowników skacze do 80-90 procent.
Czyli testowanie powyżej 1k nie ma sensu u mnie, bo ogranicza mnie procesor, czy jak mam to rozumiec?

2

pokazała że dla 100 użytkowników procesor ma 100 procent, natomiast ja w teście odpaliłem 10k użytkowników na sekundę.

Na jakiej podstawie stwierdziłeś, że wg tej metryki dla 100 użytkowników procesor jest w 100% wykorzystany? Nigdzie tego nie widać na załączonym obrazku.

Czyli wychodzi na to, ze procek nie wyrabia i zaczyna ich uruchamiać sekwencyjnie

Ale co procek ma uruchamiać sekwencyjnie? Czemu się tak uwziąłeś tej sekwencyjności? Wyrabianie / nie wyrabianie przez CPU nie ma tu w ogóle nic do rzeczy - JMeter ma informację, że chcesz mieć X "użytkowników" symulujących zachowanie - więc odpala sobie X "workerów" (nie wnikając w szczegóły, czy są to osobne wątki czy co innego) których zadaniem jest strzelanie requestami pod wskazany adres. Wykonują się współbieżnie - ani nie sekwencyjnie, bo da się zdefiniować jasno i deterministycznie kolejności, w jakiej poszczególne workery wykonają swoją akcję, ani nie równolegle bo nie masz 10k rdzeni, by każdemu przydzielić na stałe jeden i mieć pewność, że wszystkie wykonują się naraz. Co więcej, może się okazać, że wszystko wykonuje się w przeplocie - wykona się fragment zadania workera W1, potem fragment zadania workera W2, potem W3, potem znów W1, potem znów W3, potem znów W2 i pojawi się W4.... i tak dalej.

Podobnie gdy nawiązujesz połączenie z serwerem, może on utworzyć nowy wątek/proces, lub zagospodarować bezczynny wątek/proces z puli, lub po prostu wrzucić do jakiejś kolejki obsługiwanej przez takie pule zadanie obsługi przychodzącego żądania. Znowu - serwer będzie obsługiwał żądania współbieżnie. Nie da się tego w ciemno nazwać wykonaniem sekwencyjnym ani równoległym.

Można wręcz zaryzykować stwierdzenie, że 100% zużycie CPU świadczy o tym, że JMeter i serwer nie wykonują się sekwencyjnie, bo wtedy oba zajmowałyby powiedzmy po jednym rdzeniu - wtedy każdy by okupował ok. 100%/N mocy Twojego CPU.

Czyli testowanie powyżej 1k nie ma sensu u mnie, bo ogranicza mnie procesor, czy jak mam to rozumiec?

Jeśli testujesz aplikację stojącą na tej samej maszynie, na której stoi JMeter i nawet nie sprawdzasz, który żre ile zasobów (naprawdę, da się sprawdzić zużycie zasobów przez konkretny proces i to nie jest czarna magia) to skąd masz wiedzieć kto kogo dławi i co z czym nie wyrabia?

0

Jak najbardziej sam jmeter mi pobiera 60 procent zasobów procka, a apka 40 procent.
Teraz zaczęło mnie zastanawiać dlaczego na linuxie, nie dostaję żadnych błędów podczas wysłania takiej samej ilości req na sek i na dodatek przepustowość jest tam dwa razy mniejsza niż w przypadku windowsa. Na linuxe co prawda korzystam z innego serwera, bo kestrela, ale że błąd sie nie pojawil w odpowiedziach w żadnej próbce, to pewnie dlatego, ze w rzeczywistosci nie wyslal takiej ilosci requestow w sekunde, co mu ustawiłem. Sprawdzilem zasoby no i mialem 100 procent wykorzystanego procka.

2

Zacznijmy od tego, że metodyka badań jest „nie teges”, a i narzędzia „nie ten tego”.

JMeter jest może i fajnym narzędziem, ale nie powinien być uruchamiany na tej samej maszynie co testowany kod. Z prostej przyczyny. Jest za ciężki i za mocno obciąża maszynę. Do testowania API, szerzej obciążenia aplikacji webowych, już lepiej użyć Gatlinga, ponieważ nie obciąża aż tak maszyny, na której jest odpalony. Na początek zmień narzędzie, będzie ci w życiu łatwiej.

Sama metodyka testów też pozostawia wiele do życzenia. Test powinien odbywać się w możliwie powtarzalnych warunkach. Dlatego warto testowany kod umieścić w jakimś kontenerze. Może być to docker, może być to maszyna wirtualna (Virtual Box), a jeżeli korzystasz z linuxa, to możesz używać cgroup (to jest mechanizm obudowany przez dockera) albo taskset by ograniczyć dostępne procesory. Uwaga! Nie używaj ulimit do zdefiniowania zasobów, bo możesz sobie wysadzić system, ograniczając zasoby dla użytkownika.

Jak już masz przygotowane środowisko testowe, to możesz zacząć mierzyć poszczególne wartości. Warto jednak pamiętać, że po pierwsze są górne ograniczenia wydajności i powyżej nie przeskoczysz na przykład, jak masz dwa rdzenie, to aplikacje webowe pisane w starym stylu szybko padną, ponieważ odpalają wątek na request i przy domyślnej puli wątków przestaną przyjmować kolejne żądania. Po drugie testy należy powtórzyć by móc określić, jaki masz błąd pomiaru.

Na koniec monitorowanie. Możesz spróbować użyć https://github.com/jezhumble/javasysmon ale pytanie, czy będzie działał z twoją wersją Javy. Jednak można też „nieinwazyjnie”:


$ ps -p <pid> -o %cpu,%mem

przy czym trzeba te dane zbierać do pliku i potem przetworzyć. Oczywiście musisz też znać PID procesu javy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1