2012-02-20 15 views
8

Po prostu moje stopy są mokre dzięki procesowi wieloprocesorowemu (i to jest totalnie niesamowite!), Ale zastanawiałem się, czy istnieją jakieś wytyczne dotyczące wyboru liczby procesów? Czy opiera się tylko na liczbie rdzeni na serwerze? Czy jest to w jakiś sposób oparte na używaniu aplikacji (liczba pętli, ile używa procesora itp.)? etc ... jak zdecydować, ile procesów należy odradzać? W tej chwili po prostu zgaduję i dodam/usuwam procesy, ale byłoby wspaniale, gdyby istniała jakaś wytyczna lub najlepsza praktyka.Czy istnieją jakieś wytyczne do wyboru przy wyborze liczby procesów z obsługą wieloprocesową?

Kolejne pytanie, wiem, co się stanie, jeśli dodam zbyt mało (program jest slooow), ale co jeśli dodam „zbyt wiele”?

Dzięki!

Odpowiedz

9

przypadku wszystkich wątków/procesów są rzeczywiście CPU-bound, należy uruchomić dowolną liczbę procesów jako rdzenie CPU raportów. Z powodu HyperThreading, każdy rdzeń fizycznego procesora może być w stanie przedstawić wiele rdzeni wirtualnych. Zadzwoń pod numer multiprocessing.cpu_count, aby uzyskać liczbę wirtualnych rdzeni.

Jeśli tylko p z 1 waszych wątków CPU jest związany, można dostosować tę liczbę przez pomnożenie przez p. Na przykład, jeśli połowa procesów jest związana z procesorem (p = 0,5) i masz dwa procesory z 4 rdzeniami i 2 razy HyperThreading, powinieneś rozpocząć 0,5 * 2 * 4 * 2 = 8 procesów.

Jeśli proces będzie zbyt krótki, aplikacja będzie działać wolniej niż oczekiwano. Jeśli twoja aplikacja skaluje się idealnie i jest tylko związana z procesorem (to znaczy jest 10 razy szybsza po wykonaniu 10 razy większej ilości rdzeni), oznacza to, że prędkość jest wolniejsza w relacji. Na przykład, jeśli twój system wywoła 8 procesów, ale zainicjujesz tylko 4, wykorzystasz połowę mocy obliczeniowej i zajmiesz dwa razy więcej czasu. Zauważ, że w praktyce żadna aplikacja nie skaluje się idealnie, ale niektóre (ray tracing, kodowanie wideo) są całkiem blisko.

Jeśli masz zbyt wiele procesów, narzut zwiększa synchronizację. Jeśli Twój program ma niewielki wpływ na synchronizację, nie wpłynie to na ogólne środowisko uruchomieniowe, ale może sprawić, że inne programy będą działać wolniej niż te, o ile nie ustawisz swoich procesów na niższy priorytet. Nadmierna liczba procesów (powiedzmy 10000) jest w teorii dobra, jeśli twój system operacyjny ma dobry harmonogram. W praktyce praktycznie każda synchronizacja spowoduje, że obciążenie stanie się nie do zniesienia.

Jeśli nie jesteś pewien, czy aplikacja jest związany z CPU i/lub doskonale skalowanie, po prostu obserwować obciążenie systemu z różnych liczy wątku. Chcesz, aby obciążenie systemu było mniejsze niż 100%, lub dokładniej: uptime jako liczba rdzeni wirtualnych.

+0

Dzięki za wspaniałą odpowiedź. Nie wiedziałem o tym wszystkim. Co jeśli w aplikacji jest trochę niezwiązanych z procesorem cpu części? Na przykład, wiele obliczeń procesora, ale potem wynik końcowy jest zapisywany do pliku lub bazy danych. Czy to oznacza, że ​​powinienem stworzyć więcej procesów, ponieważ niektórzy muszą czekać na końcową sieć (bazę danych) lub zapisać na dysku (zapis pliku)? – Lostsoul

+0

@ Lostsoul Ogólnie rzecz biorąc, tak, jeśli udział aktywności związanej z dyskiem jest znaczący. Jeśli piszesz krótki plik podsumowania (np. Zdjęcie po raytracingu skomplikowanej sceny), efekt ten jest znikomy.Jeśli aplikacja odczytuje i zapisuje wiele danych, należy rzeczywiście zwiększyć liczbę procesów. Zaktualizowano odpowiedź jednym akapitem: Jeśli nie jesteś pewien, wypróbuj go! – phihag

+2

Wystarczy dodać do części obserwacyjnej: oczywiście chcesz uniknąć zwiększenia wykorzystania procesora ze względu na narzut synchronizacji. Podczas wykonywania eksperymentu należy zmierzyć zarówno obciążenie systemu, jak i przepustowość aplikacji. – millimoose

1

Jest to zdecydowanie na podstawie tego, co robi aplikacja. Jeśli procesor jest ciężki, liczba rdzeni jest rozsądnym punktem początkowym. Jeśli jest to IO-heavy, to i tak wiele procesów nie pomoże. Jeśli jest to głównie procesor z czasami IO (np. Optymalizacja PNG), możesz uruchomić kilka procesów bardziej niż liczbę rdzeni.

Jedynym sposobem uzyskania pewności jest uruchomienie aplikacji z realistycznymi danymi wejściowymi i sprawdzenie wykorzystania zasobów. Jeśli dysponujesz czasem procesora, dodaj więcej procesów roboczych.

Powiązane problemy