2017-12-18 481 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

    相关问题