Portál AbcLinuxu, 10. května 2025 01:24

Dotaz: ondemand, sampling_rate, rychlost změny frekvence

10.5.2007 00:43 Jan Martinek | skóre: 43 | blog: johny | Brno
ondemand, sampling_rate, rychlost změny frekvence
Přečteno: 654×
Odpovědět | Admin
Zdravím, svým dotazem navazuji na tuto diskusi o frekvenci procesoru
http://www.abclinuxu.cz/forum/show/179537
která je ale v této chvíli už překošatělá.
Zcela jistě má smysl regulovat frekvenci procesoru i na desktopu - za rok provozu jsou náklady na elektřinu srovnatelné s pořizovací cenou procesoru ( a to mluvím pouze o penězích).
Druhou stránkou věci je to, že se frekvence procesoru musí zvýšit dostatečně rychle při zvýšené zátěži, jinak se počítač jeví líný. Jestliže mám zapnutý ondemand governor:
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
a jestliže nastavím, aby se frekvence zvýšila už při 20% zátěži
echo 20 > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/up_threshold
a jestliže nechám samplovat zátěž co nejčastěji
echo $(cat /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min) > \
/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate
tak to stejně není dostatečné, protože nejnižší hodnota pro samplovací periodu je 620000 mikrosekund, tedy něco přes půl sekundy. A to už je bohužel poznat. Mohu názorně demonstrovat:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time

fncur = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq'
fnmin = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq'
fnmax = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

class CPUgov:
    def __init__(self):
        self.minfreq = self.readintfromfile(fnmin)
        self.maxfreq = self.readintfromfile(fnmax)

    def readintfromfile(self, fn):
        return int(file(fn).read())

    def getfreq(self):
        return self.readintfromfile(fncur)

    def waitforfall(self):
        stamp = time.time()
        while self.getfreq() != self.minfreq:
            time.sleep(0.01)
        return time.time() - stamp

    def waitforrise(self):
        stamp = time.time()
        while self.getfreq() != self.maxfreq:
            pass
        return time.time() - stamp

cpu = CPUgov()
while True:
    print 'rise:', cpu.waitforrise()
    print 'fall:', cpu.waitforfall()
Frekvence se skutečně zvýší až po cca 0.6 sekundách, což je pro interaktivní práci (např. přepínání mezi okny, renderování html) příliš dlouho. Takže se chci zeptat, jak snížit hodnotu v
/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min
Díky
Nástroje: Začni sledovat (4) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

