首页 > 解决方案 > 如何让 Go 程序使用更多内存?这是推荐的吗?

问题描述

我正在寻找类似于-XmxJava 的选项,即分配我的 Go 应用程序可以使用的最大运行时内存。正在检查运行时,但不完全是这样。

我尝试使用 func SetMaxStack() 设置类似的东西,(可能非常愚蠢)

debug.SetMaxStack(5000000000) // bytes
model.ExcelCreator()

我希望这样做的原因是因为目前有足够的 RAM 可用,但应用程序不会消耗超过 4-6% ,我在这里可能错了,但它可能会迫使 GC 发生得比需要的快得多导致性能问题。

我在做什么

从 RDBMS 系统获取大型数据集,处理它以在 excel 中写出。

我寻找这样一个选项的另一个原因是限制最终部署它的服务器上 RAM 的最大使用量。

对此的任何提示将不胜感激。

标签: gomemory-management

解决方案


当前稳定的 Go (1.10) 只有一个旋钮,可用于通过 Go 运行时执行的垃圾收集来交换内存以降低 CPU 使用率。这个旋钮叫做GOGC,它的描述是

GOGC变量设置初始垃圾回收目标百分比。当新分配的数据与上一次收集后剩余的实时数据的比率达到此百分比时,将触发收集。默认值为GOGC=100. 设置GOGC=off完全禁用垃圾收集器。该runtime/debug包的SetGCPercent功能允许在运行时更改此百分比。请参阅https://golang.org/pkg/runtime/debug/#SetGCPercent

因此,基本上将其设置为200据说会使运行进程的 Go 运行时可能使用的内存量翻倍。

话虽如此,我会注意到 Go 运行时实际上会尝试根据正在运行的程序的工作负载和手头的 CPU 处理能力来调整其垃圾收集器的行为。我的意思是,通常你的程序不消耗大量 RAM 并没有什么问题——如果收集器碰巧足够快地清理垃圾而不会显着影响性能,我认为没有理由担心:Go 的 GC 是其中之一在运行时最激烈的微调点,实际上效果很好

因此,您可以尝试采取另一条路线:

  • 分析程序的内存分配。分析配置文件并尝试找出热点在哪里,以及是否(以及如何)可以优化它们。

    您可能会从这里开始, 然后继续对这些内容进行大量其他 介绍

  • 优化。通常,这相当于使某些缓冲区在对使用它们的相同函数的不同调用中可重用,预先分配切片而不是逐渐增长它们,使用sync.Pool认为有用的地方等。

    这些措施实际上可能会增加真正使用的内存(即由活动对象而不是垃圾),但它可能会降低 GC 的压力。


推荐阅读