douqu2481 2017-12-18 09:39
浏览 973
已采纳

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

I'm facing an issue that memory used by a container keep increasing when an app inside the container writing log into a file in a mounted directory.

I'd expect memory usage doesn't increase by this. Does anyone have idea why it increases ? Thank you !!

Here is what I did:

  1. Write an app which just writes "hello world" into "/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. Build a docker image


    docker build -t mylog .

Dockerfile


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

  1. Run a container with -v option mouting the current dir.

    docker run -d -v $PWD:/home/mylog mylog 

  1. Check memory usage

    docker stats 

  1. It's using 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
  1. After a few seconds, it is 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

  1. It keeps increasing and the host downs in the end.
  • 写回答

1条回答 默认 最新

  • dstm2014 2017-12-18 10:17
    关注

    Call this from time to time.

    file.Sync() 
    

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

    If you do not call this it writes to memory and waits for file.Close() in order to commit the changes to the file. And in this case Close in not called because it is in a defer (this means it is called when the function returns, and here it will never return since it is a never-ending for).

    LE: Also try using:

    file.WriteString("hello world")
    

    instead of

    fmt.Fprintln(file, "hello world")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 软件定义网络mininet和onos控制器问题
  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。