Jak zmienić częstotliwość przełączania kontekstu w systemie Linux?


17

Jak można zmienić częstotliwość przełączania kontekstu w Linuksie (Linaro, Ubuntu, Debian)?

Nie przeszkadza mi zamiana mniej responsywnego systemu na bardziej wydajny.

EDYCJA 1: Mam główny proces, który chcę uruchomić tak szybko, jak to możliwe (maksymalne cykle zegara na sekundę), więc pomyślałem o zmniejszeniu częstotliwości przełączania kontekstu (= zwiększenie przedziału czasu). Pytanie brzmi, jak to zrobić i czy miałby to znaczący wpływ. Czy mogę obliczyć koszt zmiany kontekstu? Czy mogę oszacować, jeśli zwiększę przedział czasu o dwa, jaki będzie mój wzrost wydajności w% dla głównego procesu, na którym mi zależy?


1
Spodziewałbym się, że efekt tego ustawienia będzie minimalny i odpowiedni tylko wtedy, gdy uruchomisz więcej procesów niż rdzeni procesora. Jeśli żadne inne zadania nie czekają na konkretny procesor, nie ma nawet potrzeby ustawiania timera przełączania zadań w krótkim czasie, ponieważ wszystko, co mogłoby spowodować uruchomienie innego zadania, byłoby wywołaniem systemowym lub przerwaniem sprzętowym, z których oba zwróci procesor do jądra.
Simon Richter,

Przykro mi, że jestem głupi, ale czy ktoś mógłby wyjaśnić, co oznacza „częstotliwość przełączania kontekstu” w kontekście tego pytania?
user1717828,

@sourcejedi zobacz mój EDIT1 - czy mogę oszacować poprawę przepustowości w% po zmniejszeniu częstotliwości przełączania kontekstu?
Nadav B

@NadavB Odpowiednio zredagowałem swoją odpowiedź. Konkretne pomiary są najlepsze podczas optymalizacji. Nie musisz jednak traktować tego jak czarnej skrzynki, na przykład możesz użyć perf do pomiaru braków pamięci podręcznej, jeśli twój procesor jest dobry. AIUI, różne typy braków pamięci podręcznej procesora (w tym brak TLB) są najważniejszymi indywidualnymi kosztami przełączania kontekstu.
sourcejedi

Odpowiedzi:


17

Jeśli twoje zadanie jest jedynym procesem żądającym czasu na konkretnym procesorze, nie będzie przełączania kontekstu między zadaniami :-). Ale procesor może być nadal przerywany, powodując zmianę kontekstu w jądrze iz powrotem. Jedną z możliwych przyczyn jest licznik czasu wyprzedzającego, sprawdzający, czy na tym procesorze jest inne zadanie ...

Linux może uniknąć generowania przerwań czasomierza wyprzedzającego na jednostce centralnej, gdy nie będzie żadnego powodu, aby to zrobić. Zobaczyć CONFIG_NO_HZ_FULL. Aby użyć tej funkcji, należy ją włączyć podczas budowania jądra i włączyć ją przy użyciu opcji rozruchu.

Domyślnie żaden procesor nie będzie procesorem dopasowującym. Parametr rozruchowy „nohz_full =” określa procesory adaptacyjne. Na przykład „nohz_full = 1,6-8” mówi, że procesory 1, 6, 7 i 8 mają być procesorami adaptacyjnymi. Uwaga: zabrania się oznaczania wszystkich procesorów jako procesorów z adaptacyjnym tykaniem [...]

LWN.net mówi „według Ingo Molnar zaoszczędzi nawet 1% czasu procesora” na procesory z adaptacyjnym tikiem. Dokument jądra mówi, że wiąże się to z sześcioma różnymi kosztami, a także istnieje lista „ZNANYCH PROBLEMÓW”.

Zysk ten jest stosunkowo niewielki, szczególnie w porównaniu z potencjalnym wzrostem przepustowości wynikającym ze zmniejszenia częstotliwości przełączania kontekstu między wieloma zadaniami, jak wspomniano w odpowiedzi: Jak zmienić długość przedziałów czasowych używanych przez program planujący procesor w systemie Linux?

Mały wydruk: te pomiary są wcześniejsze niż obsługa ASID Spectre, Meltdown, KPTI i x86 :-(. Myślę, że dotyczą one również nieco starszego sprzętu. Zapytaj eksperta od jądra lub przeprowadź własne pomiary, jak koszt przełączników kontekstu ma zmieniono na konkretną wersję jądra i sprzęt ... PTI miał być w dużej mierze złagodzony przez ASID, z wyjątkiem oprogramowania, które bardzo często wywołuje jądro, czego głównym przykładem są bazy danych. Ale nie rozumiem dobrze liczb .

Nadzieja Molnara w oryginalnej łatce RFC była taka, że ​​z czasem „prawdopodobnie zostanie ona włączona przez większość dystrybucji Linuksa”. Zauważam, że Fedora 28 zapewnia domyślne jądro zbudowane z NO_HZ_FULLobsługą. Jednak Debian 9 nie.


Niedawno Linux v4.17 usuwa resztkowenohz_full taktowanie zegara 1 Hz z procesorów . Wyobrażam sobie, że wpływ na przepustowość jest dość niewielki :-), ale starałem się śledzić status NO_HZ_FULLkorzyści, gdy procesor ma wiele uruchomionych procesów -

gdy osiągniemy 0 Hz, możemy [następnie] usunąć założenie okresowego tykania również z nr_running> = 2, w zasadzie przerywając zajęte zadania tylko tak często, jak wymagają tego ograniczenia harmonogramu_latencji - raz na 4-40 ms, w zależności od nr_running .

Jest to nieco mylące, ponieważ uprzedzanie rozpoczęło się już przy użyciu osobnego, bardziej precyzyjnego haczyka z powrotem w v2.6.25-rc1, commit 8f4d37ec073c, „harmonogram: kleszcza z wyprzedzeniem wysokiej rozdzielczości” . Znaleziono za pomocą tego komentarza do tego samego artykułu LWN.net: https://lwn.net/Articles/549754/ ).


co z kernel.sched_rr_timeslice_ms?
Nadav B

1
@NadavB, jeśli korzystasz z zadań harmonogramu_rr w czasie rzeczywistym, powiedz tak. To jest specjalistyczny temat. Jeśli nie, to nie :-).
sourcejedi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.