Właściwy sposób interpretacji obciążenia systemu na 4-rdzeniowym 8-wątkowym procesorze

13

Jak wszyscy wiemy, obciążenie 1,00 na jednym procesorze oznacza, że ​​obciążenie wynosi 100% . Analogicznie obciążenie 4,00 czterordzeniowego rdzenia wynosiłoby 100% .

Jak interpretować obciążenie 4-rdzeniowego 8-wątkowego procesora? Kiedy osiągnę maksymalną pojemność procesora? O 4,00 lub 8,00 ?

Bartek Szablowski
źródło

Odpowiedzi:

17

Nie na pewno, ale głównie na 1.00*n_cpu.

Obciążenie oznacza, że: jeśli w systemie z jednym procesorem jest wiele procesów, działają one pozornie równolegle. Ale to nieprawda. Co praktycznie się dzieje: jądro daje procesowi 1/100 sekundy, a następnie przerywa jego działanie przerwaniem. I daje następną 1/100 sekundy innemu procesowi.

Praktycznie pytanie, „który proces powinien otrzymać nasz następny 1/100 sekundy?”, Zostanie rozstrzygnięte przez złożoną heurystykę. Jest on nazwany jako zadania harmonogramu .

Oczywiście procesy, które są zablokowane, na przykład czekają na dane, które odczytują z dysku, są zwolnione z tego harmonogramu zadań.

Co mówi obciążenie: ile procesów oczekuje obecnie na następne 1/100 sekundy. Oczywiście jest to wartość średnia. Wynika to z faktu, że możesz zobaczyć wiele liczb w cat /proc/loadavg.

Sytuacja w systemie z wieloma procesorami jest nieco bardziej złożona. Istnieje wiele procesorów, których ramy czasowe można przypisać do wielu procesów. To sprawia, że ​​planowanie zadań jest nieco - ale nie za bardzo - skomplikowane. Ale sytuacja jest taka sama.

Jądro jest inteligentne, stara się współdzielić zasoby systemowe w celu uzyskania optymalnej wydajności, i jest to bliskie (istnieją pewne drobiazgi związane z optymalizacją, na przykład lepiej, jeśli proces będzie uruchamiany możliwie najdłużej w tym samym czasie procesora ze względu na względy buforowania, ale nie mają one znaczenia). Wynika to z faktu, że jeśli mamy ładunek 8, oznacza to: w rzeczywistości 8 procesów czeka na następny wycinek czasu. Jeśli mamy 8 procesorów, możemy nadać te przedziały czasu procesorowi jeden na jeden, dzięki czemu nasz system będzie optymalnie wykorzystywany.

Jeśli widzisz a top, możesz zobaczyć, że liczba faktycznie działających procesów jest zaskakująco niska: są to procesy oznaczone przez Rnie. Nawet w niezbyt trudnym systemie jest często poniżej 5. Jest to częściowo spowodowane tym, że procesy oczekujące na dane z dysków lub z sieci są również zawieszone (oznaczone symbolem u Sgóry). Obciążenie pokazuje tylko użycie procesora.

Istnieją również narzędzia do pomiaru obciążenia dysku, imho powinny one być co najmniej ważne jako monitorowanie użycia procesora, ale jakoś nie jest to tak dobrze znane w naszym profesjonalnym świecie sysadmin.


Narzędzia Windows często dzielą obciążenie z rzeczywistą liczbą procesorów. Powoduje to, że niektórzy profesjonalni administratorzy systemu Windows używają obciążenia systemu w tym sensie podziału na procesory. Nie mają racji i prawdopodobnie będą szczęśliwsi po tym, jak im to wytłumaczysz.


Procesory wielordzeniowe to praktycznie wiele procesorów na tym samym chipie krzemowym. Nie ma różnicy.

W przypadku procesorów hyperthreaded występuje ciekawy efekt uboczny: ładowanie procesora powoduje spowolnienie jego par hyperthreaded. Ale dzieje się to na głębszej warstwie, co obsługuje normalne planowanie zadań, chociaż może (i powinno) wpływać na decyzje harmonogramu dotyczące przenoszenia procesów.

Ale z naszego obecnego punktu widzenia - co determinuje obciążenie systemu - nie ma to również znaczenia.

