Portál AbcLinuxu, 29. října 2025 15:50
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.