Cloud Run: зачем моему экземпляру так много оперативной памяти? - PullRequest
0 голосов
/ 19 января 2020

У меня есть Golang процесс, который запускает SQL запросов к 400-мегабайтному файлу SQLite.

Я использую https://github.com/mattn/go-sqlite3 со строкой подключения:

file:mydb.sqlite?mode=ro&_journal=DELETE

При запуске на моем компьютере разработчика на Docker ему требуется только 20 МБ ОЗУ, но в Google Run любой экземпляр размером менее 512 МБ вернет HTTP-код 500 с пределом memory exceeded в журналах.

docker diff x показывает, что файл БД не изменяется (что, как я полагаю, приведет к тому, что gVisor скопирует весь двоичный файл базы данных SQLite в ОЗУ для его изменения).

Как образ docker build

Я копирую файл БД SQLite в образ с исходным кодом:

FROM golang:latest
...
COPY . /go/src/api

В моем файле Golang есть глобальная переменная: var db *sqlx.DB

Это устанавливается в главном fn до ListenAndServe:

conStr := fmt.Sprintf("file:%s?mode=ro&_journal=DELETE", *fileName)
dbConn, err := sqlx.Open("sqlite3", conStr)
db = dbConn

Я запрашиваю БД в HTTP-запросе:

err := db.Selectv(&outDataSet, "SELECT...", arg1, arg2)

Почему это должна быть проблема со средой Cloud Run

docker stats никогда не превышает 20 МБ при локальном запуске.

Ограничение docker run до 20 МБ ОЗУ также o отлично работает на моем компьютере разработчика:

docker run \
  --memory=20m \
  --memory-swap=20m \

Метрику «Распределение памяти для контейнера» метри c также остается значительно ниже 128M:

https://console.cloud.google.com/monitoring/metrics-explorer

Container Memory Allocation

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Согласно официальной документации:

Настройка пределов памяти

Экземпляры контейнера Cloud Run, превышающие допустимый предел памяти, прекращаются.

Следующие значения учитываются для доступной памяти вашего экземпляра контейнера:

a.запуск исполняемого файла приложения (поскольку исполняемый файл должен быть загружен в память)

b.распределение памяти в процессе приложения

c. Запись файлов в файловую систему

Размер развернутого образа контейнера не учитывается в доступной памяти.

Также я бы предложил рассмотрим:

Превышают ли ваши экземпляры контейнеров память?

Возможно, экземпляры ваших контейнеров превышают доступную память. Чтобы определить, так ли это, найдите такие ошибки в журналах varlog / system. Если экземпляры превышают доступную память, рассмотрите возможность увеличения лимита памяти.

Обратите внимание, что экземпляры контейнера Cloud Run выполняются в среде, в которой файлы, записанные в локальную файловую систему, учитываются в доступной памяти. Сюда также входят любые файлы журналов, которые не записаны в / var / log / * или /dev/log.

Кажется, что файловые системы вашего контейнера используют память.

2 голосов
/ 25 января 2020

В облачной среде (полностью управляемой) дисковое хранилище представляет собой файловую систему в памяти. ссылка

...