synops/migrations/014_resource_governor.sql
vegard b64f217637 Fullfører oppgave 15.5: Ressursstyring for jobbkø
Implementerer prioritetsregler, ressursgrenser og LiveKit-bevisst
resource governor for jobbkø-workeren, pluss disk-overvåking med varsling.

Hovedkomponenter:

1. Prioritetsregler (job_priority_rules-tabell):
   - Konfigurerbar base_priority, cpu_weight, max_concurrent per jobbtype
   - LiveKit-justering: livekit_priority_adj og block_during_livekit
   - Timeout per jobbtype
   - Admin-API for å endre regler uten restart

2. Ressurs-governor i worker-loopen:
   - Semaphore: maks 3 samtidige jobber
   - CPU-vektgrense: total vekt maks 8 (Whisper=5, render=1, etc.)
   - Per-type concurrency-grense
   - LiveKit-status sjekkes med 10s cache-TTL
   - Jobber utsettes/nedprioriteres ved aktive LiveKit-rom
   - Individuell timeout per jobb (default 600s)
   - Jobber kjøres i egne tokio-tasks (parallell dispatch)

3. Disk-overvåking:
   - Sjekker diskbruk hvert 60. sekund via statvfs
   - Terskler: 85% warning, 90% critical, 95% emergency
   - Logger til disk_status_log (siste 1000 målinger beholdes)
   - Admin-API: GET /admin/resources/disk med historikk

4. Admin-API:
   - GET /admin/resources — samlet ressursstatus
   - GET /admin/resources/disk — diskstatus med historikk
   - POST /admin/resources/update_rule — oppdater prioritetsregel

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 04:02:11 +00:00

46 lines
2.2 KiB
SQL

-- Oppgave 15.5: Ressursstyring — prioritetsregler, ressursgrenser, disk-status
--
-- Oppretter tabell for jobbtype-prioritetsregler som brukes av workeren
-- til å styre concurrency, prioritet og LiveKit-tilpasning.
CREATE TABLE job_priority_rules (
job_type TEXT PRIMARY KEY,
base_priority SMALLINT NOT NULL DEFAULT 5,
-- Hvor mye prioriteten reduseres når LiveKit-rom er aktive
livekit_priority_adj SMALLINT NOT NULL DEFAULT 0,
-- Ressursvekt (1=lett HTTP-kall, 5=tung CPU som Whisper)
cpu_weight SMALLINT NOT NULL DEFAULT 1,
-- Maks samtidige jobber av denne typen (0 = ubegrenset)
max_concurrent SMALLINT NOT NULL DEFAULT 0,
-- Timeout i sekunder (0 = bruk default)
timeout_seconds INT NOT NULL DEFAULT 0,
-- Om jobben skal blokkeres helt under aktive LiveKit-sesjoner
block_during_livekit BOOLEAN NOT NULL DEFAULT false
);
-- Seed med kjente jobbtyper og fornuftige defaults
INSERT INTO job_priority_rules (job_type, base_priority, livekit_priority_adj, cpu_weight, max_concurrent, timeout_seconds, block_during_livekit)
VALUES
('whisper_transcribe', 5, -3, 5, 1, 600, false),
('agent_respond', 10, 0, 1, 2, 120, false),
('suggest_edges', 3, 0, 1, 2, 120, false),
('summarize_communication', 5, 0, 1, 1, 120, false),
('tts_generate', 5, -1, 2, 1, 300, false),
('audio_process', 5, -2, 3, 1, 600, false),
('render_article', 7, 0, 1, 2, 60, false),
('render_index', 7, 0, 1, 2, 60, false);
-- Tabell for disk-status-snapshots (siste verdier brukes for varsling)
CREATE TABLE disk_status_log (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
checked_at TIMESTAMPTZ NOT NULL DEFAULT now(),
mount_point TEXT NOT NULL DEFAULT '/',
total_bytes BIGINT NOT NULL,
used_bytes BIGINT NOT NULL,
available_bytes BIGINT NOT NULL,
usage_percent REAL NOT NULL,
alert_level TEXT -- NULL=ok, 'warning'=85%+, 'critical'=90%+, 'emergency'=95%+
);
-- Hold bare siste 1000 målinger
CREATE INDEX idx_disk_status_latest ON disk_status_log (checked_at DESC);