summaryrefslogtreecommitdiff
path: root/vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go')
-rw-r--r--vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go63
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go b/vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go
new file mode 100644
index 000000000..9e3f4cc07
--- /dev/null
+++ b/vendor/github.com/KimMachineGun/automemlimit/memlimit/cgroups.go
@@ -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
+}