我有一個在 400MB SQLite 文件上運行 SQL 查詢的 Golang 進程。我正在使用帶有連接字符串的https://github.com/mattn/go-sqlite3 :file:mydb.sqlite?mode=ro&_journal=DELETE在我的 Docker 開發機器上運行時,它只需要 20MB 的 RAM,但在 Google Run 上,任何小于 512MB 的實例都將返回 HTTP 代碼 500,并memory exceeded在日志中有限制。docker diff x顯示未修改 DB 文件(我認為這會導致 gVisor 將整個二進制 SQLite db 文件復制到 RAM 以對其進行修改)。docker 鏡像是如何構建的我正在使用源代碼將 SQLite DB 文件復制到圖像中: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在本地運行時永遠不會超過 20MB。限制docker run為 20MB RAM 在我的開發機器上也可以正常運行:docker run \ --memory=20m \ --memory-swap=20m \Cloud Run“容器內存分配”指標也遠低于 128M:https://console.cloud.google.com/monitoring/metrics-explorer
2 回答

函數式編程
TA貢獻1807條經驗 獲得超9個贊
根據官方文檔:
超出允許的內存限制的 Cloud Run 容器實例將被終止。
以下內容計入容器實例的可用內存:
a.運行應用程序可執行文件(因為可執行文件必須加載到內存中)
b.在您的應用程序進程中分配內存
c.將文件寫入文件系統
已部署容器映像的大小不計入可用內存。
另外我建議考慮:
您的容器實例可能超出了可用內存。要確定是否是這種情況,請在 varlog/system 日志中查找此類錯誤。如果實例超出可用內存,請考慮增加內存限制。
請注意,Cloud Run 容器實例在寫入本地文件系統的文件計入可用內存的環境中運行。這還包括未寫入 /var/log/* 或 /dev/log 的任何日志文件。
您的容器文件系統似乎正在使用內存。
- 2 回答
- 0 關注
- 158 瀏覽
添加回答
舉報
0/150
提交
取消