|
27 | 27 | import json |
28 | 28 | import re |
29 | 29 | import shutil |
| 30 | +import threading |
30 | 31 | import time |
31 | 32 | from pathlib import Path |
32 | 33 | from typing import Dict, List, Tuple |
@@ -66,6 +67,27 @@ def timed_section(name: str, fn): |
66 | 67 | return result, dur, start_rss, end_rss |
67 | 68 |
|
68 | 69 |
|
| 70 | +def start_cpu_logger(interval_sec: int = 2): |
| 71 | + """Log process CPU% and RSS periodically without blocking main work.""" |
| 72 | + |
| 73 | + if not psutil: |
| 74 | + return None |
| 75 | + |
| 76 | + proc = psutil.Process() |
| 77 | + proc.cpu_percent(None) # prime |
| 78 | + stop_event = threading.Event() |
| 79 | + |
| 80 | + def _loop(): |
| 81 | + while not stop_event.wait(interval_sec): |
| 82 | + cpu = proc.cpu_percent(None) |
| 83 | + rss = proc.memory_info().rss / (1024 * 1024) |
| 84 | + print(f"[cpu] {cpu:5.1f}% | rss={rss:8.1f} MB") |
| 85 | + |
| 86 | + t = threading.Thread(target=_loop, daemon=True) |
| 87 | + t.start() |
| 88 | + return stop_event |
| 89 | + |
| 90 | + |
69 | 91 | # ------------------------- |
70 | 92 | # dataset helpers (reuse MSMARCO shard layout) |
71 | 93 | # ------------------------- |
@@ -435,6 +457,8 @@ def main(): |
435 | 457 | ) |
436 | 458 | args = ap.parse_args() |
437 | 459 |
|
| 460 | + stop_cpu = start_cpu_logger(2) |
| 461 | + |
438 | 462 | np.random.seed(args.seed) |
439 | 463 | eval_k = 50 |
440 | 464 |
|
@@ -670,6 +694,8 @@ def record(name: str, result, dur, rss_start, rss_end): |
670 | 694 | record("close_db_final", {}, dur, r0, r1) |
671 | 695 | except Exception: |
672 | 696 | pass |
| 697 | + if stop_cpu: |
| 698 | + stop_cpu.set() |
673 | 699 |
|
674 | 700 | db_size = dir_size_mb(db_path) |
675 | 701 | rss_after_vals = [ |
|
0 commit comments