peterh - Przywróć Monikę
źródło
4

Ponieważ hyperthreading nie jest tak naprawdę drugim rdzeniem, nigdy nie zajmie rdzenia do 200%, ale zabierze go ponad 100% w przypadku niektórych obciążeń.

Więc twoje maksymalne obciążenie jest gdzieś nieznane między około 4 a 6

(oczywiście może wzrosnąć wyżej, gdy jest przeciążony, ponieważ faktycznie liczy uruchomione procesy, szczególnie gdy czekają na IO)

JamesRyan
źródło
4

Średnia wartość obciążenia nie oznacza, co myślisz. Nie chodzi o natychmiastowe użycie procesora, ale o to, ile procesów czeka na uruchomienie. Zwykle dzieje się tak z powodu wielu rzeczy wymagających procesora, ale nie zawsze. Powszechnym winowajcą jest proces czekający na IO - dysk lub sieć.

Spróbuj uruchomić ps -e vi poszukać flag stanu procesu.

state    The state is given by a sequence of characters, for example, "RWNA". The      first character indicates the run state of the process:
D    Marks a process in disk (or other short term, uninterruptible) wait.
I    Marks a process that is idle (sleeping for longer than about 20 seconds).  
L    Marks a process that is waiting to acquire a lock.
R    Marks a runnable process.
S    Marks a process that is sleeping for less than about 20 seconds.
T    Marks a stopped process.
W    Marks an idle interrupt thread.
Z    Marks a dead process (a "zombie").

To pochodzi ze strony pspodręcznika, więc znajdziesz tam więcej szczegółów - Ra Dprocesy są prawdopodobnie szczególnie interesujące.

Możesz skończyć z uśrednionymi „skokami” z różnych powodów, więc nie są tak naprawdę dobrą miarą niczego poza „to, że system jest zajęty”. Utknięcie w mapowaniu średniego obciążenia do rdzeni procesora nie przyniesie ci żadnego pożytku.

Sobrique
źródło
3

W systemie Linux liczone są nie tylko procesy w kolejce do uruchomienia, aby obliczyć obciążenie, ale także procesy w nieprzerwanych stanach uśpienia, wikipedia , powodując wzrost obciążenia, gdy wiele procesów czeka na dysk.

przRocco
źródło
Nie wiedziałem o tym, będę o tym pamiętać!
Bartek Szablowski
2

Przeprowadziłem kilka eksperymentów na naszym 24-rdzeniowym systemie Xeon (2 gniazda x 12 rdzeni). Maksymalne obciążenie wynosi w tym przypadku 48,0 ze względu na sposób, w jaki Linux konfiguruje hyperthreading.

Jednak nie otrzymujesz odpowiednika 48 rdzeni przepustowości. Zauważyłem, że uzyskujesz około 90% przepustowości w pierwszych 24 procesorach logicznych, tj. Jeśli obciążenie osiąga 24,0. Następnie otrzymujesz dodatkową przepustowość około 10% dla pozostałych 24 procesorów logicznych (ładowanie przebiega do 48,0). Innym sposobem myślenia na ten temat jest to, że jeśli uruchomisz 48 wątków na 24 rdzeniach, uzyskasz wzrost o około 10-20%, jeśli włączysz hiperwątkowanie w porównaniu do nie. To nie jest 100% wzrost, jak sugerowaliby faceci od marketingu.

Na przykład jednym ze sposobów przetestowania tej obserwacji jest proces, który uruchamia 48 wątków (powiedzmy, używając TBB lub modelu wątków sterowanych), a następnie uruchamia

time numactl --physcpubind=0-23  ./myprocess

a następnie biegnij

time numactl --physcpubind=0-47  ./myprocess

Ten ostatni powinien działać o około 10-20% krócej. Jeśli proces jest wysoce zablokowany we / wy, wynik może być inny.

Pierwszy z nich wyłączy hiperwątkowanie, pozwalając, aby wątki działały tylko na jednym procesorze logicznym (każdego rdzenia), podczas gdy drugie umożliwi hiperwątkowanie, umożliwiając wątki na 2 procesorach logicznych (każdego rdzenia).

Obciążenie w obu przypadkach należy zgłaszać jako 48,0 ... co, jak widać, jest bardzo mylące.

Mark Lakata
źródło