mirror of
https://github.com/safing/portmaster
synced 2025-09-02 02:29:12 +00:00
80 lines
2.1 KiB
Go
80 lines
2.1 KiB
Go
package terminal
|
|
|
|
import (
|
|
"flag"
|
|
"time"
|
|
|
|
"github.com/safing/portbase/modules"
|
|
"github.com/safing/portbase/rng"
|
|
"github.com/safing/portmaster/spn/conf"
|
|
"github.com/safing/portmaster/spn/unit"
|
|
)
|
|
|
|
var (
|
|
module *modules.Module
|
|
rngFeeder *rng.Feeder = rng.NewFeeder()
|
|
|
|
scheduler *unit.Scheduler
|
|
|
|
debugUnitScheduling bool
|
|
)
|
|
|
|
func init() {
|
|
flag.BoolVar(&debugUnitScheduling, "debug-unit-scheduling", false, "enable debug logs of the SPN unit scheduler")
|
|
|
|
module = modules.Register("terminal", nil, start, nil, "base")
|
|
}
|
|
|
|
func start() error {
|
|
rngFeeder = rng.NewFeeder()
|
|
|
|
scheduler = unit.NewScheduler(getSchedulerConfig())
|
|
if debugUnitScheduling {
|
|
// Debug unit leaks.
|
|
scheduler.StartDebugLog()
|
|
}
|
|
module.StartServiceWorker("msg unit scheduler", 0, scheduler.SlotScheduler)
|
|
|
|
lockOpRegistry()
|
|
|
|
return registerMetrics()
|
|
}
|
|
|
|
var waitForever chan time.Time
|
|
|
|
// TimedOut returns a channel that triggers when the timeout is reached.
|
|
func TimedOut(timeout time.Duration) <-chan time.Time {
|
|
if timeout == 0 {
|
|
return waitForever
|
|
}
|
|
return time.After(timeout)
|
|
}
|
|
|
|
// StopScheduler stops the unit scheduler.
|
|
func StopScheduler() {
|
|
if scheduler != nil {
|
|
scheduler.Stop()
|
|
}
|
|
}
|
|
|
|
func getSchedulerConfig() *unit.SchedulerConfig {
|
|
// Client Scheduler Config.
|
|
if conf.Client() {
|
|
return &unit.SchedulerConfig{
|
|
SlotDuration: 10 * time.Millisecond, // 100 slots per second
|
|
MinSlotPace: 10, // 1000pps - Small starting pace for low end devices.
|
|
WorkSlotPercentage: 0.9, // 90%
|
|
SlotChangeRatePerStreak: 0.1, // 10% - Increase/Decrease quickly.
|
|
StatCycleDuration: 1 * time.Minute, // Match metrics report cycle.
|
|
}
|
|
}
|
|
|
|
// Server Scheduler Config.
|
|
return &unit.SchedulerConfig{
|
|
SlotDuration: 10 * time.Millisecond, // 100 slots per second
|
|
MinSlotPace: 100, // 10000pps - Every server should be able to handle this.
|
|
WorkSlotPercentage: 0.7, // 70%
|
|
SlotChangeRatePerStreak: 0.05, // 5%
|
|
StatCycleDuration: 1 * time.Minute, // Match metrics report cycle.
|
|
}
|
|
}
|