diff --git a/go.mod b/go.mod index d4c94ff..c0ad6e3 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ replace github.com/kardianos/service => github.com/lwch/service v1.2.1-1 require ( github.com/btcsuite/winsvc v1.0.0 - github.com/containerd/cgroups v1.1.0 + github.com/containerd/cgroups/v3 v3.0.1 github.com/dustin/go-humanize v1.0.1 github.com/gorilla/websocket v1.5.0 github.com/jkstack/anet v0.0.0-20230206080421-e4bd2e304c2e @@ -23,7 +23,6 @@ require ( github.com/docker/go-units v0.5.0 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/lufia/plan9stats v0.0.0-20230110061619-bbe2e5e100de // indirect github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect github.com/sirupsen/logrus v1.9.0 // indirect @@ -31,5 +30,6 @@ require ( github.com/tklauser/numcpus v0.6.0 // indirect github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/sys v0.5.0 // indirect + google.golang.org/protobuf v1.27.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 4a84765..13677ba 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/cilium/ebpf v0.10.0 h1:nk5HPMeoBXtOzbkZBWym+ZWq1GIiHUsBFXxwewXAHLQ= github.com/cilium/ebpf v0.10.0/go.mod h1:DPiVdY/kT534dgc9ERmvP8mWA+9gvwgKfRvk4nNWnoE= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= -github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/cgroups/v3 v3.0.1 h1:4hfGvu8rfGIwVIDd+nLzn/B9ZXx4BcCjzt5ToenJRaE= +github.com/containerd/cgroups/v3 v3.0.1/go.mod h1:/vtwk1VXrtoa5AaZLkypuOJgA/6DyPMZHJPGQNtlHnw= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -19,8 +19,8 @@ github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiU github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -30,8 +30,6 @@ github.com/jkstack/anet v0.0.0-20230206080421-e4bd2e304c2e h1:wMQuhQkz1v2xmhTi1T github.com/jkstack/anet v0.0.0-20230206080421-e4bd2e304c2e/go.mod h1:L9J4lHwDxTsCPX5MNaVa/0UG36JIiDWIJxlp3jmCQxQ= github.com/jkstack/jkframe v1.2.2 h1:JKeb7Dg0HpyBIap4ZZ88nloojR+WvPFYy1V1jh67p10= github.com/jkstack/jkframe v1.2.2/go.mod h1:9f/mU26CFA4eBx/Zp8EZtuZxTS+4zokiO7yhuMl2zTA= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= @@ -65,27 +63,10 @@ github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+Kd github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -93,16 +74,10 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/limit/cgroups.go b/limit/cgroups.go index 7847c9a..4891a56 100644 --- a/limit/cgroups.go +++ b/limit/cgroups.go @@ -3,7 +3,7 @@ package limit -import "github.com/containerd/cgroups" +import "github.com/containerd/cgroups/v3" // Do set cgroups limit func (cfg *Configure) Do(agentName string) { diff --git a/limit/cgroups_v1.go b/limit/cgroups_v1.go index 7894eb9..38df493 100644 --- a/limit/cgroups_v1.go +++ b/limit/cgroups_v1.go @@ -8,7 +8,7 @@ import ( "strconv" "strings" - "github.com/containerd/cgroups" + "github.com/containerd/cgroups/v3/cgroup1" "github.com/dustin/go-humanize" "github.com/jkstack/jkframe/logging" "github.com/opencontainers/runtime-spec/specs-go" @@ -20,7 +20,7 @@ func (cfg *Configure) doV1(agentName string) { } logging.Info("use cgroups_v1") dir := "/jkstack/agent/" + agentName - group, err := cgroups.New(cgroups.V1, cgroups.StaticPath(dir), &specs.LinuxResources{}) + group, err := cgroup1.New(cgroup1.StaticPath(dir), &specs.LinuxResources{}) if err != nil { logging.Warning("can not create cgroup %s: %v", dir, err) return @@ -28,7 +28,7 @@ func (cfg *Configure) doV1(agentName string) { limitCPUV1(group, cfg.CPUQuota) limitMemoryV1(group, int64(cfg.Memory)) limitDiskV1(group, cfg.Disks) - err = group.Add(cgroups.Process{ + err = group.Add(cgroup1.Process{ Pid: os.Getpid(), }) if err != nil { @@ -50,7 +50,7 @@ func wantCGroup(cfg *Configure) bool { return false } -func limitCPUV1(group cgroups.Cgroup, limit int64) { +func limitCPUV1(group cgroup1.Cgroup, limit int64) { quota := limit * 1000 err := group.Update(&specs.LinuxResources{ CPU: &specs.LinuxCPU{ @@ -64,7 +64,7 @@ func limitCPUV1(group cgroups.Cgroup, limit int64) { logging.Info("set cpu_quota to %d%%", limit) } -func limitMemoryV1(group cgroups.Cgroup, limit int64) { +func limitMemoryV1(group cgroup1.Cgroup, limit int64) { err := group.Update(&specs.LinuxResources{ Memory: &specs.LinuxMemory{ Limit: &limit, @@ -78,7 +78,7 @@ func limitMemoryV1(group cgroups.Cgroup, limit int64) { logging.Info("set memory_limit to %s", humanize.IBytes(uint64(limit))) } -func limitDiskV1(group cgroups.Cgroup, limits diskLimits) { +func limitDiskV1(group cgroup1.Cgroup, limits diskLimits) { var block specs.LinuxBlockIO for _, disk := range limits { write := func(value uint64, target []specs.LinuxThrottleDevice) []specs.LinuxThrottleDevice { diff --git a/limit/cgroups_v2.go b/limit/cgroups_v2.go index cf2dfbc..930d51f 100644 --- a/limit/cgroups_v2.go +++ b/limit/cgroups_v2.go @@ -6,7 +6,7 @@ package limit import ( "os" - v2 "github.com/containerd/cgroups/v2" + "github.com/containerd/cgroups/v3/cgroup2" "github.com/dustin/go-humanize" "github.com/jkstack/jkframe/logging" ) @@ -16,7 +16,7 @@ func (cfg *Configure) doV2(agentName string) { return } logging.Info("use cgroups_v2") - group, err := v2.NewSystemd("/", agentName+".slice", -1, &v2.Resources{}) + group, err := cgroup2.NewSystemd("/", agentName+".slice", -1, &cgroup2.Resources{}) if err != nil { logging.Warning("can not create cgroup: %v", err) return @@ -31,12 +31,12 @@ func (cfg *Configure) doV2(agentName string) { } } -func limitCPUV2(group *v2.Manager, limit int64) { +func limitCPUV2(group *cgroup2.Manager, limit int64) { quota := limit * 1000 period := uint64(1000000) - err := group.Update(&v2.Resources{ - CPU: &v2.CPU{ - Max: v2.NewCPUMax("a, &period), + err := group.Update(&cgroup2.Resources{ + CPU: &cgroup2.CPU{ + Max: cgroup2.NewCPUMax("a, &period), }, }) if err != nil { @@ -46,9 +46,9 @@ func limitCPUV2(group *v2.Manager, limit int64) { logging.Info("set cpu_quota to %d%%", limit) } -func limitMemoryV2(group *v2.Manager, limit int64) { - err := group.Update(&v2.Resources{ - Memory: &v2.Memory{ +func limitMemoryV2(group *cgroup2.Manager, limit int64) { + err := group.Update(&cgroup2.Resources{ + Memory: &cgroup2.Memory{ Max: &limit, }, }) @@ -60,12 +60,12 @@ func limitMemoryV2(group *v2.Manager, limit int64) { logging.Info("set memory_limit to %s", humanize.IBytes(uint64(limit))) } -func limitDiskV2(group *v2.Manager, limits diskLimits) { - var io v2.IO +func limitDiskV2(group *cgroup2.Manager, limits diskLimits) { + var io cgroup2.IO for _, disk := range limits { - write := func(t v2.IOType, value uint64) { + write := func(t cgroup2.IOType, value uint64) { major, minor := parseDev(disk.Dev) - io.Max = append(io.Max, v2.Entry{ + io.Max = append(io.Max, cgroup2.Entry{ Type: t, Major: major, Minor: minor, @@ -73,27 +73,27 @@ func limitDiskV2(group *v2.Manager, limits diskLimits) { }) } if disk.ReadBytes > 0 { - write(v2.ReadBPS, disk.ReadBytes.Bytes()) + write(cgroup2.ReadBPS, disk.ReadBytes.Bytes()) logging.Info(" - set read_bytes limit by dev [%s]: %s", disk.Dev, disk.ReadBytes.String()) } if disk.WriteBytes > 0 { - write(v2.WriteBPS, disk.WriteBytes.Bytes()) + write(cgroup2.WriteBPS, disk.WriteBytes.Bytes()) logging.Info(" - set write_bytes limit by dev [%s]: %s", disk.Dev, disk.WriteBytes.Bytes()) } if disk.ReadIOPS > 0 { - write(v2.ReadIOPS, disk.ReadIOPS) + write(cgroup2.ReadIOPS, disk.ReadIOPS) logging.Info(" - set read_iops limit by dev [%s]: %s", disk.Dev, humanize.IBytes(disk.ReadIOPS)) } if disk.WriteIOPS > 0 { - write(v2.WriteIOPS, disk.WriteIOPS) + write(cgroup2.WriteIOPS, disk.WriteIOPS) logging.Info(" - set write_iops limit by dev [%s]: %s", disk.Dev, humanize.IBytes(disk.WriteIOPS)) } } - err := group.Update(&v2.Resources{ + err := group.Update(&cgroup2.Resources{ IO: &io, }) if err != nil {