Taktowanie Raspberry Pi: governor CPU a dławienie oraz co raportuje vcgencmd get_throttled

Spis treści
Raspberry Pi meldujące 700 MHz tam, gdzie na papierze stoi 1500, wygląda jak komputer, który się poddał. Odczyt jest prawdziwy, a mimo to najczęściej nic nie jest zepsute.
Tę liczbę obniżają dwa zupełnie różne zjawiska i nie mają one ze sobą nic wspólnego. Jedno to system operacyjny oszczędzający prąd. Drugie to firmware chroniący płytkę. Jedno polecenie mówi, które z nich właśnie działa.

Dwa powody, jeden widok
Pierwszy powód jest zwyczajny i zamierzony. Linux prowadzi mały kawałek programu, którego całym zadaniem jest niedopuszczenie, by procesor pracował szybciej, niż wymaga tego praca. Między dwoma zadaniami obniża taktowanie i podnosi je w tej samej chwili, w której coś nadchodzi.
Drugi powód to ochrona płytki. Gdy napięcie zasilania spada albo układ robi się za gorący, firmware sam obniża taktowanie, niezależnie od systemu operacyjnego, aby zapobiec nieprawidłowej pracy płytki. To jest dławienie i stanowi objaw innego problemu.
Oba dają ten sam odczyt przy tym samym poleceniu. Samo taktowanie nie rozdzieli tych dwóch rzeczy i właśnie dlatego tyle całkowicie zdrowych płytek zostaje spisanych na straty.
Regulator i jego dziesięć stopni
Kawałek programu, który zajmuje się codziennym obniżaniem, nazywa się regulatorem, a na niezmienionym Raspberry Pi OS jest nim ondemand.
Zmierzona tutaj płytka oferuje dziesięć stopni: 600, 700, 800, 900, 1000, 1100, 1200, 1300, 1400 i 1500 MHz. Regulator wybiera między nimi nieprzerwanie, w zakresie milisekund, według tego, jak zajęte były ostatnio rdzenie.
Niski odczyt jest zatem migawką chwili, a nie stanem. Dwadzieścia prób w ciągu sześciu sekund trafiło dziewiętnaście razy na 1500 MHz i raz na 600 MHz – i właśnie ta jedna próba, wzięta osobno, wyglądałaby niepokojąco.
Co melduje get_throttled
Polecenie, które rozstrzyga sprawę, brzmi vcgencmd get_throttled. Odpowiada jedną liczbą szesnastkową, a liczba ta jest szeregiem przełączników, nie pomiarem.
Każdy przełącznik odpowiada jednemu warunkowi: napięcie zasilania za niskie, taktowanie ograniczone, dławienie, osiągnięta miękka granica temperatury. Przełącznik włączony znaczy, że warunek zachodzi. Cała liczba na zerze znaczy, że nie zachodzi żaden.
Rzecz najważniejsza: ten rejestr nie wie nic o regulatorze. Oszczędzanie prądu nie ustawia ani jednego bitu. Taktowanie 600 MHz obok throttled=0x0 nie jest więc sprzecznością, tylko odpowiedzią.

