Mercurial > repos > other > usr-local-bin
annotate load-record @ 32:ccc8f0903d2e
Use scheduling to keep better time
Our previous approach just hoped that we kept to time, but long
processing would slowly make our "sleep" periods wrong. This is
especially likely at 0.1s (versus longer sleeps).
author | IBBoard <dev@ibboard.co.uk> |
---|---|
date | Sat, 27 Feb 2021 15:39:36 +0000 |
parents | c2584db4a650 |
children |
rev | line source |
---|---|
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
1 #! /usr/bin/env python3 |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
2 |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
3 import psutil |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
4 import os |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
5 import os.path |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
6 import rrdtool |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
7 import sched |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
8 import subprocess |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
9 import threading |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
10 |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
11 from pathlib import Path |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
12 |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
13 home = str(Path.home()) |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
14 DB = os.path.join(home, ".load.rrd") |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
15 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
16 cpus = psutil.cpu_count() |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
17 |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
18 config = [ |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
19 ['load_1', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
20 ['load_5', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
21 ['load_15', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
22 *[[f'core{i+1}', 'GAUGE', 2, 0, 100] for i in range(cpus)], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
23 ['core_avg', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
24 ['GPU', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
25 ['user', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
26 ['system', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
27 ['iowait', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
28 ['mem_used', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
29 ['mem_buffers', 'GAUGE', 2, 0, 100], |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
30 ] |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
31 |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
32 fields = len(config) |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
33 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
34 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
35 def needs_creating(): |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
36 if not os.path.exists(DB): |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
37 return True |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
38 else: |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
39 cur_config = rrdtool.info(DB) |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
40 for i, entry in enumerate(config): |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
41 key, datatype, heartbeat, minval, maxval = entry |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
42 if f"ds[{key}].index" not in cur_config or \ |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
43 cur_config[f"ds[{key}].index"] != i: |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
44 return True |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
45 elif cur_config[f"ds[{key}].type"] != datatype or \ |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
46 cur_config[f"ds[{key}].minimal_heartbeat"] != heartbeat: |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
47 # We don't appear to be able to check min/max from info |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
48 return True |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
49 # TODO: Check RRA definitions based on rra[i].cf, rra[i].pdp_per_row and rra[i].rows |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
50 return False |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
51 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
52 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
53 # TODO: Add "pressure" support - relies on "psi=1" in kernel and /proc/pressure/… existing |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
54 if needs_creating(): |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
55 rrdtool.create(DB, '--step', '1', |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
56 *[f'DS:{key}:{datatype}:{heartbeat}:{minval}:{maxval}' for \ |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
57 key, datatype, heartbeat, minval, maxval in config], |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
58 'RRA:AVERAGE:0.5:1:3600', #1hr of 1s interval (averaged) |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
59 'RRA:MAX:0.5:60:360', #6hrs of 1 minute |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
60 'RRA:MAX:0.5:300:8640') #and 1mo of 5m resolution |
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
61 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
62 samples = 10 |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
63 gpu_idx = 3 + cpus + 1 |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
64 last_avg_idx = 3 + cpus + 2 # load + CPUs + CPU average + GPU |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
65 total_mem = psutil.virtual_memory().total |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
66 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
67 # Note: We use some global variables on the assumption that: |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
68 # 1) We just need "the latest" gpu_val value |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
69 # 2) Because gpu_val is numeric then it can't be "inconsistent" |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
70 # 3) The use of the scheduler and its priorities ensures that |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
71 # the record_interims and record_record functions happen in sequence |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
72 # 4) The record_interims function takes under 1/samples seconds to run |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
73 # |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
74 # If this ever fails, we need to look at multiprocessing.Value and .Array |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
75 gpu_val = 0 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
76 interims = [[0] * samples for _ in range(fields)] |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
77 pos = 0 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
78 |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
79 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
80 def parse_nvidia_output(): |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
81 global gpu_val |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
82 nv_smi = subprocess.Popen(['nvidia-smi', 'dmon', '-s', 'u'], |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
83 stdout=subprocess.PIPE, |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
84 universal_newlines=True) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
85 while True: |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
86 # Readline blocks, so this thread will update as and when new values are available |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
87 line = nv_smi.stdout.readline() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
88 if line and line[0] != '#': |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
89 gpu_val = int(line[8:11]) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
90 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
91 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
92 def record_interims(): |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
93 global pos |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
94 scheduler.enter(1.0/samples, 1, record_interims) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
95 cur_pos = pos |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
96 pos = (pos + 1) % samples |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
97 cpu_pcs = psutil.cpu_percent(percpu=True) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
98 cpu_pc = sum(cpu_pcs) / cpus |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
99 #TODO: If cpu_pc > 25% (?) log top processes |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
100 cpu_states_pc = psutil.cpu_times_percent() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
101 loads = os.getloadavg() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
102 mem = psutil.virtual_memory() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
103 i = 0 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
104 interims[i][cur_pos] = loads[0] |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
105 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
106 interims[i][cur_pos] = loads[1] |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
107 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
108 interims[i][cur_pos] = loads[2] |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
109 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
110 for a_cpu_pc in cpu_pcs: |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
111 interims[i][cur_pos] = a_cpu_pc |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
112 i = i + 1 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
113 interims[i][cur_pos] = cpu_pc |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
114 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
115 interims[i][cur_pos] = 0 # Placeholder for GPU |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
116 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
117 interims[i][cur_pos] = cpu_states_pc.user |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
118 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
119 interims[i][cur_pos] = cpu_states_pc.system |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
120 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
121 interims[i][cur_pos] = cpu_states_pc.iowait |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
122 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
123 interims[i][cur_pos] = (mem.used / total_mem) * 100 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
124 i = i + 1 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
125 interims[i][cur_pos] = ((mem.buffers + mem.cached) / total_mem) * 100 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
126 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
127 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
128 def record_record(): |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
129 global gpu_val, gpu_idx |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
130 scheduler.enter(1, 2, record_record) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
131 vals = [0] * fields |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
132 for i, interim_vals in enumerate(interims): |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
133 if i < last_avg_idx: |
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
134 # Average most values |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
135 vals[i] = sum(interim_vals) / samples |
19
e245a271fc44
Add scripts for recording/displaying CPU and GPU activity
IBBoard <dev@ibboard.co.uk>
parents:
diff
changeset
|
136 else: |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
137 # But take the max CPU state value and memory usage |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
138 vals[i] = max(interim_vals) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
139 |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
140 vals[gpu_idx] = gpu_val |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
141 rrdtool.update(DB, "N:{}".format(':'.join(str(val) for val in vals))) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
142 |
29
c2584db4a650
Make load recording more flexible and efficient
IBBoard <dev@ibboard.co.uk>
parents:
19
diff
changeset
|
143 |
32
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
144 nv_thread = threading.Thread(target=parse_nvidia_output) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
145 nv_thread.start() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
146 scheduler = sched.scheduler() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
147 # Let record_interims run and schedule itself |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
148 record_interims() |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
149 # Schedule record recording for 1s later so we've got a set of values, and then it'll schedule future calls |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
150 scheduler.enter(1, 2, record_record) |
ccc8f0903d2e
Use scheduling to keep better time
IBBoard <dev@ibboard.co.uk>
parents:
29
diff
changeset
|
151 scheduler.run() |