【问题标题】:How much memory does Go take to compile dependencies and source code?Go 需要多少内存来编译依赖项和源代码?
【发布时间】:2022-01-08 01:27:49
【问题描述】:

我面临的问题是我们有一个具有 500MB RAM 和 2CPU 内核的 docker 容器,这使得编译变得不稳定。有时它有效,有时则无效。虽然显而易见的解决方案是增加 RAM 内存,但我们无法继续增加内存。

因此我的问题是,给定一组依赖项,是否可以预先确定编译我的 go 代码所需的内存,如果可以,如何?

虽然有pprof,但好像是用来跟踪应用内存的。

以下结果取自golangci-lint

执行的命令:

golangci-lint run --issues-exit-code 1 --no-config --disable-all -E typecheck --enable=gosec --enable=unparam --enable=unconvert --enable=gocritic  --enable=ineffassign --enable=staticcheck --enable=dupl --enable=gocyclo --enable=gofmt --enable=golint --enable=deadcode --enable=errcheck --enable=gosimple --enable=govet --enable=structcheck --enable=typecheck --enable=unused --enable=varcheck

结果:

INFO File cache stats: 0 entries of total size 0B 
INFO Memory: 22 samples, avg is 58.7MB, max is 66.8MB 
INFO Execution took 2.063380705s 

【问题讨论】:

  • 实际上,您可以尝试使用各种内存限制运行编译器,看看它何时开始/停止工作unix.stackexchange.com/questions/44985
  • “我们不能继续增加内存”这在技术上是正确的,但无关紧要。现在是 2022 年; 500 MB 的内存并不多。您的内存消耗不会以数量级无限增长。给你的构建环境更多。你的时间对你来说比 500GB 的微不足道的成本更有价值。
  • 这里youtube.com/watch?v=qPIB3STWXVk (> 30m) 你可以了解更多关于编译器工具的信息。大多数情况下,您可以 memprofile 编译过程和其他内容。通过其余的演练,您可以了解标志。因此,您可以尝试一些 settigns 设置来获得适合您的设置。虽然,天真的理解,系统应该将页面交换到磁盘以花费更长的时间,但避免OOM,从而提高成功率。它不是 ?您的报告也缺少详细信息。您正在显示 gitlab 命令行,这还不够。

标签: go memory memory-management compilation


【解决方案1】:

[我]可以预先确定编译我的 go 代码所需的内存 [?]

没有。对不起。

【讨论】:

    【解决方案2】:

    您无法“预先确定”容器的内存要求。即使您确切知道 go build 过程使用了多少,容器也会使用不同的数量 - 想想文件缓冲区和缓存

    计算出最佳编译内存的一种方法是使用像 https://github.com/facebookincubator/senpai 这样的工具来分析负载下的容器。

    当然,如果正在编译的东西发生变化,那么它将需要不同数量的内存,但可以估算

    【讨论】:

      猜你喜欢
      • 2020-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 2020-02-29
      • 2014-05-31
      • 1970-01-01
      • 2019-06-22
      相关资源
      最近更新 更多