Update idle time configuration and documentation

- Increased default values for IDLE_MINUTES from 30 to 60 and IDLE_GRACE_MINUTES from 45 to 90 across configuration files and documentation.
- Updated related documentation to reflect the new default idle time settings, ensuring consistency in user guidance and system behavior.
This commit is contained in:
Leonid Pershin
2026-08-21 07:24:09 +03:00
parent 000661e04f
commit 7343fb0e83
11 changed files with 17 additions and 17 deletions
+1 -1
View File
@@ -133,7 +133,7 @@ Killer молчит:
Учётные данные на VM: application credential (или роль без `compute:create`), только delete/shelve. Файл не попадает в Output/Models. Истечение кредов = killer слеп; тогда спасает `gpu-rent status` с ноутбука. Учётные данные на VM: application credential (или роль без `compute:create`), только delete/shelve. Файл не попадает в Output/Models. Истечение кредов = killer слеп; тогда спасает `gpu-rent status` с ноутбука.
Дефолты: `IDLE_MINUTES=30`, `IDLE_GRACE_MINUTES=45`. Дефолты: `IDLE_MINUTES=60`, `IDLE_GRACE_MINUTES=90`.
## Watchdog туннеля (на ноутбуке) ## Watchdog туннеля (на ноутбуке)
+2 -2
View File
@@ -200,8 +200,8 @@ FLAVOR_FALLBACK=true
SCAN_POOLS=ru-6,ru-7 SCAN_POOLS=ru-6,ru-7
DEFAULT_SPOT=true DEFAULT_SPOT=true
KEEP_FLOATING_IP=false KEEP_FLOATING_IP=false
IDLE_MINUTES=30 IDLE_MINUTES=60
IDLE_GRACE_MINUTES=45 IDLE_GRACE_MINUTES=90
# LOCAL_WATCHDOG_GRACE_MINUTES=10 # LOCAL_WATCHDOG_GRACE_MINUTES=10
PULL_OUTPUT=false PULL_OUTPUT=false
NOTIFY_READY=true NOTIFY_READY=true
+1 -1
View File
@@ -87,7 +87,7 @@ ComfyUI в `dlbackend` качается всегда. Речь только о *
8. Первый старт SwarmUI (папки чекпоинтов уже не пустые → установщик не предлагает свой SD; Extensions и Autocompletions уже на месте). 8. Первый старт SwarmUI (папки чекпоинтов уже не пустые → установщик не предлагает свой SD; Extensions и Autocompletions уже на месте).
9. Ждать backend Idle, затем вооружить idle-killer. 9. Ждать backend Idle, затем вооружить idle-killer.
Качание нескольких GB легко длиннее льготы 45 минут. Поэтому killer не живёт, пока не закончился seed. Качание нескольких GB легко длиннее льготы 90 минут. Поэтому killer не живёт, пока не закончился seed.
Позже тот же код: `gpu-rent seed-models` — докачать новые строки манифеста на уже живой диск (идемпотентно). Позже тот же код: `gpu-rent seed-models` — докачать новые строки манифеста на уже живой диск (идемпотентно).
+1 -1
View File
@@ -10,4 +10,4 @@
- App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules. - App cred с узкими access_rules на Selectel: код fail closed; на spike убедиться, что Keystone принимает rules.
- Snapshot attached boot после Idle: время; create from snapshot ок. - Snapshot attached boot после Idle: время; create from snapshot ок.
Если 45 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer. Если 90 мин льготы мало на первый Comfy — подними `IDLE_GRACE_MINUTES`, не отключай killer.
+1 -1
View File
@@ -65,7 +65,7 @@
- [x] Clone `extensions.yaml` в Extensions / DLNodes до старта UI - [x] Clone `extensions.yaml` в Extensions / DLNodes до старта UI
- [x] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha - [x] Autocomplete: danbooru.csv + Settings.fds; на каждом up — GitHub sha
- [x] Civitai seed по манифесту; без токена — дефолт SwarmUI - [x] Civitai seed по манифесту; без токена — дефолт SwarmUI
- [x] systemd idle-killer + application credential; льгота 45 мин; hold-файл; очередь/loading = busy; затем 30 мин пустой очереди; вооружение после seed/start (качалка UI = hold) - [x] systemd idle-killer + application credential; льгота 90 мин; hold-файл; очередь/loading = busy; затем 60 мин пустой очереди; вооружение после seed/start (качалка UI = hold)
- [x] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть - [x] Один snapshot `gpu-rent-boot-ok` после первого backend Idle; следующие create — из snapshot если есть
- [x] `gpu-rent hold` / `hold --clear` по SSH - [x] `gpu-rent hold` / `hold --clear` по SSH
- [x] `ready` по HTTP, затем backend Idle - [x] `ready` по HTTP, затем backend Idle
+1 -1
View File
@@ -273,7 +273,7 @@ copy models.example.yaml models.yaml
- **GPU** — пока жив compute. - **GPU** — пока жив compute.
- **Data-диск** — тарифицируется **всегда** после создания. - **Data-диск** — тарифицируется **всегда** после создания.
- Preemptible ~**24 ч** → `EXPIRED`; `tunnel` или `up` восстановят. - Preemptible ~**24 ч** → `EXPIRED`; `tunnel` или `up` восстановят.
- Idle-killer: после льготы (~45 мин) + ~30 мин пустой очереди → delete compute. - Idle-killer: после льготы (~90 мин) + ~60 мин пустой очереди → delete compute.
- Цены в OpenStack API нет — смотри панель Selectel. - Цены в OpenStack API нет — смотри панель Selectel.
Дальше: чеклист живого прогона [spike-notes.md](spike-notes.md), справочник команд [cli.md](cli.md). Дальше: чеклист живого прогона [spike-notes.md](spike-notes.md), справочник команд [cli.md](cli.md).
+1 -1
View File
@@ -120,7 +120,7 @@
- Имя GPU-образа в пуле: - Имя GPU-образа в пуле:
- Реальные flavor id (не в git): - Реальные flavor id (не в git):
- Хватает ли `IDLE_GRACE_MINUTES=45`: - Хватает ли `IDLE_GRACE_MINUTES=90`:
- Application credential с узкими access_rules: ок / ошибка (fail closed): - Application credential с узкими access_rules: ок / ошибка (fail closed):
- Прочее: - Прочее:
+2 -2
View File
@@ -57,8 +57,8 @@ FLAVOR_FALLBACK=true
SCAN_POOLS=ru-6,ru-7 SCAN_POOLS=ru-6,ru-7
DEFAULT_SPOT=true DEFAULT_SPOT=true
KEEP_FLOATING_IP=false KEEP_FLOATING_IP=false
IDLE_MINUTES=30 IDLE_MINUTES=60
IDLE_GRACE_MINUTES=45 IDLE_GRACE_MINUTES=90
# Optional local safety net (after: gpu-rent watchdog install) # Optional local safety net (after: gpu-rent watchdog install)
# LOCAL_WATCHDOG_GRACE_MINUTES=10 # LOCAL_WATCHDOG_GRACE_MINUTES=10
PULL_OUTPUT=false PULL_OUTPUT=false
+2 -2
View File
@@ -23,8 +23,8 @@
# LLM_RUNTIME=none # LLM_RUNTIME=none
# OLLAMA_LOCAL_PORT=17811 # OLLAMA_LOCAL_PORT=17811
# LLAMACPP_LOCAL_PORT=17812 # LLAMACPP_LOCAL_PORT=17812
# IDLE_MINUTES=30 # IDLE_MINUTES=60
# IDLE_GRACE_MINUTES=45 # IDLE_GRACE_MINUTES=90
# LOCAL_WATCHDOG_GRACE_MINUTES=10 # LOCAL_WATCHDOG_GRACE_MINUTES=10
# NOTIFY_READY=true # NOTIFY_READY=true
# PULL_OUTPUT=false # PULL_OUTPUT=false
+2 -2
View File
@@ -250,8 +250,8 @@ def load_config(*, require_auth: bool = True) -> Config:
scan_pools=(os.environ.get("SCAN_POOLS") or "ru-6,ru-7").strip(), scan_pools=(os.environ.get("SCAN_POOLS") or "ru-6,ru-7").strip(),
default_spot=_as_bool(os.environ.get("DEFAULT_SPOT"), True), default_spot=_as_bool(os.environ.get("DEFAULT_SPOT"), True),
keep_floating_ip=_as_bool(os.environ.get("KEEP_FLOATING_IP"), False), keep_floating_ip=_as_bool(os.environ.get("KEEP_FLOATING_IP"), False),
idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 30), idle_minutes=_as_int(os.environ.get("IDLE_MINUTES"), 60),
idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 45), idle_grace_minutes=_as_int(os.environ.get("IDLE_GRACE_MINUTES"), 90),
pull_output=_as_bool(os.environ.get("PULL_OUTPUT"), False), pull_output=_as_bool(os.environ.get("PULL_OUTPUT"), False),
notify_ready=_as_bool(os.environ.get("NOTIFY_READY"), True), notify_ready=_as_bool(os.environ.get("NOTIFY_READY"), True),
selectel_api_token=(os.environ.get("SELECTEL_API_TOKEN") or "").strip(), selectel_api_token=(os.environ.get("SELECTEL_API_TOKEN") or "").strip(),
+3 -3
View File
@@ -18,7 +18,7 @@ ARMED = DATA / ".gpu-rent-killer-armed"
LOG = DATA / ".gpu-rent-killer.log" LOG = DATA / ".gpu-rent-killer.log"
SERVER_ID_FILE = DATA / ".gpu-rent-server-id" SERVER_ID_FILE = DATA / ".gpu-rent-server-id"
# After this many seconds of continuous Swarm unreachable → treat as idle (don't bill forever). # After this many seconds of continuous Swarm unreachable → treat as idle (don't bill forever).
SWARM_UNREACHABLE_IDLE_SEC = 60 * 60 SWARM_UNREACHABLE_IDLE_SEC = 2 * 60 * 60
def log(msg: str) -> None: def log(msg: str) -> None:
@@ -242,7 +242,7 @@ def main() -> int:
now = time.time() now = time.time()
grace_from = float(creds.get("grace_from") or 0) grace_from = float(creds.get("grace_from") or 0)
grace_minutes = float(creds.get("grace_minutes") or 45) grace_minutes = float(creds.get("grace_minutes") or 90)
if now < grace_from + grace_minutes * 60: if now < grace_from + grace_minutes * 60:
left = int(grace_from + grace_minutes * 60 - now) left = int(grace_from + grace_minutes * 60 - now)
log(f"grace {left}s left") log(f"grace {left}s left")
@@ -269,7 +269,7 @@ def main() -> int:
log(f"busy: {llm_detail}") log(f"busy: {llm_detail}")
return 0 return 0
idle_minutes = float(creds.get("idle_minutes") or 30) idle_minutes = float(creds.get("idle_minutes") or 60)
since = read_ts(IDLE_SINCE) since = read_ts(IDLE_SINCE)
if since is None: if since is None:
write_ts(IDLE_SINCE, now) write_ts(IDLE_SINCE, now)