2017-12-18 348 views
2

當容器內的應用程序將日誌寫入安裝目錄中的文件時,容器使用的內存不斷增加,因此我正面臨一個問題。當寫入安裝目錄中的文件時,docker容器不斷增加內存使用量

我希望內存使用不會因此而增加。 有沒有人知道它爲什麼會增加? 謝謝!

這裏是我做過什麼:

  1. 寫剛剛寫的 「Hello World」 到 「/home/mylog/test.txt」 的應用程序。

    func main(){ 
    file, _ := os.OpenFile("/home/mylog/test.txt", os.O_WRONLY|os.O_CREATE, 0666) 
    defer file.Close() 
    for { 
        fmt.Fprintln(file, "hello world") 
        } 
    } 
    
  2. 構建搬運工圖像

 

    docker build -t mylog . 

Dockerfile

 

    FROM golang 
    RUN mkdir -p /home/mylog 
    COPY main.go /go 
    WORKDIR /go 
    CMD ["go","run","main.go"] 

  • 運行帶-v選項的容器mouting當前目錄。
  •  
    
        docker run -d -v $PWD:/home/mylog mylog 
    
    
  • 檢查存儲器使用
  •  
    
        docker stats 
    
    
  • 它使用527MiB。
  •  
        CONTAINER CPU% MEMUSAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS 
        100.41% 527MiB/15.5GiB 3.32% 648B /0B 72.3MB/0B 15 
    
  • 幾秒鐘後,它是844.8 MIB
  •  
    
        CONTAINER CPU% MEMUSAGE/LIMIT MEM% NET I/O BLOCK I/O PIDS 
        100.15% 844.8MiB/15.5GiB 5.32% 648B /0B 72.3MB/0B 15 
    
    
  • 它不斷增加和主機落井下石。
  • +0

    這難道不是造成永遠的循環,你做? –

    +0

    @DharmaSaputra:永久循環只是將數據打印到文件中。它不會持續使用內存。 – Flimzy

    +0

    我嘗試了我的機器上的代碼。實際上'推遲file.Close()'從不執行,文件'test.txt'越來越大。因爲它保持附加。 –

    回答

    4

    不時地打電話給我。

    file.Sync() 
    

    https://golang.org/pkg/os/#File.Sync

    如果不把這種寫入到內存和file.Close()等待以提交更改的文件。 而在這種情況下,Close in not called因爲它在defer(這意味着它在函數返回時被調用,並且在這裏它永遠不會返回,因爲它是永無止境的)。

    LE: 同時嘗試使用:的

    file.WriteString("hello world") 
    

    代替

    fmt.Fprintln(file, "hello world") 
    
    +0

    謝謝! file.Sync()的作品。我想知道,如果您建議使用file.Sync()或根據應用程序性能調用file.Close()。 – kmat

    +0

    如果您打算連續寫入文件,則會調用File.Sync。因爲在我需要寫入時關閉文件並再次打開該文件將會更勞動密集。 –

    +0

    謝謝你,亞歷克斯! – kmat

    相關問題