写入装入目录

时间:2017-12-18 09:39:06

标签: linux docker go memory containers

我遇到一个问题,当容器内的应用程序将日志记录到已安装目录中的文件中时,容器使用的内存会不断增加。

我预计内存使用率不会因此而增加。 有谁知道它为什么会增加? 谢谢!!

这是我做的:

  1. 写一个只写'#34; 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. 构建泊坞窗图片

  3. 
        docker build -t mylog .
    
    

    Dockerfile

    
        FROM golang
        RUN mkdir -p /home/mylog
        COPY main.go /go
        WORKDIR /go
        CMD ["go","run","main.go"]
    
    
    1. 使用-v选项运行一个容器,用于管理当前目录。
    2. 
          docker run -d -v $PWD:/home/mylog mylog 
      
      
      1. 检查内存使用情况
      2. 
            docker stats 
        
        
        1. 使用527MiB。
        2.     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
          
          1. 几秒钟后,它是844.8 MiB
          2. 
                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
            
            
            1. 最后不断增加,主持人不断下降。

1 个答案:

答案 0 :(得分:5)

不时打电话给这个。

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")