mirror of
				https://github.com/oneclickvirt/basics.git
				synced 2025-10-31 12:06:30 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| }
 | 
