gates / gates (push) Successful in 13m1s
Spike: per-app normal levels on three boxes (19-31 days), the off-site push as a line measure (a lower bound), qBittorrent/Transmission/Plex explainers measured on 9202, a tc ceiling measured (not built). Live on 9202 with 0.342.0-rc.1: limit set; real seed explained; CPU burner and the hidden flood alarmed once each and cleared once; the household's limit left alone. Teardown: apps removed, 9202 back on 0.341.0, receiver 9471 destroyed.
22 lines
1.2 KiB
Python
22 lines
1.2 KiB
Python
import sqlite3,sys,collections,datetime
|
|
for box in sys.argv[1:]:
|
|
db=sqlite3.connect(f'file:{box}/metrics.db?mode=ro',uri=True)
|
|
r=db.execute("select ts,net_tx_bytes from container_metrics where container_name='felhom-controller' order by ts").fetchall()
|
|
per=collections.defaultdict(list)
|
|
for (t0,a),(t1,b) in zip(r,r[1:]):
|
|
if a is None or b is None or b<a or not 0<t1-t0<=180: continue
|
|
d=datetime.datetime.utcfromtimestamp(t1)
|
|
per[d.date()].append((t1,(b-a)*8/(t1-t0)/1e6))
|
|
print(f'\n== {box.rsplit("/",1)[1]}: per UTC day — max 1-min, best 5-min mean, minutes above 5 Mbit/s, hour of the peak')
|
|
peaks=[]
|
|
for day in sorted(per):
|
|
v=per[day]; rates=[x[1] for x in v]
|
|
best5=max((sum(rates[i:i+5])/5 for i in range(max(1,len(rates)-4))),default=0)
|
|
m=max(v,key=lambda x:x[1])
|
|
busy=sum(1 for x in rates if x>5)
|
|
peaks.append(best5)
|
|
print(f'{day} max1={m[1]:6.2f} best5={best5:6.2f} busy_min={busy:4d} peak_at={datetime.datetime.utcfromtimestamp(m[0]):%H:%M}Z')
|
|
big=[p for p in peaks if p>2]
|
|
if big:
|
|
big.sort(); print(f'nights with a push (best5>2): {len(big)}; best5 min/median/max = {big[0]:.1f}/{big[len(big)//2]:.1f}/{big[-1]:.1f} Mbit/s')
|