Ile procesorów powinno być używanych w Hyperthreading?

22

Powiedzmy, że mam procesor serwera z 18 rdzeniami, z włączonym hyperthreading, co oznacza, że ​​widzę 36 cpus w htopie.

Aby w pełni wykorzystać procesor i nie wpływać na wydajność jednego wątku, powinienem dążyć do tego, aby wszystkie 36 „rdzeni” działało na 100%, a rdzenie HT będą po prostu mniej pracowały i nadal zgłaszały 100%, czy też oznaczałoby to, że „pełne” rdzenie są już przerywane przez zadanie na „rdzeniu HT”, a tym samym wykonują mniej pracy jednowątkowej?

Zdaję sobie sprawę, że istnieje wiele zmiennych, które wpływają na wydajność HT, chcę tylko wiedzieć, co oznaczają procesory CPU podczas pracy z HT.

Tassadar
źródło
6
Hyperthreading tak naprawdę nie daje dwa razy więcej niż procesor. Pomyśl o tym bardziej jak procesor odczytujący w dwóch programach, a ilekroć jeden program zrobi coś, co zajmie kilka cykli lub gdy nie zużyje wszystkich zasobów (sumatory, mnożniki, programy ładujące itp.), Przełączy się na inny program, aby mógł z nich korzystać. Tak więc zobaczenie 100% we wszystkich wątkach wymaga szczęśliwego zbiegu kompatybilnych programów działających na rdzeniu.
simpleuser
4
Z powodu tej konstrukcji hiperwątkowanie działa dobrze przy mieszanych obciążeniach. Na przykład hiperwizor, w którym wszystkie maszyny wirtualne uruchamiają różne usługi. W takim scenariuszu prawdopodobnie nie jest nawet konieczne testowanie. W przypadku bardziej jednorodnych obciążeń zwykle konieczne jest sprawdzenie.
Michael Hampton

Odpowiedzi:

14

Jeśli drugi wirtualny rdzeń może uczestniczyć, gdy pierwszy utknie w innym przypadku, będzie lepiej niż nie , więc dostaniesz (przynajmniej) odrobinę dodatkowej pracy.

Powstaje pytanie: kiedy posiadanie dwóch różnych wątków powoduje pogorszenie jednego? Prognozowanie gałęzi i zależności między instrukcjami nie ulegną zmianie. Oczekiwanie na dostęp do pamięci teraz ... dwa wątki konkurują o dostęp do pamięci, zarówno pod względem wykorzystania pamięci podręcznej, jak i przepustowości.

Jeśli masz niektóre procesory działające z HT, a inne nie, czy to oznacza również, że przypisujesz określone wątki do jednego lub drugiego typu? Nie sądzę: twoje programy będą uruchamiać swoje wątki na losowych wirtualnych rdzeniach. Jak zatem pomaga podział konfiguracji? Ponieważ każdy procesor ma własną pamięć podręczną, jedyny wpływ na to ma przepustowość pamięci i ciężar spójności pamięci podręcznej.

Ogólnie rzecz biorąc, osiągasz punkt, w którym posiadanie czegoś więcej, co możesz zrobić, jest droższe niż pozwalanie niektórym jednostkom wykonawczym CPU na bezczynność. Nie zależy to bezpośrednio od liczby wątków, ale od tego, co robią wątki oraz szczegółowej architektury pamięci i niuansów wydajności różnych komponentów.

Nie ma prostej odpowiedzi. Nawet mając na uwadze konkretny program, maszyna może różnić się od ludzi opowiadających o swoich doświadczeniach.

Musisz spróbować sam i zmierzyć, co jest najszybsze, dzięki tej konkretnej pracy na tej konkretnej maszynie. I nawet wtedy może się to zmieniać wraz z aktualizacjami oprogramowania i zmianami użytkowania w miarę upływu czasu.

