Cloud Run: зачем моему экземпляру так много оперативной памяти?

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

Я использую 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 в ОЗУ для его изменения).

Как создается образ докера

Копирую файл SQLite DB в изображение с исходным кодом:

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

У меня есть глобальный var в моем файле 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 МБ ОЗУ также отлично работает на моей машине разработчика:

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

Показатель Cloud Run "Распределение памяти контейнера" также остается ниже 128 МБ:

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

Спасибо.

2 ответа

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

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

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

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

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

б) выделение памяти в процессе приложения

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

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

Также предлагаю учесть:

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

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

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

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

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

Другие вопросы по тегам