Go pprof内存指标含义备忘录及案例分析

最近组内一些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

总结

到此这篇关于Go pprof内存指标含义备忘录及案例分析的文章就介绍到这了,更多相关Go pprof内存指标内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • golang利用pprof与go-torch如何做性能分析

    前言 软件开发过程中,项目上线并不是终点.上线后,还要对程序的取样分析运行情况,并重构现有的功能,让程序执行更高效更稳写. golang的工具包内自带pprof功能,使找出程序中占内存和CPU较多的部分功能方便了不少.加上uber的火焰图,可视化显示,让我们在分析程序时更简单明了. pprof有两个包用来分析程序一个是net/http/pprof另一个是runtime/pprof,net/http/pprof只是对runtime/pprof包进行封装并用http暴露出来,如下图源码所示: 使用n

  • Go程序性能优化及pprof使用方法详解

    Go 程序的性能优化及 pprof 的使用 程序的性能优化无非就是对程序占用资源的优化.对于服务器而言,最重要的两项资源莫过于 CPU 和内存.性能优化,就是在对于不影响程序数据处理能力的情况下,我们通常要求程序的 CPU 的内存占用尽量低.反过来说,也就是当程序 CPU 和内存占用不变的情况下,尽量地提高程序的数据处理能力或者说是吞吐量. Go 的原生工具链中提供了非常多丰富的工具供开发者使用,其中包括 pprof. 对于 pprof 的使用要分成下面两部分来说. Web 程序使用 pprof

  • Go pprof内存指标含义备忘录及案例分析

    最近组内一些Go服务碰到内存相关的问题,所以今天抽时间看了下Go pprof内存指标的含义,为后续查问题做准备. 内容主要来自于Go代码中对这些字段的注释,加自己的理解.理解不对的地方欢迎指正. // https://github.com/golang/go/blob/master/src/runtime/mstats.go#L150 // 总共从OS申请的字节数 // 是下面各种XxxSys指标的总和.包含运行时的heap.stack和其他内部数据结构的总和. // 它是虚拟内存空间.不一定全

  • SQL Server内存遭遇操作系统进程压榨案例分析

    场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的顺序如下: 1.首先打开Cacti监控,发现最近CPU均值在某天之后骤然上升,并且可以看到System\Processor Queue Length 和 sqlservr\%ProcessorTime 也在显著的变化. 2.从最容易入手的低效SQL开始,考虑是不是最近业务做了什么修改?连接到该SQL

  • C++程序内存栈区与堆区模型案例分析

    目录 栈区: 栈区代码演示: 堆区: 堆区代码演示: new操作符: new操作符代码演示: 栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其“生死”) 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放 栈区代码演示: //内存四区-栈区 /* 栈区: 由编译器自动分配释放,存放函数的参数值,局部变量等(由编译器管理其"生死") 注意事项:不要返回局部变量的地址,栈区开辟的数据由编译器自动释放 */ #include <iostream&

  • java管道piped输入流与输出流应用场景案例分析

    目录 前言 原理简介 使用场景概述 实际应用 案例一:EXCEL文件导出功能 案例二:XML文件数据传输 结语 前言 PipedInputStream 和 PipedOutputStream 设计用来解决跨线程的字节数据传输.它们总是成对出现的,而在使用上,也只能 工作在两个不同的线程上,在一个线程里使用管道输入和输出流可能会造成死锁.网上有很多介绍这两个存在于 io 包下的 api.却几乎 找不到一个写 PipedInputStream 的使用场景的,所以本文结合实际业务,来聊一聊 Piped

  • Java多线程常见案例分析线程池与单例模式及阻塞队列

    目录 一.单例模式 1.饿汉模式 2.懒汉模式(单线程) 3.懒汉模式(多线程) 二.阻塞队列 阻塞队列的实现 生产者消费者模型 三.线程池 1.创建线程池的的方法 (1)ThreadPoolExecutor (2)Executors(快捷创建线程池的API) 2.线程池的工作流程 一.单例模式 设计模式:软件设计模式 是一套被反复使用.多数人知晓.经过分类编目.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.程序的重用性. 单例模式:是设计模式的一种.

  • vue echarts实现航班选座案例分析

    目录 背景 实现思路 代码分析 获取svg 注册自定义地图 geo组件的配置 举一反三 三 效果图 注意点 背景 最近在echarts官方看到了一个航班选座的示例,感觉很好,可以扩大,缩小,鼠标放置到座位上可以显示座位号,允许默认选中座位.于是在5.1假期抽了一点点时间,来写一篇文章,深入研究分析一下这个示例,解析一下这个示例的完整代码.首先让我们来看下示例的效果图. 实现思路 代码是使用echarts来实现的,主要用到的是svg和自定义地图的相关知识.示例的完整代码 在做选座的功能,我们使用d

  • 基于NodeJS+MongoDB+AngularJS+Bootstrap开发书店案例分析

    这章的目的是为了把前面所学习的内容整合一下,这个示例完成一个简单图书管理模块,因为中间需要使用到Bootstrap这里先介绍Bootstrap. 示例名称:天狗书店 功能:完成前后端分离的图书管理功能,总结前端学习过的内容. 技术:NodeJS.Express.Monk.MongoDB.AngularJS.BootStrap.跨域 效果: 一.Bootstrap Bootstrap是一个UI框架,它支持响应式布局,在PC端与移动端都表现不错. Bootstrap是Twitter推出的一款简洁.直

  • javascript的理解及经典案例分析

    js的简介: JavaScript是一种能让你的网页更加生动活泼的程式语言,也是目前网页中设计中最容易学又最方便的语言. 你可以利用JavaScript轻易的做出亲切的欢迎讯息.漂亮的数字钟.有广告效果的跑马灯及简易的选举,还可以显示浏览器停留的时间.让这些特殊效果提高网页的可观性. javascript现在可以再网页上做很多很多事情,网页特效,操作dom,html5游戏(基于html5和JavaScript的结合),动画等等特效,还可以实现拉去后台数据(通过ajax),不仅可以做前台还可以做后

  • JavaScript仿微博输入框效果(案例分析)

    这篇文章给大家分享一个小的JavaScript的案例,就是模仿微博输入框的效果. 效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>仿微博输入框效果</title> <script src="jquery.js"></script> </h

  • 通过Session案例分析一次性验证码登录

    验证码的实现原理: 在一个Servlet中生成验证,并把验证码上的数据保存在Session,用户提交验证码之后,会提交给另外一个Servlet程序.在获取用户提交数据的Servlet中的从Session中把验证码取出,在取出的同时从Session中把验证码删除. 1.注册页面:register.jsp <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

随机推荐