From 873dec8ac3160acd61a8ddc9fc32bf8c5aae94a9 Mon Sep 17 00:00:00 2001 From: liuzhihang1 <1625167628@qq.com> Date: Mon, 10 Feb 2025 18:54:34 +0800 Subject: [PATCH] std cgruop support --- .../app/logic/{process.go => process_base.go} | 1 - .../app/logic/process_base_cgroup_linux.go | 87 +++++++++++++++++++ .../app/logic/process_base_cgroup_windows.go | 7 ++ internal/app/logic/process_pty_linux.go | 81 ----------------- internal/app/logic/process_pty_windows.go | 4 - internal/app/logic/process_std.go | 4 - 6 files changed, 94 insertions(+), 90 deletions(-) rename internal/app/logic/{process.go => process_base.go} (99%) create mode 100644 internal/app/logic/process_base_cgroup_linux.go create mode 100644 internal/app/logic/process_base_cgroup_windows.go diff --git a/internal/app/logic/process.go b/internal/app/logic/process_base.go similarity index 99% rename from internal/app/logic/process.go rename to internal/app/logic/process_base.go index 9eb2f52..8416d6b 100644 --- a/internal/app/logic/process.go +++ b/internal/app/logic/process_base.go @@ -26,7 +26,6 @@ type Process interface { readInit() doOnInit() doOnKilled() - initCgroup() Start() error Type() constants.TerminalType SetTerminalSize(int, int) diff --git a/internal/app/logic/process_base_cgroup_linux.go b/internal/app/logic/process_base_cgroup_linux.go new file mode 100644 index 0000000..9572d3a --- /dev/null +++ b/internal/app/logic/process_base_cgroup_linux.go @@ -0,0 +1,87 @@ +package logic + +import ( + "github.com/containerd/cgroups/v3" + "github.com/containerd/cgroups/v3/cgroup1" + "github.com/containerd/cgroups/v3/cgroup2" + "github.com/lzh-1625/go_process_manager/config" + "github.com/lzh-1625/go_process_manager/log" + "github.com/opencontainers/runtime-spec/specs-go" +) + +func (p *ProcessBase) initCgroup() { + if !p.Config.cgroupEnable { + log.Logger.Debugw("不启用cgroup") + return + } + switch cgroups.Mode() { + case cgroups.Unavailable: + log.Logger.Warnw("当前系统不支持cgroup") + case cgroups.Legacy, cgroups.Hybrid: + log.Logger.Debugw("启用cgroupv1") + p.initCgroupV1() + case cgroups.Unified: + log.Logger.Debugw("启用cgroupv2") + p.initCgroupV2() + } +} + +func (p *ProcessBase) initCgroupV1() { + resources := &specs.LinuxResources{} + if p.Config.cpuLimit != nil { + period := uint64(config.CF.CgroupPeriod) + quota := int64(float32(config.CF.CgroupPeriod) * *p.Config.cpuLimit * 0.01) + cpuResources := &specs.LinuxCPU{ + Period: &period, + Quota: "a, + } + resources.CPU = cpuResources + } + if p.Config.memoryLimit != nil { + limit := int64(*p.Config.memoryLimit * 1024 * 1024) + memResources := &specs.LinuxMemory{ + Limit: &limit, + } + if config.CF.CgroupSwapLimit { + memResources.Swap = &limit + } + resources.Memory = memResources + } + control, err := cgroup1.New(cgroup1.StaticPath("/"+p.Name), resources) + if err != nil { + log.Logger.Errorw("启用cgroup失败", "err", err, "name", p.Name) + return + } + control.AddProc(uint64(p.Pid)) + p.cgroup.delete = control.Delete + p.cgroup.enable = true +} + +func (p *ProcessBase) initCgroupV2() { + resources := &cgroup2.Resources{} + if p.Config.cpuLimit != nil { + period := uint64(config.CF.CgroupPeriod) + quota := int64(float32(config.CF.CgroupPeriod) * *p.Config.cpuLimit * 0.01) + resources.CPU = &cgroup2.CPU{ + Max: cgroup2.NewCPUMax("a, &period), + } + } + if p.Config.memoryLimit != nil { + limit := int64(*p.Config.memoryLimit * 1024 * 1024) + memResources := &cgroup2.Memory{ + Max: &limit, + } + if config.CF.CgroupSwapLimit { + memResources.Swap = &limit + } + resources.Memory = memResources + } + control, err := cgroup2.NewSystemd("/", p.Name+".slice", -1, resources) + if err != nil { + log.Logger.Errorw("启用cgroup失败", "err", err, "name", p.Name) + return + } + control.AddProc(uint64(p.Pid)) + p.cgroup.delete = control.DeleteSystemd + p.cgroup.enable = true +} diff --git a/internal/app/logic/process_base_cgroup_windows.go b/internal/app/logic/process_base_cgroup_windows.go new file mode 100644 index 0000000..0295564 --- /dev/null +++ b/internal/app/logic/process_base_cgroup_windows.go @@ -0,0 +1,7 @@ +package logic + +import "github.com/lzh-1625/go_process_manager/log" + +func (p *ProcessBase) initCgroup() { + log.Logger.Debugw("不支持cgroup") +} diff --git a/internal/app/logic/process_pty_linux.go b/internal/app/logic/process_pty_linux.go index 3b3760d..38d4658 100644 --- a/internal/app/logic/process_pty_linux.go +++ b/internal/app/logic/process_pty_linux.go @@ -6,15 +6,11 @@ import ( "os/exec" "strings" - "github.com/containerd/cgroups/v3" - "github.com/containerd/cgroups/v3/cgroup1" - "github.com/containerd/cgroups/v3/cgroup2" "github.com/lzh-1625/go_process_manager/config" "github.com/lzh-1625/go_process_manager/internal/app/constants" "github.com/lzh-1625/go_process_manager/internal/app/model" "github.com/lzh-1625/go_process_manager/log" "github.com/lzh-1625/go_process_manager/utils" - "github.com/opencontainers/runtime-spec/specs-go" "github.com/creack/pty" ) @@ -118,83 +114,6 @@ func (p *ProcessPty) readInit() { } } -func (p *ProcessPty) initCgroup() { - if !p.Config.cgroupEnable { - log.Logger.Debugw("不启用cgroup") - return - } - switch cgroups.Mode() { - case cgroups.Unavailable: - log.Logger.Warnw("当前系统不支持cgroup") - case cgroups.Legacy, cgroups.Hybrid: - log.Logger.Debugw("启用cgroupv1") - p.initCgroupV1() - case cgroups.Unified: - log.Logger.Debugw("启用cgroupv2") - p.initCgroupV2() - } -} - -func (p *ProcessPty) initCgroupV1() { - resources := &specs.LinuxResources{} - if p.Config.cpuLimit != nil { - period := uint64(config.CF.CgroupPeriod) - quota := int64(float32(config.CF.CgroupPeriod) * *p.Config.cpuLimit * 0.01) - cpuResources := &specs.LinuxCPU{ - Period: &period, - Quota: "a, - } - resources.CPU = cpuResources - } - if p.Config.memoryLimit != nil { - limit := int64(*p.Config.memoryLimit * 1024 * 1024) - memResources := &specs.LinuxMemory{ - Limit: &limit, - } - if config.CF.CgroupSwapLimit { - memResources.Swap = &limit - } - resources.Memory = memResources - } - control, err := cgroup1.New(cgroup1.StaticPath("/"+p.Name), resources) - if err != nil { - log.Logger.Errorw("启用cgroup失败", "err", err, "name", p.Name) - return - } - control.AddProc(uint64(p.Pid)) - p.cgroup.delete = control.Delete - p.cgroup.enable = true -} - -func (p *ProcessPty) initCgroupV2() { - resources := &cgroup2.Resources{} - if p.Config.cpuLimit != nil { - period := uint64(config.CF.CgroupPeriod) - quota := int64(float32(config.CF.CgroupPeriod) * *p.Config.cpuLimit * 0.01) - resources.CPU = &cgroup2.CPU{ - Max: cgroup2.NewCPUMax("a, &period), - } - } - if p.Config.memoryLimit != nil { - limit := int64(*p.Config.memoryLimit * 1024 * 1024) - memResources := &cgroup2.Memory{ - Max: &limit, - } - if config.CF.CgroupSwapLimit { - memResources.Swap = &limit - } - resources.Memory = memResources - } - control, err := cgroup2.NewSystemd("/", p.Name+".slice", -1, resources) - if err != nil { - log.Logger.Errorw("启用cgroup失败", "err", err, "name", p.Name) - return - } - control.AddProc(uint64(p.Pid)) - p.cgroup.delete = control.DeleteSystemd - p.cgroup.enable = true -} - func (p *ProcessPty) ReadCache(ws ConnectInstance) { ws.Write(p.cacheBytesBuf.Bytes()) } diff --git a/internal/app/logic/process_pty_windows.go b/internal/app/logic/process_pty_windows.go index e132708..15107f1 100644 --- a/internal/app/logic/process_pty_windows.go +++ b/internal/app/logic/process_pty_windows.go @@ -117,10 +117,6 @@ func (p *ProcessPty) readInit() { } } -func (p *ProcessPty) initCgroup() { - log.Logger.Debugw("不支持cgroup") -} - func (p *ProcessPty) ReadCache(ws ConnectInstance) { ws.Write(p.cacheBytesBuf.Bytes()) } diff --git a/internal/app/logic/process_std.go b/internal/app/logic/process_std.go index 5350e0f..99c1ca6 100644 --- a/internal/app/logic/process_std.go +++ b/internal/app/logic/process_std.go @@ -82,10 +82,6 @@ func (p *ProcessStd) doOnInit() { p.cacheLine = make([]string, config.CF.ProcessMsgCacheLinesLimit) } -func (p *ProcessStd) initCgroup() { - log.Logger.Debugw("不支持cgroup") -} - func (p *ProcessStd) ReadCache(ws ConnectInstance) { for _, line := range p.cacheLine { ws.WriteString(line)