登录
首页 >  Golang >  Go问答

获取Golang进程的RSS信息,使用runtime.MemStats如何实现?

来源:stackoverflow

时间:2024-02-07 08:45:24 472浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《获取Golang进程的RSS信息,使用runtime.MemStats如何实现?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我从runtime.memstats读取了(go)mem信息,但找不到rss值,我使用m.heapsys-m.heapreleased,但发现该值非常不像rss,我也通过其他工具转储rss (github.com/shirou/gopsutil/process),我想知道如何通过memstats获取rss,以及为什么m.heapsys-m.heapreleased和m.sys不等于rss,所以值不同? p>

package main

import (
    "fmt"
    "github.com/gin-gonic/gin"
    "io/ioutil"
    "log"
    "os"

    "github.com/dustin/go-humanize"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "github.com/shirou/gopsutil/process"

    "runtime"
    "strconv"
    "strings"
    "syscall"
    "time"
)

var pagesize = syscall.getpagesize()

// rss returns the resident set size of the current process, unit in mib
func rss() int {
    data, err := ioutil.readfile("/proc/self/stat")
    if err != nil {
        log.fatal(err)
    }
    fs := strings.fields(string(data))
    rss, err := strconv.parseint(fs[23], 10, 64)
    if err != nil {
        log.fatal(err)
    }
    return int(uintptr(rss) * uintptr(pagesize) / (1 << 20)) // mib
}

func getps(pid int) {
    ps, _ := process.processes()
    for _, p := range ps {
        if p.pid == int32(pid) {
            mem, _ := p.memoryinfo()
            fmt.printf("get by process rss:%s\n", humanize.bytes(mem.rss))
        }
    }
}
func main() {
    pid := os.getpid()

    go func() {
        for {
            var m runtime.memstats
            runtime.readmemstats(&m)
            fmt.printf("rss:%s\n", humanize.bytes(m.heapsys-m.heapreleased))
            getps(pid)
            fmt.println("rss by file:mb", rss())
            fmt.println()
            time.sleep(10 * time.second)
        }
    }()
    r := gin.default()
    r.get("/metrics", gin.wraph(promhttp.handler()))
    log.fatal(r.run())
}

*/

输出如下

rss:6.6 MB
get by process rss:18 MB
rss by file:MB 17

正确答案


最接近的值是 memstats.Sys ~= RSS ,但它们并不绝对相等,因为 rss 包含其他一些内容,例如 share lib,equal ,以及 go内存alose可以来自虚拟内存,而不是全部来自rss

the RSS explation

你不能。 runtime.Memstats 不提供该信息。

因为 RSS 是一个完全不同的指标。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>