10.5.2007 08:39 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zjistil jsem další věc. Na jiném počítači (notebook, Mobile AMD Athlon(tm) XP 2800+) je hodnota v
/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min
pouze 100000, tedy desetina sekundy. A skutečně se to velmi projeví v ochotě zvyšovat frekvenci. Ale přece to nemůže záviset na hardwaru. Nebo ano?
Josef Kufner avatar 10.5.2007 09:20 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Odpovědět | | Sbalit | Link | Blokovat | Admin
Zkusil bych:
echo "požadovaná hodnota" > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_min
Přičemž ona požadovaná hodnota bude ze .../scaling_available_frequencies.
Hello world ! Segmentation fault (core dumped)
10.5.2007 09:52 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
No, mě šlo o něco trochu jiného. Frekvence procesoru se přepíná mezi správnými hodnotami (to měnit nemusím), ale governor reaguje příliš pozdě na změnu zátěže.
Reakční doba se sice dá nastavit v souboru
/sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate
ale nejnižší nastavitelná hodnota je sampling_rate_min. A ta je dle mého názoru příliš vysoká.
Josef Kufner avatar 10.5.2007 20:43 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
No vždyť.
Hello world ! Segmentation fault (core dumped)
10.5.2007 21:14 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
No, zapomněl jsem podotknout hlavní kámen úrazu - že sampling_rate_min je read-only soubor.
Josef Kufner avatar 10.5.2007 21:56 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Aha, tak to by mohl být trošku problém. Toho jsem si nějak nevšiml ;-)
Hello world ! Segmentation fault (core dumped)
10.5.2007 21:44 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Odpovědět | | Sbalit | Link | Blokovat | Admin
Aha, tady si toho taky někdo všiml (a snad to popsal líp než já). http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/6b4c5005900a9f08/acc0776dd0b9c08c?lnk=raot
nekompilujete zrovna někdo nové jádro, že byste zkusili něco změnit v cpufreq_ondemand.c? Myslím, že tahle věc musí vadit všem, co používají jaderný ondemand governor.
10.5.2007 23:21 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jaká je minimální frekvence, kterou si ten procesor umí nastavit? Zkusil jsem ten tvůj skript a frekvence se mi přepne až po 1.2s, přesto žádné výrazné zpomalení nepozoruju, všechny programy reagují svižně. (AMD Athlon X2, minimální frekvence je 1GHz)
Quando omni flunkus moritati
11.5.2007 08:51 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Až za 1.2 sekundy? Tak to je ještě horší než u mě (mám 0.62). Jasně, je to hnidopišství, 1GHz je pořád ještě dost slušná mašina. Ale když něco dělám v inkscapu, gimpu, prohlížeči apod. tak se frekvence mnohdy přepne s křížkem po funuse a přijde mi to jako škoda.
11.5.2007 00:06 Lu-Tze | skóre: 15 | blog: Lu-Tzeho blog
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Odpovědět | | Sbalit | Link | Blokovat | Admin
A nebylo by lepší, kdyby to jelo na max po celou dobu, co počítač používáš, a teprve když odejdeš, tak aby nastoupilo řízení frekvence? Se spuštěním screensaveru zapnout řízení, s vypnutím vypnout, třeba.
11.5.2007 09:03 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
To by bylo spíš obcházení problému. Navíc se zdá, že náprava nebude složitá. V jádře je tohle:
static unsigned int def_sampling_rate;
#define MIN_SAMPLING_RATE_RATIO                 (2)
/* for correct statistics, we need at least 10 ticks between each measure */
#define MIN_STAT_SAMPLING_RATE                  \
                        (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
#define MIN_SAMPLING_RATE                       \
                        (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
#define MAX_SAMPLING_RATE                       (500 * def_sampling_rate)
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER    (1000)
#define TRANSITION_LATENCY_LIMIT                (10 * 1000)
Zkusím si s tím trochu pohrát. Mám (na druhém počítači) vyzkoušeno, že když ondemand zareaguje za 0.1 sekundy, tak je to už úplně v pohodě a nepoznám žádnou prodlevu.
11.5.2007 10:20 Lu-Tze | skóre: 15 | blog: Lu-Tzeho blog
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Tak mě se zdá, že při tvých podmínkách by mohlo docházet ke změně frekvence docela často. Třeba při každém načtení webové stránky, zobrazení další stránky v pdf dokumentu atd. Nevím, jestli vysoká frekvence zmeny frekvence cpu nevadí... A docela by mě zajímalo, kolik času při tomhle nastavení pojede procesor stejně na max. A vyšší frekvence vzorkování to taky určitě trošinku ovlivní :-)
11.5.2007 11:09 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: ondemand, sampling_rate, rychlost změny frekvence
Chci ji měnit (nejvýše) desetkrát za sekundu, což mi vůbec nepřijde často. Vzhledem k tomu, že P-state transition latency bývá 10 až 100 mikrosekund, tak jsem naprosto klidný. Viz
http://softwarecommunity.intel.com/isn/Community/en-US/forums/30234265/ShowThread.aspx
Jestli vyšší frekvence vzorkování bude mít na něco vliv, to pochybuju. Schválně zkus číst 10x za sekundu soubor /proc/stat. Pro systém je to zcela neměřitelná zátěž.
A kolik procent času stráví procesor na své max. frekvenci? Taky by mě to zajímalo. Jdu měřit:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import time

fncur = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq'
fnmin = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq'
fnmax = '/sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq'

class CPUgov:
    def __init__(self):
        self.minfreq = self.readintfromfile(fnmin)
        self.maxfreq = self.readintfromfile(fnmax)
        self.samples_high = 0
        self.samples_low = 0

    def readintfromfile(self, fn):
        return int(file(fn).read())

    def getfreq(self):
        return self.readintfromfile(fncur)

    def measure(self):
        freq = self.getfreq()
        if freq == self.minfreq:
            self.samples_low += 1
        else:
            self.samples_high += 1

cpu = CPUgov()
while True:
    cpu.measure()
    N100 = (cpu.samples_high + cpu.samples_low) * 0.01
    print 'high: %5.2f%%  low:%5.2f%%' %(cpu.samples_high / N100,
                                         cpu.samples_low / N100)
    time.sleep(1)
Zkuste tohle nechat běžet hodinu, dvě, tři ... den, dva, tři ...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.