github.com/hauerwu/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  }