2013-02-17 17 views
14

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?

Odpowiedz

15

Nie martw się! Twoje zamieszanie to nic innego, jak się spodziewano. Przerwania timera dla systemu Linux są bardzo mylące i mają długą i ekscytującą historię.

CLK_TCK

Linux ma wywołanie systemowe sysconf i glibc jest tylko zwrócenie stałą wartość 100. Niestety.

HZ < - co prawdopodobnie chcesz

Podczas konfigurowania jądra można wybrać częstotliwość zegara z obu 100Hz, 250Hz, 300Hz lub 1000Hz. Wszystkie te są obsługiwane i chociaż 1000 Hz jest domyślne, nie zawsze jest to najlepsze.

Ludzie zazwyczaj wybierają wysoką wartość, gdy wartość opóźnienia (komputer stacjonarny lub serwer WWW) i niską wartość, gdy wartość przepustowość (HPC).

CONFIG_HIGH_RES_TIMERS

To nie ma nic wspólnego z przerwań timera, to po prostu mechanizm, który pozwala mieć wyższe zegary rozdzielczości. Zasadniczo oznacza to, że limity czasu na połączenia, takie jak select, mogą być dokładniejsze niż 1/HZ sekund.

dzielnik opcja wiersza

Polecenie to jest łatka dostarczone przez Red Hat. Prawdopodobnie możesz tego użyć (jeśli używasz Red Hat lub CentOS), ale byłbym ostrożny. To spowodowało wiele błędów i prawdopodobnie powinieneś po prostu dokonać rekompilacji z inną wartością Hz.

CONFIG_NO_HZ

To naprawdę nie robi wiele, to na oszczędzanie energii i oznacza to, że kleszcze zatrzyma się (lub przynajmniej stają się rzadsze), gdy nic nie jest wykonywany. To prawdopodobnie jest już włączone w twoim jądrze. Nie ma znaczenia, kiedy przynajmniej jedno zadanie można uruchomić.

Fryderyk Weisbecker ma na razie poprawkę, która uogólnia to na przypadki, w których działa tylko jedno zadanie, ale jest jeszcze trochę daleko.

+1

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

+0

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

+0

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