mirror of
https://github.com/opencloud-eu/opencloud.git
synced 2026-03-30 21:32:11 -04:00
switch to go vendoring
This commit is contained in:
15
vendor/github.com/KimMachineGun/automemlimit/.gitignore
generated
vendored
Normal file
15
vendor/github.com/KimMachineGun/automemlimit/.gitignore
generated
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
21
vendor/github.com/KimMachineGun/automemlimit/LICENSE
generated
vendored
Normal file
21
vendor/github.com/KimMachineGun/automemlimit/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Geon Kim
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
42
vendor/github.com/KimMachineGun/automemlimit/README.md
generated
vendored
Normal file
42
vendor/github.com/KimMachineGun/automemlimit/README.md
generated
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
# automemlimit
|
||||
|
||||
[](https://pkg.go.dev/github.com/KimMachineGun/automemlimit)
|
||||
[](https://goreportcard.com/report/github.com/KimMachineGun/automemlimit)
|
||||
[](https://github.com/KimMachineGun/automemlimit/actions/workflows/test.yml)
|
||||
|
||||
Automatically set `GOMEMLIMIT` to match Linux [cgroups(7)](https://man7.org/linux/man-pages/man7/cgroups.7.html) memory limit.
|
||||
|
||||
See more details about `GOMEMLIMIT` [here](https://tip.golang.org/doc/gc-guide#Memory_limit).
|
||||
|
||||
## Installation
|
||||
|
||||
```shell
|
||||
go get github.com/KimMachineGun/automemlimit@latest
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
// By default, it sets `GOMEMLIMIT` to 90% of cgroup's memory limit.
|
||||
// You can find more details of its behavior from the doc comment of memlimit.SetGoMemLimitWithEnv.
|
||||
import _ "github.com/KimMachineGun/automemlimit"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "github.com/KimMachineGun/automemlimit/memlimit"
|
||||
|
||||
func init() {
|
||||
memlimit.SetGoMemLimitWithEnv()
|
||||
memlimit.SetGoMemLimit(0.9)
|
||||
memlimit.SetGoMemLimitWithProvider(memlimit.Limit(1024*1024), 0.9)
|
||||
memlimit.SetGoMemLimitWithProvider(memlimit.FromCgroup, 0.9)
|
||||
memlimit.SetGoMemLimitWithProvider(memlimit.FromCgroupV1, 0.9)
|
||||
memlimit.SetGoMemLimitWithProvider(memlimit.FromCgroupV2, 0.9)
|
||||
}
|
||||
```
|
||||
9
vendor/github.com/KimMachineGun/automemlimit/automemlimit.go
generated
vendored
Normal file
9
vendor/github.com/KimMachineGun/automemlimit/automemlimit.go
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
package automemlimit
|
||||
|
||||
import (
|
||||
"github.com/KimMachineGun/automemlimit/memlimit"
|
||||
)
|
||||
|
||||
func init() {
|
||||
memlimit.SetGoMemLimitWithEnv()
|
||||
}
|
||||
63
vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go
generated
vendored
Normal file
63
vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go
generated
vendored
Normal file
@@ -0,0 +1,63 @@
|
||||
//go:build linux
|
||||
// +build linux
|
||||
|
||||
package memlimit
|
||||
|
||||
import (
|
||||
"github.com/containerd/cgroups"
|
||||
v2 "github.com/containerd/cgroups/v2"
|
||||
)
|
||||
|
||||
const (
|
||||
cgroupMountPoint = "/sys/fs/cgroup"
|
||||
)
|
||||
|
||||
// FromCgroup returns the memory limit based on the cgroups version on this system.
|
||||
func FromCgroup() (uint64, error) {
|
||||
switch cgroups.Mode() {
|
||||
case cgroups.Legacy:
|
||||
return FromCgroupV1()
|
||||
case cgroups.Hybrid, cgroups.Unified:
|
||||
return FromCgroupV2()
|
||||
}
|
||||
return 0, ErrNoCgroup
|
||||
}
|
||||
|
||||
// FromCgroupV1 returns the memory limit from the cgroup v1.
|
||||
func FromCgroupV1() (uint64, error) {
|
||||
cg, err := cgroups.Load(cgroups.SingleSubsystem(cgroups.V1, cgroups.Memory), cgroups.RootPath)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
metrics, err := cg.Stat(cgroups.IgnoreNotExist)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else if metrics.Memory == nil {
|
||||
return 0, ErrNoLimit
|
||||
}
|
||||
|
||||
return metrics.Memory.HierarchicalMemoryLimit, nil
|
||||
}
|
||||
|
||||
// FromCgroupV2 returns the memory limit from the cgroup v2.
|
||||
func FromCgroupV2() (uint64, error) {
|
||||
path, err := v2.NestedGroupPath("")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
m, err := v2.LoadManager(cgroupMountPoint, path)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
stats, err := m.Stat()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
} else if stats.Memory == nil {
|
||||
return 0, ErrNoLimit
|
||||
}
|
||||
|
||||
return stats.Memory.UsageLimit, nil
|
||||
}
|
||||
16
vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups_unsupported.go
generated
vendored
Normal file
16
vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups_unsupported.go
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
//go:build !linux
|
||||
// +build !linux
|
||||
|
||||
package memlimit
|
||||
|
||||
func FromCgroup() (uint64, error) {
|
||||
return 0, ErrCgroupsNotSupported
|
||||
}
|
||||
|
||||
func FromCgroupV1() (uint64, error) {
|
||||
return 0, ErrCgroupsNotSupported
|
||||
}
|
||||
|
||||
func FromCgroupV2() (uint64, error) {
|
||||
return 0, ErrCgroupsNotSupported
|
||||
}
|
||||
105
vendor/github.com/KimMachineGun/automemlimit/memlimit/memlimit.go
generated
vendored
Normal file
105
vendor/github.com/KimMachineGun/automemlimit/memlimit/memlimit.go
generated
vendored
Normal file
@@ -0,0 +1,105 @@
|
||||
package memlimit
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io"
|
||||
"log"
|
||||
"math"
|
||||
"os"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
)
|
||||
|
||||
const (
|
||||
envGOMEMLIMIT = "GOMEMLIMIT"
|
||||
envAUTOMEMLIMIT = "AUTOMEMLIMIT"
|
||||
envAUTOMEMLIMIT_DEBUG = "AUTOMEMLIMIT_DEBUG"
|
||||
|
||||
defaultAUTOMEMLIMIT = 0.9
|
||||
)
|
||||
|
||||
var (
|
||||
// ErrNoLimit is returned when the memory limit is not set.
|
||||
ErrNoLimit = errors.New("memory is not limited")
|
||||
// ErrNoCgroup is returned when the process is not in cgroup.
|
||||
ErrNoCgroup = errors.New("process is not in cgroup")
|
||||
// ErrCgroupsNotSupported is returned when the system does not support cgroups.
|
||||
ErrCgroupsNotSupported = errors.New("cgroups is not supported on this system")
|
||||
|
||||
logger = log.New(io.Discard, "", log.LstdFlags)
|
||||
)
|
||||
|
||||
// SetGoMemLimitWithEnv sets GOMEMLIMIT with the value from the environment variable.
|
||||
// You can configure how much memory of the cgroup's memory limit to set as GOMEMLIMIT
|
||||
// through AUTOMEMLIMIT in the half-open range (0.0,1.0].
|
||||
//
|
||||
// If AUTOMEMLIMIT is not set, it defaults to 0.9. (10% is the headroom for memory sources the Go runtime is unaware of.)
|
||||
// If GOMEMLIMIT is already set or AUTOMEMLIMIT=off, this function does nothing.
|
||||
func SetGoMemLimitWithEnv() {
|
||||
if os.Getenv(envAUTOMEMLIMIT_DEBUG) == "true" {
|
||||
logger = log.Default()
|
||||
}
|
||||
|
||||
if val, ok := os.LookupEnv(envGOMEMLIMIT); ok {
|
||||
logger.Printf("GOMEMLIMIT is set already, skipping: %s\n", val)
|
||||
return
|
||||
}
|
||||
|
||||
ratio := defaultAUTOMEMLIMIT
|
||||
if val, ok := os.LookupEnv(envAUTOMEMLIMIT); ok {
|
||||
if val == "off" {
|
||||
logger.Printf("AUTOMEMLIMIT is set to off, skipping\n")
|
||||
return
|
||||
}
|
||||
_ratio, err := strconv.ParseFloat(val, 64)
|
||||
if err != nil {
|
||||
logger.Printf("cannot parse AUTOMEMLIMIT: %s\n", val)
|
||||
return
|
||||
}
|
||||
ratio = _ratio
|
||||
}
|
||||
if ratio <= 0 || ratio > 1 {
|
||||
logger.Printf("invalid AUTOMEMLIMIT: %f\n", ratio)
|
||||
return
|
||||
}
|
||||
|
||||
limit, err := SetGoMemLimit(ratio)
|
||||
if err != nil {
|
||||
logger.Printf("failed to set GOMEMLIMIT: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
logger.Printf("GOMEMLIMIT=%d\n", limit)
|
||||
}
|
||||
|
||||
// SetGoMemLimit sets GOMEMLIMIT with the value from the cgroup's memory limit and given ratio.
|
||||
func SetGoMemLimit(ratio float64) (int64, error) {
|
||||
return SetGoMemLimitWithProvider(FromCgroup, ratio)
|
||||
}
|
||||
|
||||
// Provider is a function that returns the memory limit.
|
||||
type Provider func() (uint64, error)
|
||||
|
||||
// SetGoMemLimitWithProvider sets GOMEMLIMIT with the value from the given provider and ratio.
|
||||
func SetGoMemLimitWithProvider(provider Provider, ratio float64) (int64, error) {
|
||||
limit, err := provider()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
goMemLimit := cappedFloat2Int(float64(limit) * ratio)
|
||||
debug.SetMemoryLimit(goMemLimit)
|
||||
return goMemLimit, nil
|
||||
}
|
||||
|
||||
func cappedFloat2Int(f float64) int64 {
|
||||
if f > math.MaxInt64 {
|
||||
return math.MaxInt64
|
||||
}
|
||||
return int64(f)
|
||||
}
|
||||
// Limit is a helper Provider function that returns the given limit.
|
||||
func Limit(limit uint64) func() (uint64, error) {
|
||||
return func() (uint64, error) {
|
||||
return limit, nil
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user