【问题标题】:How to determine available memory before a make() statement如何在 make() 语句之前确定可用内存
【发布时间】:2015-11-29 16:14:44
【问题描述】:

在 Go 中,当使用 make 语句时, 例如,分配兆字节的内存

    make([]byte, 1024*1024*d)

有没有办法在请求更多内存之前确定有多少内存可用?

【问题讨论】:

  • 没有,如果有也无济于事。重新设计您的解决方案。
  • 没有。可用的内容取决于内核,并且可能会在您请求时更改。
  • 另请注意,一些流行操作系统的内核无论如何都会向您的进程谎报可用内存的实际数量——这称为"overcommitting"
  • 哦,当我们谈到它时,IUUC 是参考 Go 实现(称为 gc,源自 Google - 而不是 gccgo,它是 GCC 的一部分)当它要求操作系统“保留”一大堆连续内存然后使用这个块进行分配时使用所谓的“竞技场”分配——参见this code 从第 231 行开始。基本上这就是为什么即使是小的 Go 程序也会出现就像使用大量的虚拟内存,而他们只使用适量的物理内存。
  • ...继续讨论这个话题,您可能会考虑根据您的需要实现一个二阶分配器(请参阅this 以获得更多指示,并且不要忘记在那里查看 cmets)或者使用现成的,例如go-slab

标签: go


【解决方案1】:

感谢您的所有意见。

我决定使用 Max_Memory 配置选项,因为它的用例是在仅运行此应用程序的测试服务器上使用 n 兆字节的内存,最大可用率约为 75%,作为触发的一种方式在测试环境中自动缩放。

【讨论】:

    【解决方案2】:

    是的,有。您可以使用gopsutil 包:

    package main
    
    import (
        "fmt"
    
        "github.com/shirou/gopsutil/mem"
    )
    
    func main() {
        vm, err := mem.VirtualMemory()
        if err != nil {
            panic(err)
        }
        fmt.Printf("Total:%d, Available:%d, Used:%d", vm.Total, vm.Available, vm.Used)
    }
    

    还有很多方法可以获取这些特定于操作系统的信息。它们都不是完美的,但它们会给你一些东西。

    您还可以将 Max Memory 作为配置变量并使用:http://godoc.org/runtime#MemStats

    【讨论】:

    • mem.VirtualMemory 报告的内容与您可以传递给make 的大小之间的关系充其量是微不足道的。另请注意,虚拟内存通常比物理内存大很多
    • vm.Available 与您是否可以分配没有实际关系。 如果服务器没有交换,并且如果服务器关闭了过度使用,并且在您检查和请求内存之间没有任何变化,以及make调用导致分配区域扩大,同时内核不会为您牺牲另一个进程,vm.Available 可能与内存不足有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多