Spójrz na tom 3 magnum opus Anger . Jeśli przyjrzysz się uważnie konkretnemu procesorowi, możesz znaleźć ograniczające zasoby wśród głębokiego potoku wielu kroków niezbędnych do wykonania kodu. Musisz znaleźć przypadek, w którym nadmierne zaangażowanie powoduje jego wolniejsze działanie, a nie podejmowanie większej ilości pracy. Ogólnie oznaczałoby to pewien rodzaj buforowania; i gdzie zasób jest współużytkowany przez wątki.


Co oznacza miernik procesora: raportuje cały czas, który nie jest spędzony na uruchomieniu wątku bezczynności. Oba wątki logiczne przypisane do rdzenia nie będą bezczynne, nawet jeśli rzeczywista praca wykonana na jednym z nich może być niewielka. Czas spędzony z rurociągiem utknął na kilka cykli, aż wyniki są gotowe, pamięć jest pobierana, operacje atomowe są ogrodzone itp. Podobnie nie powoduje, że wątek jest odkładany jako „nie gotowy”, więc nie będzie bezczynny, a czas nadal pokazuje się jako używany. Oczekiwanie na pamięć RAM nie będzie wyświetlane jako bezczynne. Tylko coś takiego jak We / Wy spowoduje zablokowanie wątku i zatrzymanie czasu ładowania w jego kierunku. Muteks systemu operacyjnego w ogóle to zrobi, ale wraz z rozwojem systemów wielordzeniowych nie jest to już pewne, ponieważ „spinlock” nie sprawi, że nić powróci na półkę.

Tak więc miernik procesora 100% nie oznacza, że ​​wszystko płynnie płynie, jeśli procesor często utknął w oczekiwaniu na pamięć. Mniejsza liczba rdzeni logicznych pokazujących 90% mogłaby równie dobrze wykonywać więcej pracy, ponieważ kończy się chrupanie liczb i teraz czeka na dysku.

Więc nie martw się miernikiem procesora. Spójrz na rzeczywistych postępów, tylko .

JDługosz
źródło
23

Mierniki procesorów są bardzo kiepskie, jeśli chodzi o informowanie o tym, o ile więcej wydajności można wycisnąć z procesorów hyperthreaded. W tym celu należy uruchomić własne testy porównawcze przy różnych stawkach nadmiernej subskrypcji na rdzeń fizyczny. Niektóre obciążenia działają najlepiej przy całkowicie wyłączonym HT, więc uwzględnij ten przypadek również w testach. Może to być 1: 2 (36 równoległych pracowników), 1: 1,5 lub nawet 1: 2,5! To zależy od obciążenia pracą.

Bardziej szczegółowo, HT jest implementowany na krzemie w sposób, który skraca czas bezczynności procesora, gdy kontekst musi zostać przełączony lub przewidywanie gałęzi zawiedzie. Ułatwia to osiągnięcie 100% wykorzystania jednostki wykonawczej niż w przypadku sztuczek opartych wyłącznie na systemie operacyjnym. HT ewoluowała od czasu jej wprowadzenia, a współczesne układy scalone są bardziej równoległe niż te, których używaliśmy 10 lat temu.

Istnieją dwa profile wykonania, które będą miały wpływ na to, gdzie znajduje się twój optymalny punkt nadmiernej subskrypcji:

  • Długi czas realizacji . Jeśli pracownicy pracują przez kilka minut lub godzin przed recyklingiem, na przykład duże zadania renderowania lub modelowanie środowiska, uzyskasz bardziej wydajną wydajność pojedynczego rdzenia na pracownika. To obniży twój stosunek.
  • Krótki czas realizacji . Jeśli Twoi pracownicy wykonują cykl w ciągu kilku sekund lub krótkich minut, takich jak wątki w aplikacjach internetowych, narzut związany z włączeniem nowego procesu oznacza, że ​​Twój stosunek będzie wyższy.
