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_percent
moż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:
EDYCJA 2: Po dłuższym czytaniu zdecydowałem, że mogę być w stanie kernel.perf_event_max_sample_rate
wyzerować. 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_percent
jest 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_percent
na 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_rate
na 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:
Nie sądzę, że mogę tutaj wygrać. Formuła boolowska selected by
mó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?
CONFIG_HAVE_PERF_EVENTS=y
i CONFIG_PERF_EVENTS=y
. Nie sądzę, że ta niepełnosprawna perf.
-*-
oznacza, że niektóre podsystemy zależą od modułu perf. Help
pokazuje drzewo zależności, które należy wyłączyć, aby zmienić opcję na [*]
lub [M]
.