|
|
package application |
|
|
|
|
|
import ( |
|
|
"time" |
|
|
|
|
|
"github.com/mudler/LocalAI/pkg/model" |
|
|
"github.com/mudler/xlog" |
|
|
) |
|
|
|
|
|
func (a *Application) StopWatchdog() error { |
|
|
if a.watchdogStop != nil { |
|
|
close(a.watchdogStop) |
|
|
a.watchdogStop = nil |
|
|
} |
|
|
return nil |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
func (a *Application) startWatchdog() error { |
|
|
appConfig := a.ApplicationConfig() |
|
|
|
|
|
|
|
|
lruLimit := appConfig.GetEffectiveMaxActiveBackends() |
|
|
|
|
|
|
|
|
|
|
|
if appConfig.WatchDog || lruLimit > 0 || appConfig.MemoryReclaimerEnabled { |
|
|
wd := model.NewWatchDog( |
|
|
model.WithProcessManager(a.modelLoader), |
|
|
model.WithBusyTimeout(appConfig.WatchDogBusyTimeout), |
|
|
model.WithIdleTimeout(appConfig.WatchDogIdleTimeout), |
|
|
model.WithWatchdogInterval(appConfig.WatchDogInterval), |
|
|
model.WithBusyCheck(appConfig.WatchDogBusy), |
|
|
model.WithIdleCheck(appConfig.WatchDogIdle), |
|
|
model.WithLRULimit(lruLimit), |
|
|
model.WithMemoryReclaimer(appConfig.MemoryReclaimerEnabled, appConfig.MemoryReclaimerThreshold), |
|
|
model.WithForceEvictionWhenBusy(appConfig.ForceEvictionWhenBusy), |
|
|
) |
|
|
a.modelLoader.SetWatchDog(wd) |
|
|
|
|
|
|
|
|
a.watchdogStop = make(chan bool, 1) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if appConfig.WatchDogBusy || appConfig.WatchDogIdle || appConfig.MemoryReclaimerEnabled { |
|
|
go wd.Run() |
|
|
} |
|
|
|
|
|
|
|
|
go func() { |
|
|
select { |
|
|
case <-a.watchdogStop: |
|
|
xlog.Debug("Watchdog stop signal received") |
|
|
wd.Shutdown() |
|
|
case <-appConfig.Context.Done(): |
|
|
xlog.Debug("Context canceled, shutting down watchdog") |
|
|
wd.Shutdown() |
|
|
} |
|
|
}() |
|
|
|
|
|
xlog.Info("Watchdog started with new settings", "lruLimit", lruLimit, "busyCheck", appConfig.WatchDogBusy, "idleCheck", appConfig.WatchDogIdle, "memoryReclaimer", appConfig.MemoryReclaimerEnabled, "memoryThreshold", appConfig.MemoryReclaimerThreshold, "interval", appConfig.WatchDogInterval) |
|
|
} else { |
|
|
xlog.Info("Watchdog disabled") |
|
|
} |
|
|
|
|
|
return nil |
|
|
} |
|
|
|
|
|
|
|
|
func (a *Application) StartWatchdog() error { |
|
|
a.watchdogMutex.Lock() |
|
|
defer a.watchdogMutex.Unlock() |
|
|
|
|
|
return a.startWatchdog() |
|
|
} |
|
|
|
|
|
|
|
|
func (a *Application) RestartWatchdog() error { |
|
|
a.watchdogMutex.Lock() |
|
|
defer a.watchdogMutex.Unlock() |
|
|
|
|
|
|
|
|
if a.watchdogStop != nil { |
|
|
close(a.watchdogStop) |
|
|
a.watchdogStop = nil |
|
|
} |
|
|
|
|
|
|
|
|
currentWD := a.modelLoader.GetWatchDog() |
|
|
if currentWD != nil { |
|
|
currentWD.Shutdown() |
|
|
|
|
|
time.Sleep(100 * time.Millisecond) |
|
|
} |
|
|
|
|
|
|
|
|
return a.startWatchdog() |
|
|
} |
|
|
|