Mam system z uruchomioną aplikacją do handlu finansami na zdalnym obiekcie. Nie mam dostępu do ILO / DRAC, ale muszę wyłączyć hyperthreading. System obsługuje sześciordzeniowe procesory Intel Westmere 3.33GHz X5680. Mogę zrestartować komputer, ale chcę się upewnić, że system nie włączy hiperwątkowania z powodu problemów z wydajnością. Czy istnieje czysty sposób na zrobienie tego z poziomu Linuksa?
Edycja: noht
Dyrektywa dodana do wiersza komend rozruchu jądra nie działała. To samo dla RHEL.
Zobacz: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9
sysbench --num-threads=1 --test=cpu run
z różnymi numerami wątków i włączonymi i wyłączonymi HT mówi, że wyłączenie HT zmniejsza wydajność, gdy jest wiele wątków, a nawet jeśli jest tylko jeden wątek, nie ma korzyści z wyłączenia HT. Sugeruję więc pozostawić to tak, jak jest: jest optymalne.echo 1
zamiastecho 0
włączać je ponownie.Skrypt wyłączający hyperthreading podczas uruchamiania komputera ...
Aby wyłączyć hyperthreading, dołączam skrypt na komputerze /etc/rc.local. Nie jest wyjątkowo czysty, ale jest łatwy w instalacji, niezależny od architektury procesora i powinien działać na każdej nowoczesnej dystrybucji Linuksa.
Jak to działa
Informacje i kontrolki jądra systemu Linux są dostępne jako pliki w katalogu / sys w nowoczesnych dystrybucjach linuksa. Na przykład:
/ sys / devices / system / cpu / cpu3 zawiera informacje o jądrze i kontrolki dla logicznego procesora 3.
cat / sys / devices / system / cpu / cpu3 / topology / core_id pokaże numer rdzenia, do którego należy ta logiczna jednostka centralna.
echo "0"> / sys / devices / system / cpu / cpu3 / online pozwala wyłączyć logiczne procesor 3.
Dlaczego to działa?
Nie wiem dokładnie, dlaczego ... ale system staje się bardziej responsywny po wyłączeniu hyperthreadingu (na moim notebooku i5 i ogromnych serwerach Xeon z ponad 60 rdzeniami). Myślę, że ma to związek z buforami na procesor, alokacją pamięci na procesor, alokacją harmonogramu procesora i złożonymi iteracjami priorytetów procesu. Myślę, że korzyści płynące z hiperwątkowania są przeważające ze względu na złożoność tworzenia harmonogramów procesorów, które wiedzą, jak z niego korzystać.
Dla mnie problem z hyperthreadingiem jest taki: jeśli zacznę tyle wątków intensywnie obciążających procesor, ile mam rdzeni logicznych, będę miał szybkie przełączniki kontekstu dla zadań intensywnie obciążających procesor, ale drogie dla zadań w tle, ponieważ hiperwątkowanie całkowicie pochłania intensywne zadania procesora. Z drugiej strony, jeśli rozpocznę tyle wątków intensywnie obciążających procesor, ile mam rdzeni fizycznych, nie będę mieć przełączników kontekstowych na te zadania i szybkich przełączników kontekstowych dla zadań w tle. Wydaje się dobre, ale zadania w tle znajdą wolne procesory logiczne i będą działać prawie bez przeszkód. To tak, jakby występowali w czasie rzeczywistym (ładne -20).
W pierwszym scenariuszu hyperthreading jest bezużyteczny, zadania w tle będą wykorzystywać drogie przełączniki kontekstu, ponieważ maksymalizowałem hyperthreading przy normalnym przetwarzaniu. Drugi jest niedopuszczalny, ponieważ do 50% mojej mocy procesora ma priorytet w zadaniach w tle.
Zadania „intensywnie obciążające procesor”, o których mówię, to wyszukiwanie danych i serwery autoryzacji sztucznej inteligencji (moja praca). Renderowanie blendera w tanich komputerach i klastrach (naszkicować mój przyszły dom).
To także zgadywanie.
Mam wrażenie, że jest lepiej, ale może nie.
źródło
W przypadku naprawdę starych jąder (Linux 2.6.9 lub podobny ), dołącz parametr noht do jądra podczas uruchamiania.
Ta opcja wiersza polecenia jądra została usunięta od co najmniej Linuksa 2.6.18 .
From http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :
Jeśli używasz lilo, edytuj /etc/lilo.conf (i uruchom lilo później) lub jeśli używasz gruba, edytuj plik /boot/grub/menu.lst.
źródło
noht
wpisu w wierszu poleceń jądra grub. System nie dotrzymałnoht
polecenia. To samo dla RHEL. Zobacz: bugzilla.redhat.com/show_bug.cgi?id=440321#c9noht
jądra została usunięta. Jest to niefortunne, ponieważ Linux umożliwia obejście niektórych błędów erraty licznika Haswell (BJ122, BV98, HSD29) tylko wtedy, gdy HT jest włączony , i dzieje się to przed załadowaniem initramfs.Możesz użyć „Thread_siblings_list” dla każdego rdzenia, aby wyłączyć drugi rdzeń w parze HT.
Poniższy potok poleceń jest zhackowany, niezoptymalizowany i ma nadzieję, że w ten sposób będzie łatwiejszy do zrozumienia.
więc weź wszystkie listy rodzeństwa wątków, wyodrębnij drugi procesor dla każdej pary, uzyskaj unikalną listę, a następnie wyłącz je.
Czy to ma sens?
jeśli zrobię „cat / proc / cpuinfo” po uruchomieniu powyższego, liczba rdzeni zostanie zmniejszona o połowę.
źródło
echo 0 > /sys/devices/system/cpu/cpu$X/online
staje sięecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
Nowsze jądra zapewniają kontrolę równoczesnego wielowątkowości (SMT).
Możesz sprawdzić stan SMT za pomocą;
Zmień stan za pomocą
Dostępne opcje;
Przetestowaliśmy to z jądrem Linux 4.4.0
źródło
Odpowiedź Lukasa jest miła, ale tak naprawdę nie działa w celu wyłączenia HT, ponieważ identyfikator rdzenia nie może służyć do identyfikacji rodzeństwa HT. Ten skrypt działa zamiast tego:
źródło
Musiałem czekać, aż będę mógł dostać się do ILO / Drac. Parametry rozruchowe jądra nie działają w bieżących dystrybucjach systemu Linux.
źródło
W pakiecie libsmbios-bin (Debian, Ubuntu itp.) Masz pliki binarne isCmosTokenActive i ActivCmosToken. Razem z listą tokenów możesz wypróbować coś takiego:
Następnie aktywuj token CPU_Hyperthreading_Disable:
Zweryfikować:
Teraz najważniejsze pytanie brzmi, czy po prostu potrzebujesz restartu, aby to zadziałało, czy też wymagany jest pełny cykl zasilania. Wypróbuj i zobacz, jak idzie!
źródło
Na podstawie informacji dostarczonych tutaj przez Paula M „skrypty” to w ten sposób:
Oczywiście nie wyłącza hiperwątkowości w tym samym sensie, co robiłoby to majsterkowanie w BIOS-ie , w zasadzie mówi tylko programowi zadań jądra, aby nie używał niektórych rdzeni, ponieważ wiemy, że są fałszywe.
Oprogramowanie, które przyjęło swoje założenie na podstawie poprzedniego stanu
/proc
lub/sys
podsystemu, może nadal działać nieoptymalnie lub nawet zawieść z powodu tej zmiany w czasie wykonywania, więc może być konieczne jego ponowne uruchomienie. Na przykład zauważyłem,irqbalance
że w takich okolicznościach był podatny na porażkę.źródło
Wyłącz HT:
Włącz HT:
Uwaga: To tak naprawdę nie wyłącza HyperThreading, ale wyłącza „fałszywe” rdzenie, uzyskując prawie taki sam wynik.
źródło
tee
, ale nadal nie zapewnia to prawdziwej odpowiedzi na pytanie. Te polecenia mają zastosowanie tylko do określonych konfiguracji sprzętowych i mogą mieć niezamierzony wpływ na inne konfiguracje sprzętowe. A wyjaśnienie tego, co robią te polecenia, jest całkowicie nieobecne.Stary temat, ale miał powód, by spróbować tego eksperymentu. Po pierwsze, nie jestem wcale pewien, czy wyłączenie (nieco fałszywych) procesorów w czasie wykonywania jest naprawdę równoważne wyłączeniu funkcji Hyperthreading przy starcie. To powiedziawszy, zauważyłem niewielki wzrost wydajności w naszej aplikacji. (Ale to za mało, aby zachować.)
Użył thread_siblings wartości (wspólny dla hyperthreaded CPU) jako klucz włączyć / wyłączyć:
Spróbuj wykonać polecenie bez ostatniego sudo sh, aby sprawdzić poprawność.
źródło