Nano Hash - криптовалюты, майнинг, программирование

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 .

Докерфайл


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

  1. Запустите контейнер с параметром -v, отключив текущий каталог.

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

  1. Проверить использование памяти

    docker stats 

  1. Он использует 527 МБ.
    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 МБ.

    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. Он продолжает увеличиваться, и хост в конце концов падает.

  • Разве это не вызвано бесконечным циклом, который вы создали? 18.12.2017
  • @DharmaSaputra: вечный цикл просто печатает данные в файл. Он не использует память постоянно. 18.12.2017
  • Я попробовал код на своей машине. На самом деле defer file.Close() никогда не выполнялся, а файл test.txt становится все больше и больше. Потому что он продолжает добавлять. 18.12.2017
  • Спасибо вам, ребята. Ответ Алекса решил мою проблему. Будет использовать file.Sync(), но не каждый раз по соображениям производительности. 18.12.2017

Ответы:


1

Звоните сюда время от времени.

file.Sync() 

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

Если вы не вызываете это, он записывает в память и ждет file.Close(), чтобы зафиксировать изменения в файле. И в этом случае Close in not called, потому что он находится в defer (это означает, что он вызывается, когда функция возвращается, а здесь он никогда не вернется, так как это бесконечный for).

Л.Э.: Также попробуйте использовать:

file.WriteString("hello world")

вместо

fmt.Fprintln(file, "hello world")
18.12.2017
  • Спасибо! file.Sync() работает. Я хотел бы знать, рекомендуете ли вы использовать file.Sync() или вызывать file.Close() с точки зрения производительности приложения. 18.12.2017
  • Я бы назвал File.Sync, если вы планируете постоянно записывать в файл. Потому что закрытие файла и открытие его снова, когда мне нужно написать, было бы более трудоемким. 18.12.2017
  • @AlexEfimov Я столкнулся с той же проблемой, но цикла for нет. У меня есть createwritestream, и я его не закрываю. В качестве наилучшей практики я закрою его, но этот метод выполняется только при определенных условиях. Так что в основном моя программа бездействует, и память все еще увеличивается. Не могли бы вы сказать, почему? 27.09.2019
  • Я предполагаю, что поток, который вы создаете, записывает в память, не записывая его на диск. Какой точный код вы используете? 27.09.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..