@@ -3,11 +3,13 @@ package xsysinfo
33import (
44 "bytes"
55 "encoding/json"
6+ "fmt"
67 "os/exec"
78 "strconv"
89 "strings"
910 "sync"
1011
12+ sigar "github.com/cloudfoundry/gosigar"
1113 "github.com/jaypipes/ghw"
1214 "github.com/jaypipes/ghw/pkg/gpu"
1315 "github.com/rs/zerolog/log"
@@ -144,17 +146,15 @@ func isUnifiedMemoryDevice(gpuName string) bool {
144146
145147// getSystemRAM returns system RAM information using ghw
146148func getSystemRAM () (total , used , free uint64 , err error ) {
147- memory , err := ghw .Memory ()
148- if err != nil {
149- return 0 , 0 , 0 , err
150- }
149+ mem := sigar.Mem {}
150+ //swap := sigar.Swap{}
151151
152- total = uint64 ( memory . TotalUsableBytes )
153- // ghw doesn't provide used/free directly, but we can estimate
154- // For unified memory GPUs, we report total system RAM as available VRAM
155- // since the GPU can potentially use all of it
156- free = total
157- used = 0
152+ mem . Get () //nolint:errcheck
153+ //swap.Get() //nolint:errcheck
154+
155+ total = mem . Total
156+ free = mem . ActualFree
157+ used = mem . ActualUsed
158158
159159 return total , used , free , nil
160160}
@@ -560,79 +560,27 @@ func getIntelGPUTop() []GPUMemoryInfo {
560560
561561// GetSystemRAMInfo returns real-time system RAM usage
562562func GetSystemRAMInfo () (* SystemRAMInfo , error ) {
563- memory , err := ghw . Memory ()
563+ total , used , free , err := getSystemRAM ()
564564 if err != nil {
565565 return nil , err
566566 }
567567
568- total := uint64 (memory .TotalUsableBytes )
569-
570- // Try to get more accurate memory info from /proc/meminfo on Linux
571- used , available , free := getDetailedMemoryInfo (total )
572-
573568 usagePercent := 0.0
574569 if total > 0 {
575570 usagePercent = float64 (used ) / float64 (total ) * 100
576571 }
577572
573+ fmt .Println ("total" , total , "used" , used , "free" , free )
574+
578575 return & SystemRAMInfo {
579576 Total : total ,
580577 Used : used ,
581578 Free : free ,
582- Available : available ,
579+ Available : total - used ,
583580 UsagePercent : usagePercent ,
584581 }, nil
585582}
586583
587- // getDetailedMemoryInfo tries to get detailed memory info from /proc/meminfo on Linux
588- // Returns used, available, and free memory in bytes
589- func getDetailedMemoryInfo (total uint64 ) (used , available , free uint64 ) {
590- // Try to read /proc/meminfo for more accurate data
591- cmd := exec .Command ("cat" , "/proc/meminfo" )
592- var stdout bytes.Buffer
593- cmd .Stdout = & stdout
594-
595- if err := cmd .Run (); err != nil {
596- // Fallback: assume all memory is available
597- return 0 , total , total
598- }
599-
600- lines := strings .Split (stdout .String (), "\n " )
601- memInfo := make (map [string ]uint64 )
602-
603- for _ , line := range lines {
604- parts := strings .Fields (line )
605- if len (parts ) < 2 {
606- continue
607- }
608- key := strings .TrimSuffix (parts [0 ], ":" )
609- value , err := strconv .ParseUint (parts [1 ], 10 , 64 )
610- if err != nil {
611- continue
612- }
613- // Values in /proc/meminfo are in kB
614- memInfo [key ] = value * 1024
615- }
616-
617- // Get MemAvailable if present (preferred), otherwise calculate from free + buffers + cached
618- if avail , ok := memInfo ["MemAvailable" ]; ok {
619- available = avail
620- } else {
621- available = memInfo ["MemFree" ] + memInfo ["Buffers" ] + memInfo ["Cached" ]
622- }
623-
624- free = memInfo ["MemFree" ]
625-
626- // Calculate used memory
627- if total > available {
628- used = total - available
629- } else {
630- used = 0
631- }
632-
633- return used , available , free
634- }
635-
636584// GetResourceInfo returns GPU info if available, otherwise system RAM info
637585func GetResourceInfo () ResourceInfo {
638586 gpus := GetGPUMemoryUsage ()
0 commit comments