main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package main
  2. import (
  3. "fmt"
  4. "github.com/shirou/gopsutil/cpu"
  5. "github.com/shirou/gopsutil/disk"
  6. "github.com/shirou/gopsutil/mem"
  7. "github.com/shirou/gopsutil/process"
  8. "sort"
  9. "time"
  10. )
  11. type ProcessInfo struct {
  12. Pid int32 `json:"pid"`
  13. Name string `json:"name"`
  14. CpuUsage float64 `json:"cpuUsage"`
  15. MemUsage float32 `json:"memUsage"`
  16. }
  17. // GetCpuPercent cpu总占用率
  18. func GetCpuPercent() float64 {
  19. percent, _ := cpu.Percent(time.Second, false)
  20. return percent[0]
  21. }
  22. // GetMemoryPercent 内存总占用率
  23. func GetMemoryPercent() float64 {
  24. memory, _ := mem.VirtualMemory()
  25. return memory.UsedPercent
  26. }
  27. // GetDiskPercent 磁盘总占用率
  28. func GetDiskPercent() float64 {
  29. parts, _ := disk.Partitions(true)
  30. diskInfo, _ := disk.Usage(parts[0].Mountpoint)
  31. return diskInfo.UsedPercent
  32. }
  33. func GetTop10CpuAndMem() ([]ProcessInfo, []ProcessInfo) {
  34. // 获取所有进程的CPU占用率
  35. processes, err := process.Processes()
  36. if err != nil {
  37. //fmt.Println("Error:", err)
  38. return nil, nil
  39. }
  40. // 创建一个用于存储进程CPU占用率的映射
  41. cpuPercent := make(map[int32]float64)
  42. memPercent := make(map[int32]float32)
  43. // 获取每个进程的CPU占用率
  44. for _, p := range processes {
  45. pid := p.Pid
  46. cpuPercent[pid], err = p.CPUPercent()
  47. memPercent[pid], err = p.MemoryPercent()
  48. }
  49. // 根据CPU占用率对进程进行排序
  50. sortedPidsCpu := make([]int32, 0, len(cpuPercent))
  51. sortedPidsMem := make([]int32, 0, len(cpuPercent))
  52. for pid := range cpuPercent {
  53. sortedPidsCpu = append(sortedPidsCpu, pid)
  54. }
  55. sort.Slice(sortedPidsCpu, func(i, j int) bool {
  56. return cpuPercent[sortedPidsCpu[i]] > cpuPercent[sortedPidsCpu[j]]
  57. })
  58. // 输出前10个CPU占用率最高的进程名称
  59. var top10Cpu []ProcessInfo
  60. for i, pid := range sortedPidsCpu {
  61. if i >= 10 {
  62. break
  63. }
  64. p, err := process.NewProcess(pid)
  65. if err != nil {
  66. continue
  67. }
  68. name, _ := p.Name()
  69. top10Cpu = append(top10Cpu, ProcessInfo{
  70. Pid: pid,
  71. Name: name,
  72. CpuUsage: cpuPercent[pid],
  73. MemUsage: memPercent[pid],
  74. })
  75. }
  76. // --------------------- 内存
  77. var top10Mem []ProcessInfo
  78. for pid := range memPercent {
  79. sortedPidsMem = append(sortedPidsMem, pid)
  80. }
  81. sort.Slice(sortedPidsMem, func(i, j int) bool {
  82. return memPercent[sortedPidsMem[i]] > memPercent[sortedPidsMem[j]]
  83. })
  84. for i, pid := range sortedPidsMem {
  85. if i >= 10 {
  86. break
  87. }
  88. p, err := process.NewProcess(pid)
  89. if err != nil {
  90. continue
  91. }
  92. name, _ := p.Name()
  93. top10Mem = append(top10Mem, ProcessInfo{
  94. Pid: pid,
  95. Name: name,
  96. CpuUsage: cpuPercent[pid],
  97. MemUsage: memPercent[pid],
  98. })
  99. }
  100. return top10Cpu, top10Mem
  101. }
  102. func main() {
  103. fmt.Println("cpu总占用率为:", GetCpuPercent())
  104. fmt.Println("内存总占用率为:", GetMemoryPercent())
  105. fmt.Println("磁盘总占用率为:", GetDiskPercent())
  106. top10cpu, top10mem := GetTop10CpuAndMem()
  107. fmt.Println("top10cpu为:", top10cpu)
  108. fmt.Println("top10mem为:", top10mem)
  109. }