Go pprof内存指标含义备忘录及案例分析
作者:yoko blog 发布时间:2024-05-21 10:19:46
最近组内一些Go服务碰到内存相关的问题,所以今天抽时间看了下Go pprof内存指标的含义,为后续查问题做准备。
内容主要来自于Go代码中对这些字段的注释,加自己的理解。理解不对的地方欢迎指正。
// https://github.com/golang/go/blob/master/src/runtime/mstats.go#L150
// 总共从OS申请的字节数
// 是下面各种XxxSys指标的总和。包含运行时的heap、stack和其他内部数据结构的总和。
// 它是虚拟内存空间。不一定全部映射成了物理内存。
Sys// 见`Sys`
HeapSys// 还在使用的对象,以及不使用还没被GC释放的对象的字节数
// 平时应该平缓,gc时可能出现锯齿
HeapAlloc// 正在使用的对象字节数。
// 有个细节是,如果一个span中可包含多个object,只要一个object在使用,那么算的是整个span。
// `HeapInuse` - `HeapAlloc`是GC中保留,可以快速被使用的内存。
HeapInuse// 已归还给OS的内存。没被堆再次申请的内存。
HeapReleased// 没被使用的span的字节数。
// 这部分内存可以被归还给OS,并且还包含了`HeapReleased`。
// 可以被再次申请,甚至作为栈内存使用。
// `HeapIdle` - `HeapReleased`即GC保留的。
HeapIdle/// ---
// 和`HeapAlloc`一样
Alloc// 累计的`Alloc`
// 累计的意思是随程序启动后一直累加增长,永远不会下降。
TotalAlloc// 没什么卵用
Lookups = 0// 累计分配的堆对象数
Mallocs// 累计释放的堆对象数
Frees// 存活的对象数。见`HeapAlloc`
// HeapObjects = `Mallocs` - `Frees`
HeapObjects// ---
// 下面的XxxInuse中的Inuse的含义,和XxxSys中的Sys的含义,基本和`HeapInuse`和`HeapSys`是一样的
// 没有XxxIdle,是因为都包含在`HeapIdle`里了// StackSys基本就等于StackInuse,再加上系统线程级别的栈内存
Stack = StackInuse / StackSys// 为MSpan结构体使用的内存
MSpan = MSpanInuse / MSpanSys// 为MCache结构体使用的内存
MCache = MCacheInuse / MCacheSys// 下面几个都是底层内部数据结构用到的XxxSys的内存统计
BuckHashSys
GCSys
OtherSys// ---
// 下面是跟GC相关的// 下次GC的触发阈值,当HeapAlloc达到这个值就要GC了
NextGC// 最近一次GC的unix时间戳
LastGC// 每个周期中GC的开始unix时间戳和结束unix时间戳
// 一个周期可能有0次GC,也可能有多次GC,如果是多次,只记录最后一个
PauseNs
PauseEnd// GC次数
NumGC// 应用程序强制GC的次数
NumForcedGC// GC总共占用的CPU资源。在0~1之间
GCCPUFraction// 没被使用,忽略就好
DebugGC
查看方式
// 方式一
import "runtime"var m runtime.MemStats
runtime.ReadMemStats(&m)
// 方式二
import _ "net/http/pprof"
import "net/http"
http.ListenAndServe("0.0.0.0:10001", nil)
// http://127.0.0.1:10001/debug/pprof/heap?debug=1
下面随便找个服务来练手。
Top查看程序的 VIRT 约为2.4G, RES 约为1.7G。
使用web pprof观察到的指标,可以对应着前文说的含义看看。
# Sys = 1842916040 ~1.7G
# HeapSys = 1711013888 ~1.6G
# HeapInuse = 1237483520 ~1.18G
# HeapAlloc = 1195472528 ~1.14G
HeapInuse - HeapAlloc = 40M
# HeapIdle = 473530368 ~451M
# HeapReleased = 61063168 ~58.2M
HeapIdle - HeapReleased = 393M# Alloc = 1195472528 ~1.14G
# TotalAlloc = 426616278424 ~397.3G# Lookups = 0
# Mallocs = 2907819388 ~29亿对象数
# Frees = 2901808898 ~29亿对象数
# HeapObjects = 6010490 ~601万对象数# Stack = 33390592 / 33390592 ~31.8M / 31.8M
# MSpan = 13542744 / 19906560 ~12.9M / 18.9M
# MCache = 55552 / 65536
# BuckHashSys = 2371870
# GCSys = 69398992
# OtherSys = 6768602
来源:https://www.pengrl.com/p/20031/?utm_source=tuicool&utm_medium=referral


猜你喜欢
- 问题:我在 Vue 中有一个 form 表单,用于上传博客帖子,它有标题、正文、描述、片段和图片等范围。所有的一切都是必需的。我在 Expr
- --会员表 if object_id('userinfo','u') is not null drop ta
- 1. 建立与SQLite数据库的连接SQLite是python自带的一款基于内存或硬盘的、开源的、关系型的轻量级数据库。这意味着无需下载安装
- 本文通过图文并茂的方式给大家展示SQL SERVER数据库表记录只保留N天图文教程,具体方法步骤请看下文:第一步:首先设置SQL Serve
- 函数作用:该函数的作用即按字面意思理解,topk:取数组的前k个元素进行排序。通常该函数返回2个值,第一个值为排序的数组,第二个值为该数组中
- PyTorch加载模型model.load_state_dict()问题希望将训练好的模型加载到新的网络上。如上面题目所描述的,PyTorc
- 1.查询表名: 代码如下:select table_name,tablespace_name,temporary from user_tab
- 问题描述由于画图时plt.title()默认是显示英文,如果我们设置标题为中文,会无法显示,如图:plt.title('训练损失
- 本文讲述了python开发之IDEL(Python GUI)的使用方法。分享给大家供大家参考,具体如下:在安装完Python后,我们希望能够
- 现在浏览器种类也越来越多,诸如 IE、Firefox、Chrome、Safari等等,因此现在要实现一个js复制内容到剪贴板的小功能就不是一
- ob缓存介绍ob是output buffering的简称,输出缓冲区,缓冲区是通过php.ini中的output_buffering变量控制
- 1、引言选择排序里面主要讲了三个排序,分别是简单选择排序、树形选择排序、堆排序。今天这篇文章主要讲树形选择排序,树形选择排序也被称为锦标赛排
- 这段时间服务器崩溃2次,一直没有找到原因,今天看到论坛发出的错误信息邮件,想起可能是mysql的默认连接数引起的问题,一查果然,老天,默认
- 前言调用EXPLAIN可以获取关于查询执行计划的信息,以及如何解释输出。EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法,但该动
- 前言:文章里用的Python环境是Anaconda3 2019.7这里测试的程序是找出所有1000以内的勾股数。a∈[1,
- 目录前言map 并发操作出现问题sync.Map 解决并发操作问题计算 map 长度计算 sync.Map 长度前言在 Golang 中 m
- 数据结构和算法算法:解决问题的方法和步骤评价算法的好坏:渐近时间复杂度和渐近空间复杂度。渐近时间复杂度的大O标记:- 常量时间复杂度 - 布
- 前言最近在开发环境 oracle 启动侦听的时候,出现了 TNS:permission denied 的问题,通过网上和咨询朋友,最终找到了
- 注意,本文代码是使用在txt文档上,同时txt文档中的内容每一行代表的是图片的名字。#coding:utf-8 import shutil
- 步骤一:申请百度地图密钥;JavaScript API v1.4以及以前的版本无序申请秘钥(ak),自v1.5版本开始需要先申请秘钥(ak)