Memory guard: 512MB hard cap, GC at 256MB, 2GB swap
This commit is contained in:
@@ -30,6 +30,34 @@ sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
|||||||
from config.fee_tiers import get_perp_fees, PERPS_TIERS, STAKING_TIERS, STRATEGY_FEE_MODELS
|
from config.fee_tiers import get_perp_fees, PERPS_TIERS, STAKING_TIERS, STRATEGY_FEE_MODELS
|
||||||
from common.risk import risk_summary
|
from common.risk import risk_summary
|
||||||
from strategies.quant_report import compute_quant_report
|
from strategies.quant_report import compute_quant_report
|
||||||
|
|
||||||
|
# ═══════════════════════════════════════════════════════════
|
||||||
|
# Memory guard: cap RSS at 512MB, GC-aggressive at 256MB
|
||||||
|
# ═══════════════════════════════════════════════════════════
|
||||||
|
import resource, gc, signal
|
||||||
|
|
||||||
|
MEM_SOFT_LIMIT = 256 * 1024 * 1024 # 256 MB — force GC
|
||||||
|
MEM_HARD_LIMIT = 512 * 1024 * 1024 # 512 MB — terminate
|
||||||
|
|
||||||
|
resource.setrlimit(resource.RLIMIT_AS, (MEM_HARD_LIMIT, MEM_HARD_LIMIT))
|
||||||
|
|
||||||
|
def check_memory():
|
||||||
|
"""Check RSS, force GC if over soft limit, raise if over hard limit."""
|
||||||
|
try:
|
||||||
|
with open("/proc/self/status") as f:
|
||||||
|
for line in f:
|
||||||
|
if line.startswith("VmRSS:"):
|
||||||
|
rss_kb = int(line.split()[1])
|
||||||
|
rss = rss_kb * 1024
|
||||||
|
if rss > MEM_HARD_LIMIT:
|
||||||
|
print(f"[CRIT] RSS {rss_kb // 1024}MB > 512MB — exiting", flush=True)
|
||||||
|
os._exit(1)
|
||||||
|
if rss > MEM_SOFT_LIMIT:
|
||||||
|
gc.collect()
|
||||||
|
gc.collect()
|
||||||
|
return
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
import uvicorn
|
import uvicorn
|
||||||
|
|
||||||
# ═══════════════════════════════════════════════════════════
|
# ═══════════════════════════════════════════════════════════
|
||||||
@@ -110,6 +138,7 @@ def broadcast_loop():
|
|||||||
"""Continuously read metrics and broadcast to all clients."""
|
"""Continuously read metrics and broadcast to all clients."""
|
||||||
while True:
|
while True:
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
check_memory()
|
||||||
data = read_metrics()
|
data = read_metrics()
|
||||||
payload = json.dumps(data, default=str)
|
payload = json.dumps(data, default=str)
|
||||||
for ws in list(connected_clients):
|
for ws in list(connected_clients):
|
||||||
|
|||||||
Reference in New Issue
Block a user