agent/perfmon/perfmon_linux.go (75 lines of code) (raw):

//go:build linux package perfmon import ( "fmt" "os" "path" "strconv" "strings" "github.com/aliyun/aliyun_assist_client/agent/cgroup" "github.com/aliyun/aliyun_assist_client/agent/clientreport" "github.com/aliyun/aliyun_assist_client/agent/log" ) const ( cgroup_cfg = "/usr/local/share/aliyun-assist/config/cgroup" cgroup_name = "aliyun_assist_cpu" default_cpu_limit = 15 ) var ( cpuCgroupLimit = false ) func getCpuLimit() int64 { // /usr/local/share/aliyun-assist/config/cgroup var cpu_limit int64 = default_cpu_limit c, err := os.ReadFile(cgroup_cfg) if err == nil { i, err := strconv.ParseInt(strings.TrimSpace(string(c)), 10, 64) if err == nil { cpu_limit = i return cpu_limit } } os.MkdirAll(path.Dir(cgroup_cfg), os.ModePerm) os.WriteFile(cgroup_cfg, []byte(fmt.Sprintf("%d", cpu_limit)), 0644) return cpu_limit } func InitCgroup() error { c, e := cgroup.NewManager(os.Getpid(), cgroup_name, "cpu") if e != nil { return e } cpuLimit := getCpuLimit() log.GetLogger().Infoln("cpuLimit=", cpuLimit) cfg := &cgroup.Config{ CpuQuota: int64(1000 * cpuLimit), } return c.Set(cfg) } func reachCpuOverloadLimit(cpuOverLoadCount int, cpuUsage float64) int { if !cpuCgroupLimit { if err := InitCgroup(); err == nil { log.GetLogger().Infoln("InitCgroup OK") report := clientreport.ClientReport{ ReportType: "init_cgroup", Info: fmt.Sprintf("cpu=%f", cpuUsage), } clientreport.SendReport(report) cpuCgroupLimit = true cpuOverLoadCount = 0 } else { log.GetLogger().Infoln("InitCgroup error, so self kill...") report := clientreport.ClientReport{ ReportType: "self_kill", Info: fmt.Sprintf("cpu=%f", cpuUsage), } clientreport.SendReport(report) log.GetLogger().Fatalln("self kill for CPU Overload... CPU=", cpuUsage) } } else { // cgroup limit cpu not work, self kill report := clientreport.ClientReport{ ReportType: "high_cpu", Info: fmt.Sprintf("cpu=%f", cpuUsage), } clientreport.SendReport(report) log.GetLogger().Fatalln("self kill for CPU Overload... CPU=", cpuUsage) } return cpuOverLoadCount }