// GetTotalMemory returns either the total system memory or if possible the // cgroups available memory. func GetTotalMemory() (uint64, error) { mem := gosigar.Mem{} if err := mem.Get(); err != nil { return 0, err } totalMem := mem.Total var cgAvlMem uint64 if runtime.GOOS == "linux" { var err error var buf []byte if buf, err = ioutil.ReadFile(defaultCGroupMemPath); err != nil { if log.V(1) { log.Infof("can't read available memory from cgroups (%s)", err) } return totalMem, nil } if cgAvlMem, err = strconv.ParseUint(strings.TrimSpace(string(buf)), 10, 64); err != nil { if log.V(1) { log.Infof("can't parse available memory from cgroups (%s)", err) } return totalMem, nil } return cgAvlMem, nil } return totalMem, nil }
func GetMemory() (*MemStat, error) { mem := sigar.Mem{} err := mem.Get() if err != nil { return nil, err } return &MemStat{Mem: mem}, nil }
// GetTotalMemory returns either the total system memory or if possible the // cgroups available memory. func GetTotalMemory() (int64, error) { mem := gosigar.Mem{} if err := mem.Get(); err != nil { return 0, err } if mem.Total > math.MaxInt64 { return 0, fmt.Errorf("inferred memory size %s exceeds maximum supported memory size %s", humanize.IBytes(mem.Total), humanize.Bytes(math.MaxInt64)) } totalMem := int64(mem.Total) if runtime.GOOS == "linux" { var err error var buf []byte if buf, err = ioutil.ReadFile(defaultCGroupMemPath); err != nil { if log.V(1) { log.Infof(context.TODO(), "can't read available memory from cgroups (%s), using system memory %s instead", err, humanizeutil.IBytes(totalMem)) } return totalMem, nil } var cgAvlMem uint64 if cgAvlMem, err = strconv.ParseUint(strings.TrimSpace(string(buf)), 10, 64); err != nil { if log.V(1) { log.Infof(context.TODO(), "can't parse available memory from cgroups (%s), using system memory %s instead", err, humanizeutil.IBytes(totalMem)) } return totalMem, nil } if cgAvlMem > math.MaxInt64 { if log.V(1) { log.Infof(context.TODO(), "available memory from cgroups is too large and unsupported %s using system memory %s instead", humanize.IBytes(cgAvlMem), humanizeutil.IBytes(totalMem)) } return totalMem, nil } if cgAvlMem > mem.Total { if log.V(1) { log.Infof(context.TODO(), "available memory from cgroups %s exceeds system memory %s, using system memory", humanize.IBytes(cgAvlMem), humanizeutil.IBytes(totalMem)) } return totalMem, nil } return int64(cgAvlMem), nil } return totalMem, nil }
func GetMemory() (*MemStat, error) { mem := sigar.Mem{} err := mem.Get() if err != nil { return nil, err } return &MemStat{ Total: mem.Total, Used: mem.Used, Free: mem.Free, ActualFree: mem.ActualFree, ActualUsed: mem.ActualUsed, }, nil }
func main() { mem := gosigar.Mem{} swap := gosigar.Swap{} mem.Get() swap.Get() fmt.Fprintf(os.Stdout, "%18s %10s %10s\n", "total", "used", "free") fmt.Fprintf(os.Stdout, "Mem: %10d %10d %10d\n", format(mem.Total), format(mem.Used), format(mem.Free)) fmt.Fprintf(os.Stdout, "-/+ buffers/cache: %10d %10d\n", format(mem.ActualUsed), format(mem.ActualFree)) fmt.Fprintf(os.Stdout, "Swap: %10d %10d %10d\n", format(swap.Total), format(swap.Used), format(swap.Free)) }
package sigar_test import ( "os" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" sigar "github.com/elastic/gosigar" ) var _ = Describe("SigarWindows", func() { Describe("Memory", func() { It("gets the total memory", func() { mem := sigar.Mem{} err := mem.Get() Ω(err).ShouldNot(HaveOccurred()) Ω(mem.Total).Should(BeNumerically(">", 0)) }) }) Describe("Disk", func() { It("gets the total disk space", func() { usage := sigar.FileSystemUsage{} err := usage.Get(os.TempDir()) Ω(err).ShouldNot(HaveOccurred()) Ω(usage.Total).Should(BeNumerically(">", 0)) }) })
func TestLinuxMemAndSwap(t *testing.T) { setUp(t) defer tearDown(t) meminfoContents := ` MemTotal: 374256 kB MemFree: 274460 kB Buffers: 9764 kB Cached: 38648 kB SwapCached: 0 kB Active: 33772 kB Inactive: 31184 kB Active(anon): 16572 kB Inactive(anon): 552 kB Active(file): 17200 kB Inactive(file): 30632 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 786428 kB SwapFree: 786428 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 16564 kB Mapped: 6612 kB Shmem: 584 kB Slab: 19092 kB SReclaimable: 9128 kB SUnreclaim: 9964 kB KernelStack: 672 kB PageTables: 1864 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 973556 kB Committed_AS: 55880 kB VmallocTotal: 34359738367 kB VmallocUsed: 21428 kB VmallocChunk: 34359713596 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 59328 kB DirectMap2M: 333824 kB ` meminfoFile := procd + "/meminfo" err := ioutil.WriteFile(meminfoFile, []byte(meminfoContents), 0444) if err != nil { t.Fatal(err) } mem := sigar.Mem{} if assert.NoError(t, mem.Get()) { assert.Equal(t, uint64(374256*1024), mem.Total) assert.Equal(t, uint64(274460*1024), mem.Free) } swap := sigar.Swap{} if assert.NoError(t, swap.Get()) { assert.Equal(t, uint64(786428*1024), swap.Total) assert.Equal(t, uint64(786428*1024), swap.Free) } }