Go语言大内存垃圾回收性能问题

3

我正在考虑在Go中实现一个内存缓存守护程序。它具有潜在的严重内存利用(例如,1TB)。将其分成单独的堆是不好的选择,我想要全部在一个内存空间中。是否有人有使用Go处理如此巨大的内存大小的经验?GC是否能够正常执行?


鉴于您列出的要求,我很想用非垃圾收集语言编写这样的程序。要确保良好的缓存过期已经足够困难,不需要再担心垃圾收集。 - Evan
此外,如果您的需求很简单,您可能不必自行实现任何内容;groupcache(https://github.com/golang/groupcache)也许可以满足您的需要。 - Evan
@Evan 我考虑过groupcache;但我相当确定它不是我需要的,因为我计划将相当多的处理逻辑放入我的“缓存”中(例如聚合)。问题是,没有太多非GC语言可以强迫自己使用。想到用C++来做这件事就让我感到恐惧。 - MK.
2
如果数据量达到了1TB,且块比较大,那么你可能会选择使用mmap来处理原始数据,并仅对元数据进行垃圾回收。这基本上就是groupcache所做的事情。但如果你有1TB的16字节块,则情况就不同了。 - Russ Cox
@RussCox 我在考虑相对较大的块(比如,每个10Mb的块有数千个)。mmap听起来很有趣,但我在 https://github.com/golang/groupcache 上没有看到任何关于mmap使用的参考资料? - MK.
1个回答

3

我也尝试过类似的事情,但是只有一个名为binary tree treap的项目给了我很好的缓存数据性能:https://github.com/stathat/treap。在一台内存为8GB的Ubuntu 12.0.4 LTS机器上,treap支持了超过100万个节点,并且加载和搜索数据速度非常快。

我测试了其他一些项目,包括LMDB,但不支持许多内存节点,kvgo-cachegoleveldb,但没有一个比treap从内存恢复数据更快。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接