Jak wyłączyć podsystem perf w jądrze Linuksa?

15

Korzystam z testów porównawczych. Mój tester biegaczy monitoruje bufor dmesg między eksperymentami, szukając wszystkiego, co mogłoby wpłynąć na wydajność. Dzisiaj rzuciło to na:

[2015-08-17 10:20:14 OSTRZEŻENIE] Wygląda na to, że dmesg się zmieniło! Zróżnicowane następuje:
--- 2015-08-17 09:55:00
+++ 17.08.2015 10:20:14
@@ -825,3 +825,4 @@
 [3.802206] [drm] Włączanie stanów RC6: RC6 włączony, RC6p wyłączony, RC6pp wyłączony
 [7.900533] r8169 0000: 06: 00.0 eth0: link up
 [7.900541] IPv6: ADDRCONF (NETDEV_CHANGE): eth0: link staje się gotowy
+ [236832.221937] przerwanie perf trwało zbyt długo (2504> 2500), obniżając jądro.perf_event_max_sample_rate do 50000

Po kilku poszukiwaniach wiem, że dotyczy to podsystemu profilowania w jądrze linuksa o nazwie „perf”. Nie sądzę, żebyśmy tego potrzebowali, więc chciałbym całkowicie to wyłączyć.

Przeszukując ponownie, okazuje się, że sysctl perf_cpu_time_max_percentmoże pomóc. Tutaj ktoś sugeruje wyłączenie, ustawiając na 0. Czytając to trochę więcej tutaj :

perf_cpu_time_max_percent:

Wskazuje jądro, ile czasu procesor powinien wykorzystać do obsługi zdarzeń próbkowania perf. Jeśli podsystem perf zostanie poinformowany, że jego próbki przekraczają ten limit, spadnie częstotliwość próbkowania, aby spróbować zmniejszyć zużycie procesora.

Niektóre próby próbkowania mają miejsce w NMI. Jeśli wykonanie tych próbek nieoczekiwanie potrwa zbyt długo, NMI mogą zostać tak ułożone obok siebie, że nic innego nie będzie mogło zostać wykonane.

0: wyłącz mechanizm. Nie monitoruj ani nie koryguj częstotliwości próbkowania perf bez względu na czas procesora.

1-100: spróbuj zmniejszyć częstotliwość próbkowania perf do tego procentu procesora. Uwaga: jądro oblicza „oczekiwaną” długość każdego zdarzenia przykładowego. 100 oznacza tutaj 100% oczekiwanej długości. Nawet jeśli jest ustawiona na 100, nadal może wystąpić dławienie próbki, jeśli ta długość zostanie przekroczona. Ustaw na 0, jeśli naprawdę nie zależy ci na zużyciu procesora.

Brzmi dla mnie jak 0, co oznacza, że ​​częstotliwość próbkowania profilowania nie jest już sprawdzana, ale podsystem freq nadal działa (?).

Czy ktoś może rzucić światło na to, jak całkowicie wyłączyć profilowanie jądra za pomocą freq?

EDYCJA: Ktoś zasugerował, że spróbuję zbudować jądro bez perf, ale nie sądzę, żeby to było w ogóle możliwe. Ta opcja nie wydaje się przełączalna:

menuconfig

EDYCJA 2: Po dłuższym czytaniu zdecydowałem, że mogę być w stanie kernel.perf_event_max_sample_ratewyzerować. Tzn. Brak próbek na sekundę. Jednak nie możesz tego zrobić ( źródło ):

commit 02f98e3e36da106338b7c732fed516420fb20e2a
Autor: Knut Petersen 
Data: śr. 25 września 14:29:37 2013 +0200

perf: Wymusza 1 jako dolny limit dla perf_event_max_sample_rate

EDYCJA 3: FWIW, perf_cpu_time_max_percentjest ustawiony na 25, co oznacza, że ​​jądro spędzało ponad 25% swojego czasu próbkowania rejestrów sprzętowych. Jest to niedopuszczalne w przypadku maszyny do testów porównawczych.

Jestem teraz pewien, że ustawienie perf_cpu_time_max_percentna zero tylko pogorszy sytuację, ponieważ jądro będzie nadal używać ponad 25% swojego czasu podczas odczytu rejestrów sprzętowych. Błąd uruchamia się w celu dostosowania częstotliwości próbkowania, starając się w ten sposób upewnić się, że jądro osiągnie limit wykorzystania <25% swojego czasu na perf. 25% to wciąż zbyt wysoki IMHO.

Jeśli naprawdę nie mogę wyłączyć perf, prawdopodobnie najlepszym kompromisem byłoby ustawienie perf_event_max_sample_ratena 1.

EDYCJA 4: Przyjaciel zasugerował, że mogłem źle zinterpretować znaczenie perf_cpu_time_max_percent, więc powyższe stwierdzenia mogą być niepoprawne. Wartość 25 wskazuje, że jądro wykorzystało ponad 25% dowolnej arbitralnej długości, którą zarezerwowało do obsługi przerwań perf.

EDYCJA 5:

Jak wskazano w komentarzach, -*-opcja przeciw perf sugeruje, że funkcja jest wymuszana przez inną włączoną funkcję. Jeśli zajrzę, zobaczysz help, które funkcje to:

Wsparcie

Nie sądzę, że mogę tutaj wygrać. Formuła boolowska selected bymówi

Jeśli celujesz w X86 lub ...

Właśnie sprawdziłem, czy kierowanie na X86_64 rzeczywiście umożliwia CONFIG_X86. Wygląda więc na to, że gdy tylko celujesz w X86 lub X86_64, dostajesz perf.

Chciałbym więc nieco zmienić moje pytanie na:

Jakich ustawień perf mogę użyć, aby zminimalizować czas spędzany przez jądro w procedurach perf?

Należy pamiętać, że nadrzędnym celem jest kontrola źródeł losowej zmienności do celów analizy porównawczej. Jeśli nie mogę wyłączyć perf, jak mogę zminimalizować jego wpływ na testy porównawcze?

Edd Barrett
źródło
1
Powinieneś być w stanie wyłączyć perf na poprzednim ekranie.
Michael Hampton
1
Masz na myśli „Wsparcie profilowania”? Jeśli to wyłączę, nadal nie mogę odznaczyć opcji pokazanej powyżej. Również jeśli sprawdzę .config, mam CONFIG_HAVE_PERF_EVENTS=yi CONFIG_PERF_EVENTS=y. Nie sądzę, że ta niepełnosprawna perf.
Edd Barrett,
2
Wiadomość ma charakter informacyjny. Jądro automatycznie określa częstotliwość próbkowania, której można użyć bez wpływu na wydajność systemu, i rejestruje ją, nawet gdy perf nie jest aktywny lub nawet zainstalowany. Gdy obciążenie systemu jest wyższe lub występuje skalowanie częstotliwości, często otrzymujesz te komunikaty.
Brian
1
Symbol -*-oznacza, że ​​niektóre podsystemy zależą od modułu perf. Helppokazuje drzewo zależności, które należy wyłączyć, aby zmienić opcję na [*]lub [M].
Rufo El Magufo
4
Poprawiłem pytanie, aby wziąć to pod uwagę. Krótko mówiąc, perf wydaje się być obowiązkowy na X86_64.
Edd Barrett,

Odpowiedzi:

2

Wyłącz opcję jądra [HAVE_PERF_EVENTS] i ponownie skompiluj jądro Linux.

John Greene
źródło