使用expvar进行监控
-
前言:
- 包expvar为公共变量提供了一个标准化的接口。如服务器中的操作计数器。
- 它以 JSON 格式通过 /debug/vars 接口以 HTTP 的方式公开这些公共变量。
- 设置或修改这些公共变量的操作是原子的。
- 除了程序使用的公共变量,还注册了
- cmdline:这个变量就是启动命令
- memstats: 这个变量里面存放着内存的使用情况,
-
expvar 的使用可参考: https://orangetux.nl/post/expvar_in_action/
- 以下具体介绍memstats,存放在runtime.mstatss.go文件的 mstats struct
-
memstats:(单位为字节)红色为重点
- Alloc 堆空间分配的字节数
- TotalAlloc 从服务开始运行至今分配器为分配的堆空间总和
- Sys 进程从系统获得的内存空间,虚拟地址空间
- Lookups 被runtime监视的指针数
- Mallocs 服务 malloc的次数
- Frees 服务 回收的heap objects
- HeapAlloc 进程 堆内存分配使用的空间,通常是用户new出来的堆对象,包含未被gc掉的
- HeapSys 进程从系统获得的堆内存,因为golang底层使用TCmalloc机制,会缓存一部分堆内存,虚拟地址空间。
- HeapIdle 回收了的堆内存
- HeapInuse 正在使用的堆内存
- HeapReleased 返回给OS的堆内存
- HeapObjects 堆内存块申请的量
- StackInuse 正在使用的栈
- StackSys 系统分配的作为运行栈的内存
- MSpanInuse uint64 用于测试用的结构体使用的字节数, 不受GC控制
- MSpanSys uint64 系统为测试用的结构体分配的字节数
- MCacheInuse mcache 结构体申请的字节数(不会被视为垃圾回收)
- MCacheSys 操作系统申请的堆空间用于mcache的字节数
- BuckHashSys 用于剖析桶散列表的堆空间
- GCSys 垃圾回收标记元信息使用的内存
- OtherSys golang系统架构占用的额外空间
- NextGC 垃圾回收器检视的内存大小
- LastGC 垃圾回收器最后一次执行时间
- PauseTotalNs 圾回收或者其他信息收集导致服务暂停的次数
- PauseNs 记录每次gc暂停的时间(纳秒),最多记录256个最新记录。
- PauseEnd [256]uint64 一个循环队列,记录最近垃圾回收系统中断的时间开始点
- NumGC 记录gc发生的次数。
- NumForcedGC uint32 服务调用runtime.GC()强制使用垃圾回收的次数
- GCCPUFraction float64 垃圾回收占用服务CPU工作的时间总和。如果有100个goroutine,垃圾回收的时间为1S,那么久占用了100S
- EnableGC bool 是否启用GC
- DebugGC bool 是否启动DebugGC
- BySize [61]struct{} 内存分配器使用情况
-
工具集成
-
有一些工具可以很方便地集成 expvar, 提供监控和可视化能力, 例如:
-
expvarmon(https://github.com/divan/expvarmon), 基于控制台的轻量级监控工具
- netdata(https://github.com/firehol/netdata/wiki/Monitoring-Go-Applications), 功能全面的服务器实时监控工具, 提供 golang expvar 支持模块
-