Portál AbcLinuxu, 10. května 2025 01:24
echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governora 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_thresholda 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_ratetak 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
echo "požadovaná hodnota" > /sys/devices/system/cpu/cpu0/cpufreq/ondemand/sampling_rate_minPřičemž ona požadovaná hodnota bude ze .../scaling_available_frequencies.
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.
#!/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 ...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.