У меня есть 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
Спасибо.