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?
- Pobieranie próbek pokazuje, że sun.misc.Unsafe.unpark (Object) zajęło 60% CPU.
- 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)
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. –
@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. –
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. –