2013-01-21 11 views
12

Od oficjalnego dokumentu BoneCP: http://jolbox.com/index.html?page=http://jolbox.com/configuration.htmlLepszym wytłumaczeniem partitionCount w BoneCP

partitionCount w celu zmniejszenia blokady rywalizacji, a tym samym zwiększenia wydajności, każde żądanie połączenia przychodzące odbiera się połączenia z puli, która ma wątek-powinowactwo, tj. puli [threadId% partition_count]. Im wyższa jest ta liczba, tym lepszy będzie Twój występ w przypadku, gdy masz dużo krótkich wątków. Po przekroczeniu pewnego progu zachowanie tych pul rozpocznie się ma negatywny wpływ na wydajność (i tylko w przypadku, gdy połączenia na partycji zaczynają się kończyć).

domyślna: 2, minimalna: 1, zalecane: 3-4 (ale bardzo specyficzna aplikacja)

Ale to nie jest tak jasne i nie ma dobrego przykładu. Prowadzę normalną usługę sieciową z równoczesnym wątkiem 0-500. Co to jest dobra wartość i dlaczego?

Odpowiedz

19

Wewnętrznie BoneCP ma numer puli połączeń. Za każdym razem, gdy wątek próbuje nawiązać połączenie, trwa thread.getId() % partitionCount i działa z połączeniem z tej puli. Będziesz mieć łącznie maxConnectionsPerPartition * partitionCount liczbę połączeń.

Dlaczego ma to pozytywny wpływ na wydajność? Cóż, aby nie używać dwóch wątków jednocześnie na tym samym łączu (oczywiście byłoby to złe), BoneCP musi wykonać blokadę, aby zwolnić lub uzyskać połączenie. Ale w tym samym czasie wszystkie inne wątki, które chcą zrobić to samo, muszą czekać na ten zamek. Więc w pewnym sensie możesz zwolnić lub odebrać partitionCount liczbę połączeń równolegle.

Jakiej liczby ustawić? Myślę, że liczba rdzeni to dobry początek, ponieważ i tak nie będzie więcej równoległej pracy. Ale poza tym spróbuj przewidzieć, ile wątków będzie ścigać się po połączenia, mierz i powtórz.

BTW, większość świata opiera się na c3po przez ponad dekadę i że w zasadzie liczba partycji została ustawiona na 1. Nie można zatem pomylić się z tym.

+8

autor BoneCP tutaj: To wyjaśnienie jest idealne. Po prostu chciałbym dodać, że posiadanie większej liczby partycji oznacza również, że każda partycja ma zwykle mniej skonfigurowanych połączeń (ponieważ są one podzielone). Jeśli wątek spróbuje uderzyć w wyczerpaną partycję, to rozlewa się, aby spróbować nawiązać połączenie z innych partycji, więc w pewnym momencie zaczyna się wolniej. Jak twierdzą javadocs, trzymaj się maksymalnie 3-4 (nie ma też racji). – wwadge

+0

@ user149789 i Mirko, więc dla tych z nas, którzy korzystają z naszych aplikacji opartych na JVM na mikroprocesorach chmurowych, gdzie pojedyncze rdzenie są normą, brzmi to tak, że partycja powinna być ustawiona na 1. Benchmarking dziś Zaskoczyło mnie, że max używane połączenia w moja baza danych nie była 48 (mam config 3 partitionCount * 16 maxConnectionsPerPartition), ale tylko 16 O_o – virtualeyes

+0

Jeśli mam do czynienia z połączeniami równoległymi, aby wykonać co najmniej 2 operacje Statement i te połączenia będą ~ 30. Czy mógłbyś powiedzieć wielkości partycji - czy należy ustawić 30? Ponadto, gdybyś mógł powiedzieć inne parametry związane z ustawieniem BoneCPDataSource? – Sanchit