Moje pytanie dotyczy zakresu, w jakim aplikacja JVM może wykorzystać układ NUMA hosta.Znajomość NUMA JVM
Mam aplikację Akka, w której aktorzy jednocześnie przetwarzają żądania, łącząc przychodzące dane z "zwykłymi" danymi już załadowanymi do niezmiennego obiektu (Scala). Aplikacja skaluje się dobrze w chmurze, wykorzystując wiele dwurdzeniowych maszyn wirtualnych, ale działa słabo na pojedynczym komputerze z 64 rdzeniami. Zakładam, że dzieje się tak dlatego, że wspólny obiekt danych znajduje się w jednej komórce NUMA, a wiele wątków współbieżnie uzyskujących dostęp z innych komórek jest zbyt duże dla interkonektów.
Jeśli uruchomię 64 oddzielne aplikacje JVM, z których każda zawiera 1 aktora, wówczas wydajność znów będzie dobra. Bardziej umiarkowanym podejściem może być uruchamianie tylu aplikacji JVM, ile jest komórek NUMA (w moim przypadku 8), co daje systemowi głównemu możliwość zachowania wątków i pamięci razem?
Ale czy istnieje mądrzejszy sposób uzyskania tego samego efektu w ramach pojedynczej maszyny JVM? Na przykład. gdybym zastąpił mój wspólny obiekt danych kilkoma instancjami klasy case, czy JVM miałaby możliwość umieszczenia ich na optymalnej komórce NUMA?
Aktualizacja:
Używam Oracle JDK 1.7.0_05 i Akka 2.1.4
mam teraz próbował z opcjami UseNUMA i UseParallelGC JVM. Wydaje się, że żaden z nich nie miał znaczącego wpływu na powolną wydajność przy korzystaniu z jednej lub kilku maszyn JVM. Próbowałem również używać PinnedDispatcher i executora puli thre-pool bez żadnego efektu. Nie jestem pewien, czy konfiguracja ma wpływ, ponieważ nie wydaje się nic innego w dziennikach uruchamiania.
Największa poprawa pozostaje, gdy używam pojedynczej maszyny JVM na pracownika (~ 50). Jednak problem z tym wydaje się, że istnieje długie opóźnienie (do kilku minut), zanim FailureDector zarejestruje pomyślną wymianę "pierwszego pulsu" pomiędzy JVM klastra Akka. Podejrzewam, że jest jeszcze inny problem, którego jeszcze nie odkryłem. Musiałem już zwiększyć ulimit -u, ponieważ osiągnąłem domyślną maksymalną liczbę procesów (1024).
Aby wyjaśnić, nie próbuję osiągnąć dużej liczby wiadomości, tylko próbuję mieć wielu oddzielnych aktorów jednocześnie uzyskujących dostęp do niezmiennych obiektów.
Czy używasz opcji -XX: + UseNUMA jvm? – cmbaxter
Z jakich ustawień GC korzystasz? A jaka konfigurator executorów? –
Prawdopodobnie musisz poinformować akka, aby używał lepszych wzorów wątków, zobacz tutaj niektóre opcje konfiguracji skrzynki pocztowej: http://doc.akka.io/docs/akka/snapshot/scala/dispatchers.html – Noah