From 25f776451e88a52c2677d5c56383f03a1a4c539f Mon Sep 17 00:00:00 2001 From: unclejack Date: Fri, 15 May 2015 12:22:50 +0300 Subject: [PATCH] daemon/stats_collector: refactor getSystemCpuUsage Signed-off-by: Cristian Staretu --- daemon/stats_collector.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/daemon/stats_collector.go b/daemon/stats_collector.go index 22239743a6..98b44c3de2 100644 --- a/daemon/stats_collector.go +++ b/daemon/stats_collector.go @@ -24,6 +24,7 @@ func newStatsCollector(interval time.Duration) *statsCollector { interval: interval, publishers: make(map[*Container]*pubsub.Publisher), clockTicks: uint64(system.GetClockTicks()), + bufReader: bufio.NewReaderSize(nil, 128), } go s.run() return s @@ -35,6 +36,7 @@ type statsCollector struct { interval time.Duration clockTicks uint64 publishers map[*Container]*pubsub.Publisher + bufReader *bufio.Reader } // collect registers the container with the collector and adds it to @@ -121,14 +123,23 @@ const nanoSeconds = 1e9 // getSystemCpuUSage returns the host system's cpu usage in nanoseconds // for the system to match the cgroup readings are returned in the same format. func (s *statsCollector) getSystemCpuUsage() (uint64, error) { + var line string f, err := os.Open("/proc/stat") if err != nil { return 0, err } - defer f.Close() - sc := bufio.NewScanner(f) - for sc.Scan() { - parts := strings.Fields(sc.Text()) + defer func() { + s.bufReader.Reset(nil) + f.Close() + }() + s.bufReader.Reset(f) + err = nil + for err == nil { + line, err = s.bufReader.ReadString('\n') + if err != nil { + break + } + parts := strings.Fields(line) switch parts[0] { case "cpu": if len(parts) < 8 {