fix 1
Browse files
guard.py
CHANGED
|
@@ -29,10 +29,11 @@ try:
|
|
| 29 |
except ImportError:
|
| 30 |
_HAS_PSUTIL = False
|
| 31 |
|
| 32 |
-
#
|
| 33 |
-
#
|
| 34 |
-
#
|
| 35 |
-
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
snapshot.mark(stage)
|
| 106 |
if not _HAS_PSUTIL:
|
| 107 |
return
|
| 108 |
-
|
| 109 |
-
|
|
|
|
| 110 |
raise MemoryError(
|
| 111 |
-
f"
|
| 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 |
|