Jak ustawić regulator skalowania częstotliwości procesora dla wszystkich rdzeni jednocześnie?

37

Chciałbym ustawić regulator skalowania częstotliwości procesora dla wszystkich rdzeni jednocześnie, zamiast robić to indywidualnie dla każdego rdzenia. Czy jest na to sposób?

(Wiem, że echo gubernatora byłoby łatwe /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor, ale nie szukam niestandardowego rozwiązania).

htorque
źródło
2
„Niestandardowe rozwiązanie” oznacza, że ​​skrypt powłoki jest niedopuszczalny, musi to być wbudowany przycisk GUI?
jg-faustus
Zastanawiam się tylko, czy istnieje już rozwiązanie w standardowej instalacji (nie musi mieć GUI).
htorque
Sprawdź tę stronę: idebian.wordpress.com/2008/06/22/cpu-frequency-scaling-in-linux w sekcji „Implementacja debian”: Najwyraźniej można zmienić domyślną wersję rozruchową, a istnieje narzędzie przestrzeni użytkownika o nazwie powernowd. (To jest komentarz, a nie odpowiedź, ponieważ post pochodzi z 2008 roku, a ja nie testowałem, czy nadal działa ...)
jg-faustus

Odpowiedzi:

25

Nadal jestem linobem noob, ale nie sądzisz, że cpufrequtils pozwala ci to zrobić za pomocą (nie jest zawarte w systemie Ubuntu, ale jest w repozytorium)

sudo apt-get install cpufrequtils
sudo cpufreq-set -r -g performance
  • -rFlaga jest używany do ustawiania zmiany dla wszystkich ( „wszyscy związany ze sprzętem”) rdzeni
użytkownik49449
źródło
6
Opcja -r nie robi tego dla wszystkich rdzeni. Musimy podać numer procesora z opcją -c <numer>, jednak ten skrypt zrobi to dla wszystkich procesorów za jednym razem: for ((i = 0; i <$ (nproc); i ++)); wykonaj cpufreq-set -c $ i -r -g wydajność; gotowe
Sri
6
Dokładnie @Sri ma rację. cpufreq-setw rzeczywistości brakuje mu ostatecznie prostej, ale potrzebnej funkcjonalności. Wiele osób, jak pokazują te liczniki głosów, po prostu nie zdaje sobie z tego sprawy, ponieważ jego opis wprowadza w błąd.
poige
2
Kto daje te +1 bez testowania ???? To w ogóle nie działa. Opublikowałem najprostsze działające rozwiązanie, jakie udało mi się znaleźć.
switch87
20

Często googlowałem i myślę, że to po prostu niemożliwe, dlatego dodałem do mojej strony następującą linijkę .bashrc:

function setgov ()
{
    echo "$1" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}

Teraz mogę uruchomić coś podobnego, setgov ondemanda wszystkie rdzenie zostaną przełączone na gubernatora na żądanie .

htorque
źródło
2
To nie działa, ponieważ plik scaling_governor jest własnością root i ma ograniczone uprawnienia. Zmiana uprawnień nie zawsze jest zalecana.
Sri
Proszę zobaczyć alternatywny skrypt w moim komentarzu do odpowiedzi user49449.
Sri
6

najkrótsza komenda zmiany gubernatora wszystkich rdzeni jest następująca:

sudo bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'

Możesz dodać go do .bashrc jak wspomniano w htorque, będziesz musiał uruchomić go jako root sudo setgov performance:

function setgov ()
{
     for i in {0..7}; 
     do 
         cpufreq-set -c $i -g $1; 
     done
}
switch87
źródło
2

Równie dobrze możemy dodać uzupełnianie kodu bash, gdy już nad tym pracujemy:

function setgovernor () {
    echo "$1" | sudo tee 
    /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 
}
complete -W "$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors)" setgovernor
Ray Malanga
źródło
2

Sposób, w jaki ustawiłem tę opcję, ponieważ gubernator domyślnie powraca do powerave po około 30 sekundach od wersji Ubuntu 16.04 lub nowszej (korzystam z Ubuntu Mate);

  1. Wpisz ten (jeden wiersz) kod (dziękuję, dzięki uprzejmości switch87 w poprzedniej odpowiedzi)

    sleep 60 && bash -c 'for i in {0..7}; do cpufreq-set -c $i -g performance; done'
    
  2. do pliku w katalogu

    /etc/rc.local
    

Mój jest linią powyżej „wyjścia 0” i bez komentarza, pod komentarzem.

„rc.local” dla tych, którzy nie wiedzą, uruchamia polecenie jako sudo. Wydaje się, że każde polecenie zmiany gubernatora musi być wykonywane jako sudo.

Pozwala gubernatorowi zresetować do powerave i uruchamia kod jako sudo po 60 sekundach, aby przywrócić go do wydajności.

Zmień „60” (w kopiowanym kodzie) na dowolny czas (w sekundach. 60 = 60 sekund = 1 minuta), musisz opóźnić polecenie i „wydajność” (w części poleceń) na jaki gubernator ma to zrobić zmień na.

Z moich godzin poszukiwań nie znalazłem bardziej trwałego rozwiązania tego problemu. Doszedłem do wniosku, że to kilka minut na oszczędzanie energii, jeśli jest to najlepsza poprawka, jaką znalazłem, prawda? Dobrze.

Nie jest to najlepsza poprawka, ale sprawia, że ​​jest trochę trwała po tym, jak robi małą zmianę na powerave. Jeśli chcesz uruchomić się od razu i wskoczyć do gry lub czegoś innego, musisz poczekać minutę na kod, który właśnie wstawiłeś, aby przełączyć go z oszczędzania energii lub zmniejszyć na nim czas (w zależności od tego, ile czasu to zajmie wszystko, aby uruchomić, aby poprawnie przełączyło się ponownie na wydajność).

I, jak zawsze, aby powrócić do ustawień domyślnych (widziałem pewne problemy z przegrzewaniem się komputerów osobistych i dlatego mogliby ustawić go na PowerSave w pierwszej kolejności), po prostu usuń kod z pliku rc.local i uruchom go ponownie lub przełącz go z powrotem ręcznie za pomocą przełącznika lub ikony wskaźnika procesora;

 sudo /etc/init.d/cpufrequtils restart

w terminalu i / lub uruchom ponownie.

Roiikka
źródło
1

Możesz to zrobić dla wszystkich rdzeni jednocześnie, uruchamiając

sudo cpupower frequency-set --governor performance
Martin Andersson
źródło
0

Na podstawie odpowiedzi switch87 stworzyłem prosty skrypt cpufreq-set-all, który pozwoli robić inne cpufreq-setrzeczy ze wszystkimi procesorami:

   #!/bin/bash
   MAX_CPU=$((`nproc --all` - 1))
   for i in $(seq 0 $MAX_CPU); do
       echo "Changing CPU " $i " with parameter "$@;
       cpufreq-set -c $i $@ ;
   done

Teraz można go wywołać (po chmod +x, oczywiście) w następujący sposób:

cpufreq-set-all -g powersave

lub

cpufreq-set-all -f 800Mhz
side2k
źródło