12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- package linux
- import (
- "io/ioutil"
- "reflect"
- "strconv"
- "strings"
- )
- type MemInfo struct {
- MemTotal uint64 `json:"mem_total"`
- MemFree uint64 `json:"mem_free"`
- MemAvailable uint64 `json:"mem_available"`
- Buffers uint64 `json:"buffers"`
- Cached uint64 `json:"cached"`
- SwapCached uint64 `json:"swap_cached"`
- Active uint64 `json:"active"`
- Inactive uint64 `json:"inactive"`
- ActiveAnon uint64 `json:"active_anon" field:"Active(anon)"`
- InactiveAnon uint64 `json:"inactive_anon" field:"Inactive(anon)"`
- ActiveFile uint64 `json:"active_file" field:"Active(file)"`
- InactiveFile uint64 `json:"inactive_file" field:"Inactive(file)"`
- Unevictable uint64 `json:"unevictable"`
- Mlocked uint64 `json:"mlocked"`
- SwapTotal uint64 `json:"swap_total"`
- SwapFree uint64 `json:"swap_free"`
- Dirty uint64 `json:"dirty"`
- Writeback uint64 `json:"write_back"`
- AnonPages uint64 `json:"anon_pages"`
- Mapped uint64 `json:"mapped"`
- Shmem uint64 `json:"shmem"`
- Slab uint64 `json:"slab"`
- SReclaimable uint64 `json:"s_reclaimable"`
- SUnreclaim uint64 `json:"s_unclaim"`
- KernelStack uint64 `json:"kernel_stack"`
- PageTables uint64 `json:"page_tables"`
- NFS_Unstable uint64 `json:"nfs_unstable"`
- Bounce uint64 `json:"bounce"`
- WritebackTmp uint64 `json:"writeback_tmp"`
- CommitLimit uint64 `json:"commit_limit"`
- Committed_AS uint64 `json:"committed_as"`
- VmallocTotal uint64 `json:"vmalloc_total"`
- VmallocUsed uint64 `json:"vmalloc_used"`
- VmallocChunk uint64 `json:"vmalloc_chunk"`
- HardwareCorrupted uint64 `json:"hardware_corrupted"`
- AnonHugePages uint64 `json:"anon_huge_pages"`
- HugePages_Total uint64 `json:"huge_pages_total"`
- HugePages_Free uint64 `json:"huge_pages_free"`
- HugePages_Rsvd uint64 `json:"huge_pages_rsvd"`
- HugePages_Surp uint64 `json:"huge_pages_surp"`
- Hugepagesize uint64 `json:"hugepagesize"`
- DirectMap4k uint64 `json:"direct_map_4k"`
- DirectMap2M uint64 `json:"direct_map_2M"`
- DirectMap1G uint64 `json:"direct_map_1G"`
- }
- func ReadMemInfo(path string) (*MemInfo, error) {
- data, err := ioutil.ReadFile(path)
- if err != nil {
- return nil, err
- }
- lines := strings.Split(string(data), "\n")
- // Maps a meminfo metric to its value (i.e. MemTotal --> 100000)
- statMap := make(map[string]uint64)
- var info = MemInfo{}
- for _, line := range lines {
- fields := strings.SplitN(line, ":", 2)
- if len(fields) < 2 {
- continue
- }
- valFields := strings.Fields(fields[1])
- val, _ := strconv.ParseUint(valFields[0], 10, 64)
- statMap[fields[0]] = val
- }
- elem := reflect.ValueOf(&info).Elem()
- typeOfElem := elem.Type()
- for i := 0; i < elem.NumField(); i++ {
- val, ok := statMap[typeOfElem.Field(i).Name]
- if ok {
- elem.Field(i).SetUint(val)
- continue
- }
- val, ok = statMap[typeOfElem.Field(i).Tag.Get("field")]
- if ok {
- elem.Field(i).SetUint(val)
- }
- }
- return &info, nil
- }
|