2015-04-09 11 views
6

Obecnie testuję aplikację na serwerze, który ma 64 rdzenie. Na tym serwerze zainstalowano wirtualną skrzynkę, która może wykorzystywać do 32 rdzeni, ale nie więcej (ten limit jest przyznawany przez wirtualną skrzynkę). Z uwagi na to, że używam mininetu do przetestowania mojej aplikacji, potrzebuję uprawnień roota do jej wykonania. Nie mam uprawnień root na serwerze, ale w VM. Więc moja konfiguracja jest:Dodawanie większej liczby rdzeni do wirtualnej skrzynki sprawia, że ​​aplikacje wolniej zaczynają od 16 rdzeni.

  • Host ma 64 rdzeni i ubuntu zainstalowane

  • VirtualBox VM z Ubuntu 1 - 32 rdzeni

  • Moja aplikacja jest uruchomiona na 16 hostów mininet, każdy gospodarz jest uruchamianie programu używającego multiemisji i unicast do komunikowania się ze sobą, ale nie za dużo żądań na teraz. Około 5 żądań na hosta po rozpoczęciu. Początek z opóźnieniem wynoszącym 3 sekundy, aby uniknąć zatorów na początku

  • My zgłoszenie korzysta z wielu wątków, ale każdy o aplikacji na komputerze jest Niezależny od innych

  • My zgłoszenie korzysta z APScheduler pytona i całkowicie napisany w pytonie

Myślałem, że prowadzenie go z 32 rdzeniami byłoby najlepsze. Ale kiedy to robię, wszystko zaczyna wisieć. Otrzymuję limity czasu w APScheduler, a obciążenie systemu jest bardzo wysokie.

Więc próbowałem go z każdej liczby rdzeni między 1 a 32. Oto kilka przykładów:

1 rdzeń 1 Core

4 rdzenie 4 Cores

8 rdzeni 8 Cores

12 rdzeni 12 Cores

16 rdzenie 16 Cores

20 rdzenie 20 Cores

23 rdzenie 23 Cores

27 rdzenie 27 Cores

32 rdzenie 32 Cores

Oś X trwa pół sekundy, a acis to obciążenie procesora zgłaszane przez top -b -n 1 w procentach. Uruchomiłem aplikację z każdym rdzeniem przez około 10 minut. niebieska linia to średnie obciążenie procesora mojej aplikacji. czerwona linia to moja aplikacja, zielona linia to całkowite obciążenie systemu.

Jak widać, obciążenie spada do około 16 rdzeni. przy użyciu więcej niż 16 rdzeni robi się wolniej i zaczynając od około 23 rdzeni, robi się bardzo wolno. Nawet tak wolno, że proces, który rejestruje obciążenie procesora, nie jest już nawet wywoływany. Właśnie dlatego wykresy na ostatnich wykresach są krótsze ...

Czy ktoś ma pomysł, co może być problemem? Czy jest to znany błąd VirtualBox? Czy to jest problem z mininetami? lub problem z linuxem? Skąd mogę wiedzieć, które części powodują ekstremalne obciążenie?

Jeśli potrzebujesz więcej informacji, napisz komentarz, a ja edytuję pytanie.

Obciążenie systemu gościa nigdy nie było większe niż 50%, więc myślę, że to nie problem.

Czy to możliwe, że VMWare będzie szybszy?

EDIT Sprawdziliśmy działek i okazało się, że niebieska linia, która opisuje średnie obciążenie procesora mojej aplikacji (średnio ponad wszystkich instancji na wszystkich hostach mininet) jest nawet coraz większe, gdy zmienia się od 1 do 2 do 3 do ... 16 rdzeni. Ale od 1 do 16 rdzeni obciążenie procesora mojej aplikacji wzrasta bardzo wolno. Podczas gdy to zwiększa całkowite obciążenie systemu spada (co ma sens w mojej opinii, ponieważ ubuntu może wykonywać swoje zadania na różnych rdzeniach, co jest szybsze, jeśli nie ma wspólnych zasobów).

Dlaczego więc średnia rośnie? I dlaczego wzrasta wykładniczo od 16 rdzeni?

+1

to limit 32 rdzeni odnoszących się do rdzeni fizycznych lub logicznych? Może twoja maszyna wirtualna używa 16 rdzeni i zaczyna używać HT po tym? – Leeor

+0

Hmm, jak mógłbym to znaleźć? –

+1

'cat/proc/cpuinfo | grep "core id" | sortuj uniq | wc -l' na hoście podaje liczbę rdzeni fizycznych. –

Odpowiedz

2

Jest to typowe zachowanie po uruchomieniu programu przez granicę gniazda procesora. Zasadniczo zaczniesz widzieć nieprzewidywalne zachowanie w czasie po uruchomieniu aplikacji na rdzeniach rezydujących na różnych procesorach fizycznych.

Zakładając, że twoja 64 rdzeniowa maszyna ma cztery gniazda procesorowe z 16 rdzeniami każdy, a także zakładając, że twój planer jest rozsądnym planistą, który próbuje utrzymać wątki aplikacji zgrupowane w tym samym gnieździe, to aplikacja powinna widzieć dobre równoległe przyspieszenie od 1 do 16 rdzeni, ale zacznie słabo pracować, gdy użyje więcej niż 16 rdzeni, ponieważ niektóre z nich muszą znajdować się na osobnym gnieździe.

Dotyczy to zarówno zwykłych maszyn, jak i zwirtualizowanych maszyn, ale maszyna wirtualna może dodać kolejną warstwę nieprzewidywalności, jeśli planista nie zna tych granic gniazda.

Powiązane problemy