| |
| """OB-1b: decompose the added cost of leasing per byte and per lease |
| event, across every K this program has measured. |
| |
| THE QUESTION THIS ANSWERS. The prereg section 3 says the knee is |
| predicted to sit below K=4 "UNLESS an unmeasured cost floor (fixed per-lease- |
| event overhead, not just bytes moved) dominates at very small K". That is a |
| real possibility and it is testable: if the cost were purely proportional to |
| bytes moved, then read seconds per byte and verify seconds per byte would be |
| FLAT across K. If instead there is a fixed charge per lease event, the per-BYTE |
| figures would climb as K falls, because smaller K means more events for a given |
| volume... except that in this design every lease event moves exactly the same |
| 13253760 bytes, so per-event and per-byte cost carry the same information and a |
| per-event floor cannot be separated from a per-byte one by arithmetic alone. |
| What CAN be separated is whether the observed rate degrades at all as K falls. |
| |
| Reads the engine's own ob1-stats.txt from OB-1's run directories and this leg's, |
| so every figure is literal file content, not a transcription from a document. |
| """ |
|
|
| import os |
| import sys |
|
|
| PER_EXPERT = 13253760 |
| DIRS = ["/root/ob1/runs", "/root/ob1b/runs"] |
|
|
|
|
| def read_stats(path): |
| d = {} |
| with open(path) as f: |
| for line in f: |
| line = line.strip() |
| if "=" in line: |
| k, v = line.split("=", 1) |
| d[k] = v |
| return d |
|
|
|
|
| def main(): |
| rows = [] |
| for base in DIRS: |
| if not os.path.isdir(base): |
| continue |
| for n in sorted(os.listdir(base)): |
| sp = os.path.join(base, n, "ob1-stats.txt") |
| if not os.path.exists(sp) or n.startswith("smoke"): |
| continue |
| st = read_stats(sp) |
| if st.get("ob1_mode") != "lease": |
| continue |
| ev = int(st.get("lease_events", 0)) |
| by = int(st.get("lease_bytes_read", 0)) |
| if not ev or not by: |
| continue |
| rows.append(dict( |
| src=os.path.basename(base), name=n, k=int(st.get("ob1_k", -1)), |
| events=ev, bytes=by, |
| fadv=int(st.get("ob1_fadvise", 0)), |
| read_s=int(st.get("lease_read_ns", 0)) / 1e9, |
| ver_s=int(st.get("lease_verify_ns", 0)) / 1e9, |
| drop_s=int(st.get("lease_drop_ns", 0)) / 1e9, |
| )) |
|
|
| if not rows: |
| print("(no leased runs with stats found yet)") |
| return |
|
|
| print("== BYTES PER LEASE EVENT (must be exactly one expert's share, %d) ==" % PER_EXPERT) |
| bad = 0 |
| for r in rows: |
| q = r["bytes"] / float(r["events"]) |
| if abs(q - PER_EXPERT) > 0.5: |
| bad += 1 |
| print(" %-22s %.1f DIFFERS" % (r["name"], q)) |
| print(" %d of %d runs move exactly %d bytes per lease event" % ( |
| len(rows) - bad, len(rows), PER_EXPERT)) |
|
|
| print() |
| print("== READ AND VERIFY RATE VERSUS K ==") |
| print(" A fixed per-event overhead that dominates at small K would show up as") |
| print(" these GB/s columns FALLING sharply as K falls. Flat columns mean cost") |
| print(" tracks bytes moved, which is the case builder 1's prediction assumed.") |
| print() |
| print(" %-6s %-22s %3s %10s %16s %10s %10s %10s %10s %5s" % ( |
| "leg", "run", "K", "events", "bytes", "read_GB/s", "ver_GB/s", |
| "read_ms/ev", "ver_ms/ev", "fadv")) |
| for r in sorted(rows, key=lambda x: (-x["k"], x["name"])): |
| rg = (r["bytes"] / r["read_s"] / 1e9) if r["read_s"] else 0.0 |
| vg = (r["bytes"] / r["ver_s"] / 1e9) if r["ver_s"] else 0.0 |
| print(" %-6s %-22s %3d %10d %16d %10.4f %10.4f %10.4f %10.4f %5d" % ( |
| r["src"], r["name"], r["k"], r["events"], r["bytes"], rg, vg, |
| r["read_s"] * 1e3 / r["events"], r["ver_s"] * 1e3 / r["events"], r["fadv"])) |
|
|
| print() |
| print("== RATE AT THE EXTREMES (the floor question, stated as a ratio) ==") |
| |
| |
| |
| |
| warm = [r for r in rows if not r["fadv"]] |
| print(" (page-cache-dropping runs excluded: %d of %d rows)" % ( |
| len(rows) - len(warm), len(rows))) |
| rows_agg = warm |
| ks = sorted({r["k"] for r in rows_agg}) |
| if len(ks) >= 2: |
| hi = [r for r in rows_agg if r["k"] == max(ks)] |
| lo = [r for r in rows_agg if r["k"] == min(ks)] |
| def mean(rs, f): |
| return sum(f(r) for r in rs) / float(len(rs)) |
| rh = mean(hi, lambda r: r["bytes"] / r["read_s"] / 1e9) |
| rl = mean(lo, lambda r: r["bytes"] / r["read_s"] / 1e9) |
| vh = mean(hi, lambda r: r["bytes"] / r["ver_s"] / 1e9) |
| vl = mean(lo, lambda r: r["bytes"] / r["ver_s"] / 1e9) |
| print(" highest K measured = %d : read %.4f GB/s, verify %.4f GB/s" % (max(ks), rh, vh)) |
| print(" lowest K measured = %d : read %.4f GB/s, verify %.4f GB/s" % (min(ks), rl, vl)) |
| print(" read rate at lowest K is %.4f x the rate at highest K" % (rl / rh if rh else 0)) |
| print(" verify rate at lowest K is %.4f x the rate at highest K" % (vl / vh if vh else 0)) |
| print(" NOTE: runs from different legs used different thread counts and ran") |
| print(" under different sibling load, so treat cross-leg rows as indicative.") |
|
|
|
|
| if __name__ == "__main__": |
| sys.exit(main()) |
|
|