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.
nano /etc/rc.local
# place this near the end before the "exit 0"
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
CPUID=$(basename $CPU)
echo "CPU: $CPUID";
if test -e $CPU/online; then
echo "1" > $CPU/online;
fi;
COREID="$(cat $CPU/topology/core_id)";
eval "COREENABLE=\"\${core${COREID}enable}\"";
if ${COREENABLE:-true}; then
echo "${CPU} core=${CORE} -> enable"
eval "core${COREID}enable='false'";
else
echo "$CPU core=${CORE} -> disable";
echo "0" > "$CPU/online";
fi;
done;
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.
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.