hleserg commited on
Commit
1da9931
·
1 Parent(s): 02ecd57
Files changed (1) hide show
  1. guard.py +17 -10
guard.py CHANGED
@@ -29,10 +29,11 @@ try:
29
  except ImportError:
30
  _HAS_PSUTIL = False
31
 
32
- # порог аварийного торможения: выше сами бросаем MemoryError, не дожидаясь SIGKILL.
33
- # 90%, а не 99%, потому что память прыгает скачками одель, нарезка) нужен запас
34
- # на один рывок между проверкой и следующим тяжёлым шагом.
35
- MEM_GUARD_PCT = 90.0
 
36
 
37
  TG_TOKEN = os.environ.get("TG_BOT_TOKEN")
38
  TG_CHAT = os.environ.get("TG_CHAT_ID")
@@ -100,16 +101,22 @@ class MemorySnapshot:
100
 
101
 
102
  def memory_guard(snapshot: MemorySnapshot, stage: str):
103
- """Проверка перед тяжёлым шагом. Отмечает этап и, если память за порогом,
104
- бросает MemoryError ПОКА ЖИВЫ (чтобы краш был перехватываемым)."""
 
 
 
 
 
105
  snapshot.mark(stage)
106
  if not _HAS_PSUTIL:
107
  return
108
- pct = psutil.virtual_memory().percent
109
- if pct >= MEM_GUARD_PCT:
 
110
  raise MemoryError(
111
- f"Память {pct:.0f}% >= порога {MEM_GUARD_PCT:.0f}% перед этапом «{stage}». "
112
- f"Аварийная остановка до OOM-kill."
113
  )
114
 
115
 
 
29
  except ImportError:
30
  _HAS_PSUTIL = False
31
 
32
+ # 0.5 ГБ — реальный край на любой среде. Выше ставить нельзя: на free-Space
33
+ # память тесная и фоново занята, резерв в 1-1.5 ГБ давал бы ложную тревогу на
34
+ # старте (что и случилось с percent-порогом). 0.5 ГБ срабатывает только когда
35
+ # памяти правда почти не осталось — перед самым OOM-kill.
36
+ MEM_RESERVE_GB = 0.5
37
 
38
  TG_TOKEN = os.environ.get("TG_BOT_TOKEN")
39
  TG_CHAT = os.environ.get("TG_CHAT_ID")
 
101
 
102
 
103
  def memory_guard(snapshot: MemorySnapshot, stage: str):
104
+ """Проверка перед тяжёлым шагом. Бросает MemoryError ПОКА ЖИВЫ, если
105
+ ДОСТУПНОЙ памяти осталось меньше резерва чтобы краш был перехватываемым.
106
+
107
+ Мерим available (сколько ещё можно занять), а НЕ percent: на Spaces системный
108
+ percent фоново высокий (контейнер делит память), и percent>=90 на старте — это
109
+ норма, а не тревога. available же честно говорит, сколько реально осталось.
110
+ """
111
  snapshot.mark(stage)
112
  if not _HAS_PSUTIL:
113
  return
114
+ vm = psutil.virtual_memory()
115
+ avail_gb = vm.available / _GB
116
+ if avail_gb < MEM_RESERVE_GB:
117
  raise MemoryError(
118
+ f"Свободно лишь {avail_gb:.2f} ГБ (< резерва {MEM_RESERVE_GB} ГБ) "
119
+ f"перед этапом «{stage}». Аварийная остановка до OOM-kill."
120
  )
121
 
122