github.com/slene/docker@v1.8.0-rc1/pkg/system/meminfo_linux.go (about) 1 package system 2 3 import ( 4 "bufio" 5 "errors" 6 "io" 7 "os" 8 "strconv" 9 "strings" 10 11 "github.com/docker/docker/pkg/units" 12 ) 13 14 var ( 15 ErrMalformed = errors.New("malformed file") 16 ) 17 18 // ReadMemInfo retrieves memory statistics of the host system and returns a 19 // MemInfo type. 20 func ReadMemInfo() (*MemInfo, error) { 21 file, err := os.Open("/proc/meminfo") 22 if err != nil { 23 return nil, err 24 } 25 defer file.Close() 26 return parseMemInfo(file) 27 } 28 29 // parseMemInfo parses the /proc/meminfo file into 30 // a MemInfo object given a io.Reader to the file. 31 // 32 // Throws error if there are problems reading from the file 33 func parseMemInfo(reader io.Reader) (*MemInfo, error) { 34 meminfo := &MemInfo{} 35 scanner := bufio.NewScanner(reader) 36 for scanner.Scan() { 37 // Expected format: ["MemTotal:", "1234", "kB"] 38 parts := strings.Fields(scanner.Text()) 39 40 // Sanity checks: Skip malformed entries. 41 if len(parts) < 3 || parts[2] != "kB" { 42 continue 43 } 44 45 // Convert to bytes. 46 size, err := strconv.Atoi(parts[1]) 47 if err != nil { 48 continue 49 } 50 bytes := int64(size) * units.KiB 51 52 switch parts[0] { 53 case "MemTotal:": 54 meminfo.MemTotal = bytes 55 case "MemFree:": 56 meminfo.MemFree = bytes 57 case "SwapTotal:": 58 meminfo.SwapTotal = bytes 59 case "SwapFree:": 60 meminfo.SwapFree = bytes 61 } 62 63 } 64 65 // Handle errors that may have occurred during the reading of the file. 66 if err := scanner.Err(); err != nil { 67 return nil, err 68 } 69 70 return meminfo, nil 71 }