system_monitor.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package common
  2. import (
  3. "sync/atomic"
  4. "time"
  5. "github.com/shirou/gopsutil/cpu"
  6. "github.com/shirou/gopsutil/mem"
  7. )
  8. // DiskSpaceInfo 磁盘空间信息
  9. type DiskSpaceInfo struct {
  10. // 总空间(字节)
  11. Total uint64 `json:"total"`
  12. // 可用空间(字节)
  13. Free uint64 `json:"free"`
  14. // 已用空间(字节)
  15. Used uint64 `json:"used"`
  16. // 使用百分比
  17. UsedPercent float64 `json:"used_percent"`
  18. }
  19. // SystemStatus 系统状态信息
  20. type SystemStatus struct {
  21. CPUUsage float64
  22. MemoryUsage float64
  23. DiskUsage float64
  24. }
  25. var latestSystemStatus atomic.Value
  26. func init() {
  27. latestSystemStatus.Store(SystemStatus{})
  28. }
  29. // StartSystemMonitor 启动系统监控
  30. func StartSystemMonitor() {
  31. go func() {
  32. for {
  33. config := GetPerformanceMonitorConfig()
  34. if !config.Enabled {
  35. time.Sleep(30 * time.Second)
  36. continue
  37. }
  38. updateSystemStatus()
  39. time.Sleep(5 * time.Second)
  40. }
  41. }()
  42. }
  43. func updateSystemStatus() {
  44. var status SystemStatus
  45. // CPU
  46. // 注意:cpu.Percent(0, false) 返回自上次调用以来的 CPU 使用率
  47. // 如果是第一次调用,可能会返回错误或不准确的值,但在循环中会逐渐正常
  48. percents, err := cpu.Percent(0, false)
  49. if err == nil && len(percents) > 0 {
  50. status.CPUUsage = percents[0]
  51. }
  52. // Memory
  53. memInfo, err := mem.VirtualMemory()
  54. if err == nil {
  55. status.MemoryUsage = memInfo.UsedPercent
  56. }
  57. // Disk
  58. diskInfo := GetDiskSpaceInfo()
  59. if diskInfo.Total > 0 {
  60. status.DiskUsage = diskInfo.UsedPercent
  61. }
  62. latestSystemStatus.Store(status)
  63. }
  64. // GetSystemStatus 获取当前系统状态
  65. func GetSystemStatus() SystemStatus {
  66. return latestSystemStatus.Load().(SystemStatus)
  67. }