Liczba ma dwie połowy
W tym miejscu odczyt bywa najczęściej mylnie rozumiany. Cztery dolne bity opisują chwilę obecną. Kolejne cztery, szesnaście miejsc wyżej, notują, czy ten sam warunek zaszedł kiedykolwiek od ostatniego startu.
Krótki spadek napięcia o trzeciej nad ranem nie jest już widoczny w bitach bieżących przy śniadaniu, ale bity trwałe nadal go odnotowują. Jednorazowy odczyt rejestru w spokojnej chwili i zera w dolnej połowie dowodzą tylko, że w tym momencie nie występuje żaden z rejestrowanych warunków.
Połowa trwała jest ponadto czyszczona przy każdym starcie. Zera na komputerze pracującym od minuty nie znaczą zupełnie nic; te same zera po trzech tygodniach pracy znaczą bardzo dużo.
Co zameldowała prawdziwa płytka
Zmierzona tutaj płytka to Raspberry Pi 4 Model B, dziewiętnaście godzin po starcie, wydająca tę stronę w trakcie pomiaru.
Rejestr meldował w każdej pojedynczej próbie 0x0, w obu połowach, także w tej próbie, która złapała taktowanie przy 600 MHz. Temperatura utrzymywała się nieprzerwanie między 57,4 a 59,9 °C. Dziennik jądra nie zawierał ani jednego wpisu o napięciu czy dławieniu.
Ustawienie jest niezmienione: arm_freq=1500, żadnej ręcznie ustawionej granicy temperatury, regulator nietknięty. Niczego tutaj nie przygotowano tak, by wyszedł czysty wynik.
Co sprawdzić, gdy podejrzenie zostaje
Tam, gdzie bity trwałe są ustawione, przyczyna leży częściej po stronie zasilacza niż gorąca, a jądro ułatwia sprawdzenie. Obok czujnika temperatury udostępnia czujnik o nazwie rpi_volt i wpisuje linijkę do dziennika jądra, gdy tylko zasilanie spadnie. Pusty dziennik sam w sobie jest wynikiem.
Gdy podejrzewasz przegrzewanie, mierz temperaturę w serii, gdy płytka pracuje pod obciążeniem, zamiast polegać na pojedynczym odczycie. Wartość odczytana po minucie spoczynku mówi bardzo niewiele.
A tam, gdzie całą skargą jest samo taktowanie, rejestr prowadzi do odpowiedzi najkrótszą drogą: jedno polecenie, jedna liczba, a w niej różnica między odpoczywającym procesorem a płytką w kłopotach.
Pytania i odpowiedzi
Jak da się ręcznie rozszyfrować wartość taką jak 0x50000?
Liczba zostaje rozłożona na bity, a każdy ustawiony bit oznacza jeden warunek. Dokumentacja Raspberry Pi przypisuje je następująco:
- bit 0 (0x1): napięcie za niskie, teraz
- bit 1 (0x2): taktowanie ograniczone, teraz
- bit 2 (0x4): dławienie, teraz
- bit 3 (0x8): miękka granica temperatury aktywna, teraz
- bity 16–19 (0x10000, 0x20000, 0x40000, 0x80000): te same cztery warunki, kiedykolwiek od startu
0x50000 to suma 0x10000 i 0x40000: od startu co najmniej raz wystąpiło za niskie napięcie i co najmniej raz dławienie, a w tej chwili nie zachodzi żadne z nich. Taki wzór pasuje do zasilacza, którego napięcie spada pod obciążeniem i wraca w spokojnych chwilach. Odczyt 0x50005 oznacza natomiast, że oba warunki zachodzą także w tej chwili.
Dlaczego Raspberry Pi na ładowarce do telefonu zgłasza za niskie napięcie, choć na ładowarce widnieje 5 V?
Ponieważ liczy się to, co dociera do płytki, a nie to, co jest nadrukowane na ładowarce. Każdy kabel ma opór i pod obciążeniem spada na nim napięcie; cienkie, długie kable tracą przy tym więcej niż krótkie i grube. Zasilacz dający dokładnie 5,0 V nie ma na tę stratę żadnego zapasu, dlatego oficjalny zasilacz do Raspberry Pi 4 daje 5,1 V przy prądzie do 3 A.
Niektóre ładowarki do telefonów są ponadto zaprojektowane na mniejsze prądy albo pozwalają napięciu opaść pod obciążeniem. Spadek przypada wtedy dokładnie na chwile, w których pracują wszystkie rdzenie, i dlatego bity trwałe mogą być ustawione, choć każdy odczyt w spoczynku wygląda czysto.
Czy pomaga przestawienie regulatora na performance?
Na odczyt tak, na dławienie nie. Przy performance taktowanie pozostaje wysokie także w spoczynku, ale firmware nadal dławi ponad głową systemu operacyjnego, gdy napięcie spada albo układ robi się za gorący. Stale wysokie taktowanie wytwarza przy tym więcej ciepła i przybliża płytkę do miękkiej granicy temperatury.