zhangzengfei
2023-09-05 63645d248c765244488cd34dbc1bb6528ca6b7c7
system-service/sys/sysinfo.go
@@ -1,94 +1,94 @@
package sys
import (
   "fmt"
   "os"
   "os/exec"
   "sort"
   "time"
   "vamicro/extend/util"
   "basic.com/valib/gogpu.git"
   "github.com/shirou/gopsutil/cpu"
   "github.com/shirou/gopsutil/disk"
   "github.com/shirou/gopsutil/host"
   "github.com/shirou/gopsutil/mem"
)
type SummaryInfo struct {
   Cpu  []float64             `json:"cpu" example:"cpu使用率"`
   Gpu  []gogpu.GpuUnitInfo   `json:"gpu" example:"gpu使用率"`
   Mem  mem.VirtualMemoryStat `json:"mem" example:"内存使用率"`
   Disk disk.UsageStat        `json:"disk" example:"磁盘空间"`
}
const Interval time.Duration = time.Second * 60
var Stat = &SummaryInfo{}
func GatherStat() {
   for range time.Tick(Interval) {
      // Cpu
      if cpuUsedPercent, err := cpu.Percent(time.Second, true); err == nil {
         Stat.Cpu = Stat.Cpu[0:0]
         for _, v := range cpuUsedPercent {
            Stat.Cpu = append(Stat.Cpu, v)
         }
      }
      // Memory
      if meminfo, err := mem.VirtualMemory(); err == nil {
         Stat.Mem = *meminfo
      }
      // Disk
      if disk, err := disk.Usage("/"); err == nil {
         Stat.Disk = *disk
      }
      // Gpu
      agxGpuProcIface := "/sys/devices/gpu.0/load"
      if util.Exists(agxGpuProcIface) {
         fd, err1 := os.Open(agxGpuProcIface)
         if err1 == nil {
            var load int64
            fmt.Fscanf(fd, "%d", &load)
            // 模拟nvidia库的输出
            Stat.Gpu = append(Stat.Gpu, gogpu.GpuUnitInfo{
               GpuMemoryTotal: 1000,
               GpuMemoryUsed:  load,
            })
            fd.Close()
         }
      } else {
         if gpuInfo, err := gogpu.Info(); err == nil {
            sort.Sort(gogpu.GPURank(gpuInfo.Info))
            Stat.Gpu = Stat.Gpu[0:0]
            for _, v := range gpuInfo.Info {
               Stat.Gpu = append(Stat.Gpu, v)
            }
         }
      }
   }
}
func GetSysInfo() map[string]interface{} {
   return util.Struct2Map(Stat)
}
func GetDeviceInfo() map[string]interface{} {
   cmd := exec.Command("/bin/sh", "-c", "lsblk -d | grep -v part | grep -v SWAP | grep -v M | grep disk | awk '{printf $4\" \"}'")
   disks, _ := cmd.Output()
   cpu, _ := cpu.Info()
   mem, _ := mem.VirtualMemory()
   host, _ := host.Info()
   return util.Struct2Map(map[string]interface{}{
      "cpu":  cpu,
      "mem":  mem,
      "host": host,
      "disk": string(disks),
   })
}
package sys
import (
   "fmt"
   "os"
   "os/exec"
   "sort"
   "time"
   "vamicro/extend/util"
   "basic.com/valib/gogpu.git"
   "github.com/shirou/gopsutil/cpu"
   "github.com/shirou/gopsutil/disk"
   "github.com/shirou/gopsutil/host"
   "github.com/shirou/gopsutil/mem"
)
type SummaryInfo struct {
   Cpu  []float64             `json:"cpu" example:"cpu使用率"`
   Gpu  []gogpu.GpuUnitInfo   `json:"gpu" example:"gpu使用率"`
   Mem  mem.VirtualMemoryStat `json:"mem" example:"内存使用率"`
   Disk disk.UsageStat        `json:"disk" example:"磁盘空间"`
}
const Interval time.Duration = time.Second * 60
var Stat = &SummaryInfo{}
func GatherStat() {
   for range time.Tick(Interval) {
      // Cpu
      if cpuUsedPercent, err := cpu.Percent(time.Second, true); err == nil {
         Stat.Cpu = Stat.Cpu[0:0]
         for _, v := range cpuUsedPercent {
            Stat.Cpu = append(Stat.Cpu, v)
         }
      }
      // Memory
      if meminfo, err := mem.VirtualMemory(); err == nil {
         Stat.Mem = *meminfo
      }
      // Disk
      if disk, err := disk.Usage("/"); err == nil {
         Stat.Disk = *disk
      }
      // Gpu
      agxGpuProcIface := "/sys/devices/gpu.0/load"
      if util.Exists(agxGpuProcIface) {
         fd, err1 := os.Open(agxGpuProcIface)
         if err1 == nil {
            var load int64
            fmt.Fscanf(fd, "%d", &load)
            // 模拟nvidia库的输出
            Stat.Gpu = append(Stat.Gpu, gogpu.GpuUnitInfo{
               GpuMemoryTotal: 1000,
               GpuMemoryUsed:  load,
            })
            fd.Close()
         }
      } else {
         if gpuInfo, err := gogpu.Info(); err == nil {
            sort.Sort(gogpu.GPURank(gpuInfo.Info))
            Stat.Gpu = Stat.Gpu[0:0]
            for _, v := range gpuInfo.Info {
               Stat.Gpu = append(Stat.Gpu, v)
            }
         }
      }
   }
}
func GetSysInfo() map[string]interface{} {
   return util.Struct2Map(Stat)
}
func GetDeviceInfo() map[string]interface{} {
   cmd := exec.Command("/bin/sh", "-c", "lsblk -d | grep -v part | grep -v SWAP | grep -v M | grep disk | awk '{printf $4\" \"}'")
   disks, _ := cmd.Output()
   cpu, _ := cpu.Info()
   mem, _ := mem.VirtualMemory()
   host, _ := host.Info()
   return util.Struct2Map(map[string]interface{}{
      "cpu":  cpu,
      "mem":  mem,
      "host": host,
      "disk": string(disks),
   })
}