2012-10-19 11 views
5

Niedawno rozpoczęliśmy testowanie warunków skrajnych naszej aplikacji (serwer czatowy oparty na XMPP) przy użyciu YJP 11.0.9. Podczas naszego testu zauważyliśmy następujące dziwne zachowanie.Dlaczego park/unpark ma 60% użycia procesora?

  1. Pobieranie próbek pokazuje, że sun.misc.Unsafe.unpark (Object) zajęło 60% CPU.
  2. Dla tej samej aplikacji Śledzenie pokazuje, że LockSupport.park (Object) zajął 52% CPU.

Przeprowadziłem wiele testów, aby potwierdzić wyniki i za każdym razem otrzymałem podobne wyniki.

Nie mogę zrozumieć, dlaczego unpark powinien zająć 60% czasu i dlaczego śledzenie pokazuje dokładnie odwrotne wyniki.

Czy ktoś może mi pomóc zrozumieć te wyniki. Czy coś mi umyka?

Środowisko:

java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
+1

Może to zająć dużo, jeśli wywołanie 'unpark' jest właściwie jedyną rzeczą, jaką robi nić. Co masz na myśli mówiąc, że "śledzenie pokazuje dokładnie przeciwne wyniki"? Czy śledzenie może mierzyć czas spędzony w ramach metody? 'park' jest metodą blokującą, więc nie dziwię się, że czas jest w niej spędzony. –

+0

@MarkoTopolnik wątek robi również inne rzeczy. Zasadniczo problem producenta/konsumenta. Wyprodukuj zadania i prześlij je w kolejce, aby powiadomić oczekujących klientów. Konsument działa na zadaniu i jeśli nie ma zadań dostępnych niż sam park. –

+0

Wątek, który wywołuje funkcję 'unpark', nie jest wątkiem, który jest odrywany. Z kolei ten wątek może naprawdę niewiele robić, oprócz oderwania odpowiednich wątków konsumenckich. Jeśli chodzi o czas pracy procesora 'park', to jest on) trudny do zmierzenia z powodu blokowania i b) nieistotny, ponieważ będzie to niewielki ułamek rzeczywistego czasu spędzonego w stanie zaparkowanym. –

Odpowiedz

3

z blokowaniem poleceń pewien niski poziom lubię odczytu/zapisu/park/zablokować „CPU” czas jest ponad szacuje gdyż zakłada ona zużywa CPU gdy faktycznie operacja blokuje. Fakt, że unpark/park jest zarówno wysoki, sugeruje, że masz problem, ale podejrzewam, że powinieneś przyjąć niższy z dwóch procent jako oszacowanie.

3

Wysoki czas procesora Unsafe.unpark jest znakiem nadmiernej wartości Przełączanie kontekstu. Oto artykuł, aby uzyskać pomysł, jak kosztowne jest przełącznik kontekstu:

How long does it take to make a context switch?

Najprostszym rozwiązaniem, aby dowiedzieć się liczyć CS Linux jest prowadzony vmstat <seconds>.

Po potwierdzeniu wysokiego CS (np. Więcej przełączników 10K na rdzeń/sekundę) bierzesz obraźliwy wątek (możesz sortować wątki w YJP według czasu procesora) i uruchamiasz strace -p <pid> -c, aby znaleźć przyczynę przełączania, np. wątek czyta z gniazda w małych kawałkach i wyłącza się, w takim przypadku może pomóc zwiększenie bufora gniazd.

Powiązane problemy