Kiedy uruchamiam moją maszynę wirtualną z Gentoo jako gościem, stwierdziłem, że istnieje znaczny narzut związany z funkcją tick_periodic
. (Jest to funkcja działająca przy każdym przerywaniu timera.) Ta funkcja aktualizuje globalną jiffy
przy użyciu write_seqlocks
, co prowadzi do narzutu.Obniżanie częstotliwości zegara jądra Linuksa
Oto grep z HZ
i odpowiednich rzeczy w moim pliku konfiguracyjnym jądra.
[email protected]:~$ cat /boot/config | egrep 'HZ|TIME'
# CONFIG_RCU_FAST_NO_HZ is not set
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_MACHZ_WDT is not set
CONFIG_TIMERFD=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_CYCLONE_TIMER=y
CONFIG_HPET_TIMER=y
Wyraźnie to ustawić konfigurację do 1000, ale kiedy robię sysconf(_SC_CLK_TCK)
, otrzymuję 100 jak mój częstotliwości zegara. Więc jaka jest częstotliwość timera mojego systemu?
Co chcę zrobić, to obniżyć częstotliwość do 100, jeszcze mniej, jeśli to możliwe. Chociaż może to wpłynąć na interaktywność i precyzję segmentów czasu w harmonogramie, jestem gotowy poświęcić te rzeczy, aby przerwać działanie mniejszego zegara, ponieważ przyspieszy to działanie maszyny wirtualnej.
Kiedy próbowałem dowiedzieć się, co należy zrobić, przeczytałem w pewnym miejscu, że można to zrobić, zmieniając w pliku konfiguracyjnym, w innym miejscu, gdzie przeczytałem, że dodanie dzielnika = 10 do parametru rozruchowego wykonuje zadanie, w przeciwnym razie gdzie czytałem, że żadna z nich nie jest potrzebna, jeśli można ustawić CONFIG_HIGH_RES_TIMERS
na uzyskanie krótkich czasomierzy o niskiej latencji, nawet bez zwiększania częstotliwości taktowania i to samo jest możliwe w systemie bez tupetu CONFIG_NO_HZ
.
Jestem całkowicie zdezorientowany, jeśli chodzi o właściwe podejście.
Wszystko, czego chcę, to zredukować przerwanie licznika do najniższego możliwego poziomu.
Czy mogę znać właściwy sposób robienia tego?
Jeśli wykonuję 'cat/proc/interrupts' 2 razy, widzę" Przerwy lokalnego zegara "rosnące między pierwszym i drugim wywołaniem. Ale ten oznaczony jako "timer IO-APIC-Edge" pozostaje taki sam pomiędzy 2 wywołaniami. Czy są też "Przerwania lokalny timer" działa na każdym procesorze odpowiedzialnym za inkrementację globalnej zmiennej czasowej 'jiffies', która zasadniczo rejestruje liczbę ticków od czasu rozruchu? Również "IRQ 0" odpowiada przerwie timera w 1. wierszu 'cat/proc/interrupts' ... więc domyślam się, że mam system' tickless' Przy okazji bardzo jasne wyjaśnienie ... dzięki – Deepthought
Nie martw się o I/O APIC, lokalne przerwania timera faktycznie pochodzą z lokalnego APIC, co jest zupełnie inną rzeczą. To, co widzisz jako IRQ 0, to zegar I/O APIC, który prawdopodobnie nie jest używany (z wyjątkiem może podczas rozruchu). Masz jednak rację twierdząc, że lokalny zegar przerywa jiffies inkrementacji. – jleahy
Hej, czytam timera z tej książki zwanej profesjonalną architekturą jądra Linuksa i trochę ze zrozumienia jądra Linux, ale ja wyraźnie nie rozumiem jeszcze procesu ... Muszę spróbować zmodyfikować kod, który aktualizuje jiffie w skuteczny sposób ... Czy możesz polecić dobre źródło, w którym mogę zrozumieć nie tylko teorię, ale także kod w jądrze, który wykonuje zadanie ... Dzięki – Deepthought