为了账号安全,请及时绑定邮箱和手机立即绑定

Cloud Run:为什么我的实例需要这么多 RAM?

Cloud Run:为什么我的实例需要这么多 RAM?

Go
SMILET 2022-05-05 18:05:33
我有一个在 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 的任何日志文件。

您的容器文件系统似乎正在使用内存。


查看完整回答
反对 回复 2022-05-05
?
噜噜哒

TA贡献1784条经验 获得超7个赞

在 Cloud Run(全托管)环境中,磁盘存储是一个内存文件系统。关联


查看完整回答
反对 回复 2022-05-05
  • 2 回答
  • 0 关注
  • 168 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号