sysadmin1138
źródło
Małe minuty? Masz na myśli kilka minut?
Ismael Miguel
Dosyć. Od 1 do 5 lub więcej. Przy 120 sekundach na pracownika z 18 pracownikami, wymieniasz nowy co 7 sekund. Wiele z nich sprowadza się do lokalizacji pamięci podręcznej.
sysadmin1138
1
Nie dostałeś tego ... Mówisz „małe minuty” na swój drugi punkt. Minuty zawsze mają ten sam „rozmiar”, czyli 60 sekund. Czasami 61 sekund.
Ismael Miguel
4

Powinieneś zobaczyć wszystkie 36 rdzeni działających na 100% - zakładając, że oprogramowanie to potrafi (co nie jest trywialne - planowanie może być trudne z tyloma rdzeniami, więc spadki poniżej 100% są dopuszczalne).

Oczywiście, gdy „podzielisz” rudę z hiperwątkiem, znaczenie tych 200% nie oznacza „2x100% - w wykonanej pracy. Jest to jednak niewidoczne dla żadnego pomiaru (który wynika z wykorzystania procesora i nie ma pojęcia o wykonanej pracy). To, ile pracy zostanie wykonane, zależy od tego, co to jest praca - gdzieś powyżej 1,5 x pracy bez hiperwątkowości należy się spodziewać przez większość czasu.

TomTom
źródło
3

Sposób implementacji hyperthreading różni się w zależności od konkretnego procesora CPU. Od Nehalem do Skylake, Intel znacząco zmniejszył wspólne proporcje (tj. 50/50) wspólnych części rurociągu, kierując się do struktur dynamicznie wspólnych.

W każdym razie, ogólnie rzecz biorąc, włączenie HT doprowadziło do nieco wolniejszego wykonywania jednego wątku, ale ze względu na to, jak działa program planujący Linuksa, dzieje się tak tylko wtedy, gdy liczba lub działający wątek jest większa niż liczba rdzeni fizycznych. Ponieważ w takich sytuacjach (gdy wątki> rdzenie) zazwyczaj cenisz całkowitą przepustowość o najwyższym znaczeniu, hyperthreading pozostaje wygraną netto.

Jak to mozliwe Kluczową kwestią do zrozumienia jest to, że CPU nie prezentuje rdzeni fizycznych i wirtualnych jako równych rdzeni, a raczej odsłania te ostatnie w sposób, w jaki program planujący Linuksa może uniknąć planowania na nich, jeśli dostępne są jakiekolwiek inne rdzenie fizyczne. Innymi słowy, najpierw wykorzystuje wszystkie rdzenie fizyczne, a następnie zaczyna korzystać z wirtualnego.

Oznacza to, że generalnie HyperThreading jest bardzo cenną funkcją (inne procesory, podobnie jak Power8, wykorzystuje jeszcze głębsze techniki SMT) i że w celu maksymalizacji przepustowości należy ją włączyć, obciążając procesor co najmniej jednym wątkiem na rdzeń wirtualny lub fizyczny. Dla praktycznego przykładu, aby uzyskać pełną wydajność z 18-rdzeniowego procesora, powinieneś użyć co najmniej 36 wątków.

Istnieją dwa wyjątki:

  1. jeśli wszystko, czego chcesz, to zminimalizować opóźnienia z ograniczonego zestawu wątków (gdzie wątki <rdzenie fizyczne), możesz wyłączyć HT
  2. bardzo stary procesor (Pentium4 i, w znacznie mniejszym stopniu, Nehalem) mają nieelastyczne reguły partycji, które zmuszają procesor do dzielenia wielu kluczowych zasobów w stosunku 50/50, niezależnie od statusu / obciążenia drugiego wątku. W takim przypadku musiałeś przeprowadzić analizę porównawczą swojego przypadku użycia, aby upewnić się, że dodatkowa przepustowość jest warta znacznie niższej wydajności pojedynczego wątku.
Shodanshok
źródło