@cryptotaxi247 / netdata-1 / commits / 865aedf6b

cpufreq.chart.py: use much more accurate accounting for average CPU frequency

The way I was tracking it before was bad because if we were too early or late reading the time_in_state file, we might get really bogus results. Signed-off-by: Steven Noonan <steven@uplinklabs.net>

Steven Noonan committed Sep 9, 2017 at 08:54 UTC 865aedf6bfd26d96b887c92be68bcbadc2a0f7eb
1 file changed +19 -8
python.d/cpufreq.chart.py
+19 -8
@@ -38,20 +38,31 @@ class Service(SimpleService):
38 data = {}
39
40 if self.accurate_exists:
41 - elapsed = time.time() - self.timetable['last']
42 -
41 accurate_ok = True
42
43 for name, paths in self.assignment.items():
44 last = self.accurate_last[name]
47 - current = 0
45 +
46 + current = {}
47 + deltas = {}
48 + ticks_since_last = 0
49 +
50 for line in open(paths['accurate'], 'r'):
51 line = list(map(int, line.split()))
50 - current += (line[0] * line[1]) / 100
51 - delta = current - last
52 - data[name] = delta
52 + current[line[0]] = line[1]
53 + ticks = line[1] - last.get(line[0], 0)
54 + ticks_since_last += ticks
55 + deltas[line[0]] = line[1] - last.get(line[0], 0)
56 +
57 + avg_freq = 0
58 + if ticks_since_last != 0:
59 + for frequency, ticks in deltas.items():
60 + avg_freq += frequency * ticks
61 + avg_freq /= ticks_since_last
62 +
63 + data[name] = avg_freq
64 self.accurate_last[name] = current
54 - if delta == 0 or abs(delta) > 1e7:
65 + if avg_freq == 0 or ticks_since_last == 0:
66 # Delta is either too large or nonexistent, fall back to
67 # less accurate reading. This can happen if we switch
68 # to/from the 'schedutil' governor, which doesn't report
@@ -81,7 +92,7 @@ class Service(SimpleService):
92 if cpu not in self.assignment:
93 self.assignment[cpu] = {}
94 self.assignment[cpu]['accurate'] = path
84 - self.accurate_last[cpu] = 0
95 + self.accurate_last[cpu] = {}
96
97 if len(self.assignment) == 0:
98 self.accurate_exists = False