Files
basics/system/load.go
spiritlhl fd7b807ca4 update
2024-05-04 11:19:25 +00:00

61 lines
1.5 KiB
Go

package system
import (
"bufio"
"github.com/oneclickvirt/basics/system/utils"
"github.com/shirou/gopsutil/load"
"os"
"runtime"
"strconv"
"strings"
)
// getLoadFromProc 从 /proc/loadavg 文件中获取负载信息
func getLoadFromProc() (float64, float64, float64, error) {
file, err := os.Open("/proc/loadavg")
if err != nil {
return 0, 0, 0, err
}
defer file.Close()
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fields := strings.Fields(scanner.Text())
// 解析负载信息并转换为 float64 类型
load1, _ := strconv.ParseFloat(fields[0], 64)
load5, _ := strconv.ParseFloat(fields[1], 64)
load15, _ := strconv.ParseFloat(fields[2], 64)
return load1, load5, load15, nil
}
if err := scanner.Err(); err != nil {
return 0, 0, 0, err
}
return 0, 0, 0, nil
}
// 获取系统负载信息
func getSystemLoad() (float64, float64, float64, error) {
var load1, load5, load15 float64
var err error
if runtime.GOOS == "linux" {
// 尝试从 /proc/loadavg 文件获取负载信息
load1, load5, load15, err = getLoadFromProc()
if err != nil {
load1, load5, load15 = 0, 0, 0
}
}
// 使用 gopsutil 获取负载
avg, err := load.Avg()
if err != nil {
load1, load5, load15 = 0, 0, 0
} else {
if avg.Load1 != 0 && avg.Load5 != 0 && avg.Load15 != 0 {
load1, load5, load15 = avg.Load1, avg.Load5, avg.Load15
}
}
// 有时候获取全为零时尝试使用 wmic 获取负载
if runtime.GOOS == "windows" && load1 == 0 && load5 == 0 && load15 == 0 {
load1 = utils.GetLoad1()
}
return load1, load5, load15, nil
}