我正在寻找类似于-XmxJava 的选项,即分配我的 Go 应用程序可以使用的最大运行时内存。正在检查运行时,但如果那是要走的路,则不完全检查。我尝试用 func SetMaxStack() 设置这样的东西,(可能非常愚蠢)debug.SetMaxStack(5000000000) // bytesmodel.ExcelCreator()我之所以要这样做,是因为目前有足够的 RAM 可用,但应用程序不会消耗超过 4-6%,我在这里可能是错的,但它可能会迫使 GC 发生的速度比需要的快得多导致性能问题。我在做什么从 RDBMS 系统获取大数据集,处理它以在 excel 中写出。我寻找这样一个选项的另一个原因是限制最终部署它的服务器上 RAM 的最大使用量。对此的任何提示将不胜感激。
1 回答
largeQ
TA贡献2039条经验 获得超7个赞
当前稳定的 Go (1.10) 只有一个旋钮,可用于通过 Go 运行时执行的垃圾收集来交换内存以降低 CPU 使用率。这个旋钮叫做GOGC
,它的描述是
该
GOGC
变量设置初始垃圾收集目标百分比。当新分配的数据与上次收集后剩余的实时数据的比率达到此百分比时,将触发收集。默认值为GOGC=100
。设置GOGC=off
完全禁用垃圾收集器。该runtime/debug
包的SetGCPercent
功能允许在运行时更改此百分比。
因此,基本上将其设置为200
将使正在运行的进程的 Go 运行时可能使用的内存量增加一倍。
话虽如此,我会注意到 Go 运行时实际上会尝试将其垃圾收集器的行为调整为您正在运行的程序的工作负载和手头的 CPU 处理能力。我的意思是,通常情况下你的程序不消耗大量 RAM 并没有什么问题——如果收集器恰好以足够快的速度清除垃圾而不会显着影响性能,我认为没有理由担心:Go 的 GC 是其中之一在运行时进行了最激烈的微调,实际上效果很好。
因此,您可以尝试采用另一条路线:
分析程序的内存分配。分析配置文件并尝试找出热点在哪里,以及是否(以及如何)优化它们。
优化。通常,这相当于使某些缓冲区可在对使用它们的相同函数的不同调用之间重复使用,预分配切片而不是逐渐增加它们,在认为有用的
sync.Pool
地方使用等。这些措施实际上可能会增加真正使用的内存(即,活动对象——而不是垃圾),但它可能会降低 GC 的压力。
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报
0/150
提交
取消