使用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{} 内存分配器使用情况
  • 工具集成

转载于:https://www.cnblogs.com/Zereker/p/11396659.html

Golang 中,可以为每个函数定义一个 `expvar` 变量来记录该函数的运行次数、运行时间等性能指标。下面是一个简单的示例: ```go package main import ( "expvar" "fmt" "math/rand" "sync" "time" ) var ( processReqCount = expvar.NewMap("processReqCount") reqDuration = expvar.NewMap("reqDuration") reqDurationMu sync.Mutex ) func main() { rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { processRequest() time.Sleep(time.Second) } fmt.Println("ProcessReq1 count:", processReqCount.Get("ProcessReq1").String()) fmt.Println("ProcessReq2 count:", processReqCount.Get("ProcessReq2").String()) fmt.Println("ProcessReq3 count:", processReqCount.Get("ProcessReq3").String()) fmt.Println("ProcessReq1 duration:", reqDuration.Get("ProcessReq1").Value()) fmt.Println("ProcessReq2 duration:", reqDuration.Get("ProcessReq2").Value()) fmt.Println("ProcessReq3 duration:", reqDuration.Get("ProcessReq3").Value()) } func processRequest() { start := time.Now() switch rand.Intn(3) { case 0: processReq1() case 1: processReq2() case 2: processReq3() } duration := time.Since(start) reqDurationMu.Lock() reqDuration.Add(getFuncName(2), float64(duration.Nanoseconds())/float64(time.Millisecond)) reqDurationMu.Unlock() } func processReq1() { processReqCount.Add("ProcessReq1", 1) time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) } func processReq2() { processReqCount.Add("ProcessReq2", 1) time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) } func processReq3() { processReqCount.Add("ProcessReq3", 1) time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) } func getFuncName(skip int) string { pc, _, _, ok := runtime.Caller(skip) if !ok { return "unknown" } return runtime.FuncForPC(pc).Name() } ``` 在上面的示例中,我们定义了两个 `expvar` 变量,分别是 `processReqCount` 和 `reqDuration`。在 `processRequest` 函数中,我们根据随机数的值选择调用 `processReq1`、`processReq2` 或 `processReq3` 函数。每个函数都对应一个 `processReqCount` 计数器,用来记录该函数被调用的次数。此外,我们还使用了 `reqDuration` 计数器,来记录每个函数的运行时间。在每个函数结束时,我们调用 `getFuncName` 函数来获取当前函数的名称,并将运行时间累加到对应的 `reqDuration` 变量中。最后,我们在主函数中输出了每个函数的执行次数和运行时间。 需要注意的是,在使用 `processReqCount` 和 `reqDuration` 变量时,我们使用了 `expvar.NewMap` 函数来创建一个 `expvar.Map` 对象。`expvar.Map` 对象可以存储 key-value 类型的数据,可以用来实现多个指标的记录。在示例中,我们使用了 `Get` 函数来获取每个函数对应的 `expvar.Int` 变量,并使用 `Add` 函数来增加计数器的值。在使用 `reqDuration` 变量时,我们使用了 `Get` 函数来获取每个函数对应的 `expvar.Float` 变量,并使用 `Add` 函数将运行时间累加到对应的变量中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值