如何准确跟踪内存使用情况?

问题描述 投票:0回答:3

我正在尝试构建一个小工具,让我可以通过 Go 运行程序并跟踪内存使用情况。我使用

r.exec = exec.Command(r.Command, r.CommandArgs...)
来运行命令,并使用 runtime.MemStats 来跟踪内存使用情况(在单独的 go 例程中):

func monitorRuntime() {
    m := &runtime.MemStats{}
    f, err := os.Create(fmt.Sprintf("mmem_%s.csv", getFileTimeStamp()))
    if err != nil {
        panic(err)
    }
    f.WriteString("Time;Allocated;Total Allocated; System Memory;Num Gc;Heap Allocated;Heap System;Heap Objects;Heap Released;\n")
    for {
        runtime.ReadMemStats(m)
        f.WriteString(fmt.Sprintf("%s;%d;%d;%d;%d;%d;%d;%d;%d;\n", getTimeStamp(), m.Alloc, m.TotalAlloc, m.Sys, m.NumGC, m.HeapAlloc, m.HeapSys, m.HeapObjects, m.HeapReleased))
        time.Sleep(5 * time.Second)
    }
}

当我用简单的程序测试我的代码(大约 12 小时)时,我注意到 Go 不断分配更多内存: System Memory Heap Allocation

我又做了一些测试,例如在没有任何其他代码的情况下运行

monitorRuntime()
函数,或者使用 pprof,例如:

package main

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    http.ListenAndServe(":8080", nil)
}

但我仍然注意到内存分配不断增加,就像图表中一样。

如何准确跟踪我想通过 Go 运行的程序的内存使用情况? 我知道我过去使用过的一种方法是使用

/proc/$PID/statm
,但该文件并不存在于每个操作系统(例如 MacOS 或 Windows)中

go memory-leaks
3个回答
1
投票

标准 Go 中没有办法获取从

exec.Command
调用的程序的内存使用情况。
runtime.ReadMemStats
仅返回 go 运行时跟踪的内存(在本例中,仅是文件处理和 sprintf)。

最好的选择是执行平台特定的命令来获取内存使用情况。


0
投票

在 Linux (RedHat) 上,以下内容将显示内存使用情况:

ps -No pid,comm,size,vsize,args:90


0
投票

查看这个图书馆

https://github.com/shirou/gopsutil/

有例子是


package main

import (
    "fmt"

    "github.com/shirou/gopsutil/v3/mem"
    // "github.com/shirou/gopsutil/mem"  // to use v2
)

func main() {
    v, _ := mem.VirtualMemory()

    // almost every return value is a struct
    fmt.Printf("Total: %v, Free:%v, UsedPercent:%f%%\n", v.Total, v.Free, v.UsedPercent)

    // convert to JSON. String() is also implemented
    fmt.Println(v)
}

这个例子是自我管理的,也许你可以修改它,来管理你用你的应用程序启动的特定应用程序

© www.soinside.com 2019 - 2024. All rights reserved.