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 (полностью управляемой) дисковое хранилище представляет собой файловую систему в памяти. ссылка на сайт