Documentation
¶
Overview ¶
Package footprint bounds and measures the control plane's idle cost: a default memory limit, a registry of background loops, and process stats.
Index ¶
- Constants
- func ApplyGCPercent(getenv func(string) string) int
- func Every(ctx context.Context, name string, interval time.Duration, logger *slog.Logger, ...) error
- func LimitFor(total int64, percent int) int64
- func Percent(getenv func(string) string) int
- func RunTrim(ctx context.Context, logger *slog.Logger, getenv func(string) string)
- type Loop
- type LoopInfo
- type MemoryLimit
- type Proc
Constants ¶
const ( EnvMemLimit = "GOMEMLIMIT" EnvMemLimitPercent = "APP_GOMEMLIMIT_PERCENT" DefaultPercent = 80 )
Env vars read by ApplyMemoryLimit.
const ( EnvGCPercent = "APP_GC_PERCENT" EnvTrimInterval = "APP_MEM_TRIM_INTERVAL" EnvTrimMinIdleMB = "APP_MEM_TRIM_MIN_IDLE_MB" DefaultGCPercent = 50 DefaultTrimEvery = 2 * time.Minute DefaultTrimIdleMB = 24 )
Env vars read by ApplyGCPercent and RunTrim.
Variables ¶
This section is empty.
Functions ¶
func ApplyGCPercent ¶
ApplyGCPercent returns the percent it set, or 0 when GOGC already decides. It lowers the GC target below Go's 100 default unless GOGC or APP_GC_PERCENT is set; the live heap is small, so the extra GC cost is negligible.
func Every ¶
func Every(ctx context.Context, name string, interval time.Duration, logger *slog.Logger, tick func(context.Context) error) error
Every runs tick on interval until ctx ends. The first tick is delayed by a random jitter of up to a tenth of the interval so loops do not wake together, and each tick is recorded.
func LimitFor ¶
LimitFor returns percent of total bytes, or 0 when the result would be too small to be safe.
Types ¶
type Loop ¶
type Loop struct {
// contains filtered or unexported fields
}
Loop records the runs of one background loop.
type LoopInfo ¶
type LoopInfo struct {
Name string `json:"name"`
IntervalSecs float64 `json:"interval_seconds"`
Runs int64 `json:"runs"`
Errors int64 `json:"errors"`
LastRunAt time.Time `json:"last_run_at"`
LastDuration float64 `json:"last_duration_ms"`
BusyMS float64 `json:"busy_ms_total"`
CostPercent float64 `json:"cost_percent"`
Running bool `json:"running"`
LastError string `json:"last_error,omitempty"`
// contains filtered or unexported fields
}
LoopInfo is the observable state of one background loop.
type MemoryLimit ¶
type MemoryLimit struct {
LimitBytes int64 `json:"limit_bytes"`
Source string `json:"source"`
Percent int `json:"percent"`
}
MemoryLimit describes what ApplyMemoryLimit decided.
func ApplyMemoryLimit ¶
func ApplyMemoryLimit(getenv func(string) string, logger *slog.Logger) MemoryLimit
ApplyMemoryLimit sets a soft Go memory limit from the container or host memory unless GOMEMLIMIT is already set.
func CurrentMemoryLimit ¶
func CurrentMemoryLimit() MemoryLimit
CurrentMemoryLimit returns what the last ApplyMemoryLimit call decided.
type Proc ¶
type Proc struct {
RSSBytes uint64 `json:"rss_bytes"`
HeapBytes uint64 `json:"heap_bytes"`
Goroutines int `json:"goroutines"`
Threads int `json:"threads"`
OpenFDs int `json:"open_fds"`
CPUSeconds float64 `json:"cpu_seconds"`
CPUPercent float64 `json:"cpu_percent"`
}
Proc is a point in time reading of the process footprint.