写入已安装目录中的文件时,docker容器会不断增加内存使用量

kma*_*mat 2 linux memory containers go 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")
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 建立一个Docker映像

    docker build -t mylog。

Docker文件

    从高朗
    运行mkdir -p / home / mylog
    COPY main.go / go
    WORKDIR / go
    CMD [“ go”,“ run”,“ main.go”]

  1. 运行带有-v选项的容器,将其装载到当前目录中。
    泊坞窗运行-d -v $ PWD:/ home / mylog mylog 

  1. 检查内存使用情况
    码头工人统计 

  1. 使用的是527MiB。
    容器CPU%内存/极限MEM%净I / O块I / O PID 
     100.41%527MiB / 15.5GiB 3.32%648B / 0B 72.3MB / 0B 15
  1. 几秒钟后,就是844.8 MiB
    容器CPU%内存/极限MEM%净I / O块I / O PID
     100.15%844.8MiB / 15.5GiB 5.32%648B / 0B 72.3MB / 0B 15

  1. 它不断增加,主机最终崩溃。

Ale*_*mov 5

时不时拨打此电话。

file.Sync() 
Run Code Online (Sandbox Code Playgroud)

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

如果您不调用它,它将写入内存并等待file.Close()以将更改提交到文件。并且在这种情况下,Close in not called因为它在a中defer(这意味着函数返回时会调用它,在这里它永远不会返回,因为它是永无止境的)。

LE:也尝试使用:

file.WriteString("hello world")
Run Code Online (Sandbox Code Playgroud)

代替

fmt.Fprintln(file, "hello world")
Run Code Online (Sandbox Code Playgroud)