github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/debug.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  package metrics
    10  
    11  import (
    12  	"runtime/debug"
    13  	"time"
    14  )
    15  
    16  var (
    17  	debugMetrics struct {
    18  		GCStats struct {
    19  			LastGC Gauge
    20  			NumGC  Gauge
    21  			Pause  Histogram
    22  //暂停序列柱状图
    23  			PauseTotal Gauge
    24  		}
    25  		ReadGCStats Timer
    26  	}
    27  	gcStats debug.GCStats
    28  )
    29  
    30  //捕获在中导出的Go垃圾收集器统计信息的新值
    31  //调试.gcstats。这被称为Goroutine。
    32  func CaptureDebugGCStats(r Registry, d time.Duration) {
    33  	for range time.Tick(d) {
    34  		CaptureDebugGCStatsOnce(r)
    35  	}
    36  }
    37  
    38  //捕获在中导出的Go垃圾收集器统计信息的新值
    39  //调试.gcstats。这被设计为在后台goroutine中调用。
    40  //提供尚未提供给RegisterDebuggCStats的注册表将
    41  //恐慌。
    42  //
    43  //注意(但更不用说),因为debug.readgcstats调用
    44  //C函数runtime·lock(runtime·mheap),它虽然不能阻止世界
    45  //手术,不是你一直想做的事情。
    46  func CaptureDebugGCStatsOnce(r Registry) {
    47  	lastGC := gcStats.LastGC
    48  	t := time.Now()
    49  	debug.ReadGCStats(&gcStats)
    50  	debugMetrics.ReadGCStats.UpdateSince(t)
    51  
    52  	debugMetrics.GCStats.LastGC.Update(gcStats.LastGC.UnixNano())
    53  	debugMetrics.GCStats.NumGC.Update(gcStats.NumGC)
    54  	if lastGC != gcStats.LastGC && 0 < len(gcStats.Pause) {
    55  		debugMetrics.GCStats.Pause.Update(int64(gcStats.Pause[0]))
    56  	}
    57  //debugmetrics.gcstats.pauseQuantiles.update(gcstats.pauseQuantiles)
    58  	debugMetrics.GCStats.PauseTotal.Update(int64(gcStats.PauseTotal))
    59  }
    60  
    61  //注册中导出的Go垃圾收集器统计信息的度量
    62  //调试.gcstats。这些指标是通过其完全限定的GO符号命名的,
    63  //即debug.gcstats.pausetotal。
    64  func RegisterDebugGCStats(r Registry) {
    65  	debugMetrics.GCStats.LastGC = NewGauge()
    66  	debugMetrics.GCStats.NumGC = NewGauge()
    67  	debugMetrics.GCStats.Pause = NewHistogram(NewExpDecaySample(1028, 0.015))
    68  //debugmetrics.gcstats.pausequeantiles=newhistogram(newexpdecaysample(1028,0.015))。
    69  	debugMetrics.GCStats.PauseTotal = NewGauge()
    70  	debugMetrics.ReadGCStats = NewTimer()
    71  
    72  	r.Register("debug.GCStats.LastGC", debugMetrics.GCStats.LastGC)
    73  	r.Register("debug.GCStats.NumGC", debugMetrics.GCStats.NumGC)
    74  	r.Register("debug.GCStats.Pause", debugMetrics.GCStats.Pause)
    75  //r.register(“debug.gcstats.pausequeantiles”,debugmetrics.gcstats.pausequeantiles)
    76  	r.Register("debug.GCStats.PauseTotal", debugMetrics.GCStats.PauseTotal)
    77  	r.Register("debug.ReadGCStats", debugMetrics.ReadGCStats)
    78  }
    79  
    80  //为gcstats分配初始切片。暂停以避免在
    81  //正常运行。
    82  func init() {
    83  	gcStats.Pause = make([]time.Duration, 11)
    84  }