瀏覽代碼

Fix high cpu usage caused by docker stats.

Signed-off-by: Tianyi Wang <capkurmagati@gmail.com>
Tianyi Wang 9 年之前
父節點
當前提交
54e8beec9b
共有 2 個文件被更改,包括 14 次插入0 次删除
  1. 10 0
      api/client/container/stats.go
  2. 4 0
      api/client/container/stats_helpers.go

+ 10 - 0
api/client/container/stats.go

@@ -192,13 +192,23 @@ func runStats(dockerCli *client.DockerCli, opts *statsOptions) error {
 
 
 	for range time.Tick(500 * time.Millisecond) {
 	for range time.Tick(500 * time.Millisecond) {
 		printHeader()
 		printHeader()
+		toRemove := []string{}
 		cStats.mu.Lock()
 		cStats.mu.Lock()
 		for _, s := range cStats.cs {
 		for _, s := range cStats.cs {
 			if err := s.Display(w); err != nil && !opts.noStream {
 			if err := s.Display(w); err != nil && !opts.noStream {
 				logrus.Debugf("stats: got error for %s: %v", s.Name, err)
 				logrus.Debugf("stats: got error for %s: %v", s.Name, err)
+				if err == io.EOF {
+					toRemove = append(toRemove, s.Name)
+				}
 			}
 			}
 		}
 		}
 		cStats.mu.Unlock()
 		cStats.mu.Unlock()
+		for _, name := range toRemove {
+			cStats.remove(name)
+		}
+		if len(cStats.cs) == 0 && !showAll {
+			return nil
+		}
 		w.Flush()
 		w.Flush()
 		if opts.noStream {
 		if opts.noStream {
 			break
 			break

+ 4 - 0
api/client/container/stats_helpers.go

@@ -97,6 +97,10 @@ func (s *containerStats) Collect(ctx context.Context, cli client.APIClient, stre
 			if err := dec.Decode(&v); err != nil {
 			if err := dec.Decode(&v); err != nil {
 				dec = json.NewDecoder(io.MultiReader(dec.Buffered(), responseBody))
 				dec = json.NewDecoder(io.MultiReader(dec.Buffered(), responseBody))
 				u <- err
 				u <- err
+				if err == io.EOF {
+					break
+				}
+				time.Sleep(100 * time.Millisecond)
 				continue
 				continue
 			}
 			}