github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/metrics/runtime.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"
    13  	"runtime/pprof"
    14  	"time"
    15  )
    16  
    17  var (
    18  	memStats       runtime.MemStats
    19  	runtimeMetrics struct {
    20  		MemStats struct {
    21  			Alloc         Gauge
    22  			BuckHashSys   Gauge
    23  			DebugGC       Gauge
    24  			EnableGC      Gauge
    25  			Frees         Gauge
    26  			HeapAlloc     Gauge
    27  			HeapIdle      Gauge
    28  			HeapInuse     Gauge
    29  			HeapObjects   Gauge
    30  			HeapReleased  Gauge
    31  			HeapSys       Gauge
    32  			LastGC        Gauge
    33  			Lookups       Gauge
    34  			Mallocs       Gauge
    35  			MCacheInuse   Gauge
    36  			MCacheSys     Gauge
    37  			MSpanInuse    Gauge
    38  			MSpanSys      Gauge
    39  			NextGC        Gauge
    40  			NumGC         Gauge
    41  			GCCPUFraction GaugeFloat64
    42  			PauseNs       Histogram
    43  			PauseTotalNs  Gauge
    44  			StackInuse    Gauge
    45  			StackSys      Gauge
    46  			Sys           Gauge
    47  			TotalAlloc    Gauge
    48  		}
    49  		NumCgoCall   Gauge
    50  		NumGoroutine Gauge
    51  		NumThread    Gauge
    52  		ReadMemStats Timer
    53  	}
    54  	frees       uint64
    55  	lookups     uint64
    56  	mallocs     uint64
    57  	numGC       uint32
    58  	numCgoCalls int64
    59  
    60  	threadCreateProfile = pprof.Lookup("threadcreate")
    61  )
    62  
    63  //捕获在中导出的Go运行时统计信息的新值
    64  //运行时.memstats。这被称为Goroutine。
    65  func CaptureRuntimeMemStats(r Registry, d time.Duration) {
    66  	for range time.Tick(d) {
    67  		CaptureRuntimeMemStatsOnce(r)
    68  	}
    69  }
    70  
    71  //捕获在中导出的Go运行时统计信息的新值
    72  //运行时.memstats。设计为在后台调用
    73  //高尔图提供一个尚未提供的注册表
    74  //registerruntimememstats会死机。
    75  //
    76  //要非常小心,因为runtime.reademstats调用c
    77  //函数runtime·semacquire(&runtime·worldsema)和runtime·stoptheworld()。
    78  //最后一个就照上面说的做。
    79  func CaptureRuntimeMemStatsOnce(r Registry) {
    80  	t := time.Now()
    81  runtime.ReadMemStats(&memStats) //这需要50-200美元。
    82  	runtimeMetrics.ReadMemStats.UpdateSince(t)
    83  
    84  	runtimeMetrics.MemStats.Alloc.Update(int64(memStats.Alloc))
    85  	runtimeMetrics.MemStats.BuckHashSys.Update(int64(memStats.BuckHashSys))
    86  	if memStats.DebugGC {
    87  		runtimeMetrics.MemStats.DebugGC.Update(1)
    88  	} else {
    89  		runtimeMetrics.MemStats.DebugGC.Update(0)
    90  	}
    91  	if memStats.EnableGC {
    92  		runtimeMetrics.MemStats.EnableGC.Update(1)
    93  	} else {
    94  		runtimeMetrics.MemStats.EnableGC.Update(0)
    95  	}
    96  
    97  	runtimeMetrics.MemStats.Frees.Update(int64(memStats.Frees - frees))
    98  	runtimeMetrics.MemStats.HeapAlloc.Update(int64(memStats.HeapAlloc))
    99  	runtimeMetrics.MemStats.HeapIdle.Update(int64(memStats.HeapIdle))
   100  	runtimeMetrics.MemStats.HeapInuse.Update(int64(memStats.HeapInuse))
   101  	runtimeMetrics.MemStats.HeapObjects.Update(int64(memStats.HeapObjects))
   102  	runtimeMetrics.MemStats.HeapReleased.Update(int64(memStats.HeapReleased))
   103  	runtimeMetrics.MemStats.HeapSys.Update(int64(memStats.HeapSys))
   104  	runtimeMetrics.MemStats.LastGC.Update(int64(memStats.LastGC))
   105  	runtimeMetrics.MemStats.Lookups.Update(int64(memStats.Lookups - lookups))
   106  	runtimeMetrics.MemStats.Mallocs.Update(int64(memStats.Mallocs - mallocs))
   107  	runtimeMetrics.MemStats.MCacheInuse.Update(int64(memStats.MCacheInuse))
   108  	runtimeMetrics.MemStats.MCacheSys.Update(int64(memStats.MCacheSys))
   109  	runtimeMetrics.MemStats.MSpanInuse.Update(int64(memStats.MSpanInuse))
   110  	runtimeMetrics.MemStats.MSpanSys.Update(int64(memStats.MSpanSys))
   111  	runtimeMetrics.MemStats.NextGC.Update(int64(memStats.NextGC))
   112  	runtimeMetrics.MemStats.NumGC.Update(int64(memStats.NumGC - numGC))
   113  	runtimeMetrics.MemStats.GCCPUFraction.Update(gcCPUFraction(&memStats))
   114  
   115  //<https://code.google.com/p/go/source/browse/src/pkg/runtime/mgc0.c>
   116  	i := numGC % uint32(len(memStats.PauseNs))
   117  	ii := memStats.NumGC % uint32(len(memStats.PauseNs))
   118  	if memStats.NumGC-numGC >= uint32(len(memStats.PauseNs)) {
   119  		for i = 0; i < uint32(len(memStats.PauseNs)); i++ {
   120  			runtimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))
   121  		}
   122  	} else {
   123  		if i > ii {
   124  			for ; i < uint32(len(memStats.PauseNs)); i++ {
   125  				runtimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))
   126  			}
   127  			i = 0
   128  		}
   129  		for ; i < ii; i++ {
   130  			runtimeMetrics.MemStats.PauseNs.Update(int64(memStats.PauseNs[i]))
   131  		}
   132  	}
   133  	frees = memStats.Frees
   134  	lookups = memStats.Lookups
   135  	mallocs = memStats.Mallocs
   136  	numGC = memStats.NumGC
   137  
   138  	runtimeMetrics.MemStats.PauseTotalNs.Update(int64(memStats.PauseTotalNs))
   139  	runtimeMetrics.MemStats.StackInuse.Update(int64(memStats.StackInuse))
   140  	runtimeMetrics.MemStats.StackSys.Update(int64(memStats.StackSys))
   141  	runtimeMetrics.MemStats.Sys.Update(int64(memStats.Sys))
   142  	runtimeMetrics.MemStats.TotalAlloc.Update(int64(memStats.TotalAlloc))
   143  
   144  	currentNumCgoCalls := numCgoCall()
   145  	runtimeMetrics.NumCgoCall.Update(currentNumCgoCalls - numCgoCalls)
   146  	numCgoCalls = currentNumCgoCalls
   147  
   148  	runtimeMetrics.NumGoroutine.Update(int64(runtime.NumGoroutine()))
   149  
   150  	runtimeMetrics.NumThread.Update(int64(threadCreateProfile.Count()))
   151  }
   152  
   153  //为在运行时中导出的Go运行时统计信息注册RuntimeMetrics,然后
   154  //尤其是runtime.memstats。runtimemetrics的名称是
   155  //完全限定的go符号,即runtime.memstats.alloc。
   156  func RegisterRuntimeMemStats(r Registry) {
   157  	runtimeMetrics.MemStats.Alloc = NewGauge()
   158  	runtimeMetrics.MemStats.BuckHashSys = NewGauge()
   159  	runtimeMetrics.MemStats.DebugGC = NewGauge()
   160  	runtimeMetrics.MemStats.EnableGC = NewGauge()
   161  	runtimeMetrics.MemStats.Frees = NewGauge()
   162  	runtimeMetrics.MemStats.HeapAlloc = NewGauge()
   163  	runtimeMetrics.MemStats.HeapIdle = NewGauge()
   164  	runtimeMetrics.MemStats.HeapInuse = NewGauge()
   165  	runtimeMetrics.MemStats.HeapObjects = NewGauge()
   166  	runtimeMetrics.MemStats.HeapReleased = NewGauge()
   167  	runtimeMetrics.MemStats.HeapSys = NewGauge()
   168  	runtimeMetrics.MemStats.LastGC = NewGauge()
   169  	runtimeMetrics.MemStats.Lookups = NewGauge()
   170  	runtimeMetrics.MemStats.Mallocs = NewGauge()
   171  	runtimeMetrics.MemStats.MCacheInuse = NewGauge()
   172  	runtimeMetrics.MemStats.MCacheSys = NewGauge()
   173  	runtimeMetrics.MemStats.MSpanInuse = NewGauge()
   174  	runtimeMetrics.MemStats.MSpanSys = NewGauge()
   175  	runtimeMetrics.MemStats.NextGC = NewGauge()
   176  	runtimeMetrics.MemStats.NumGC = NewGauge()
   177  	runtimeMetrics.MemStats.GCCPUFraction = NewGaugeFloat64()
   178  	runtimeMetrics.MemStats.PauseNs = NewHistogram(NewExpDecaySample(1028, 0.015))
   179  	runtimeMetrics.MemStats.PauseTotalNs = NewGauge()
   180  	runtimeMetrics.MemStats.StackInuse = NewGauge()
   181  	runtimeMetrics.MemStats.StackSys = NewGauge()
   182  	runtimeMetrics.MemStats.Sys = NewGauge()
   183  	runtimeMetrics.MemStats.TotalAlloc = NewGauge()
   184  	runtimeMetrics.NumCgoCall = NewGauge()
   185  	runtimeMetrics.NumGoroutine = NewGauge()
   186  	runtimeMetrics.NumThread = NewGauge()
   187  	runtimeMetrics.ReadMemStats = NewTimer()
   188  
   189  	r.Register("runtime.MemStats.Alloc", runtimeMetrics.MemStats.Alloc)
   190  	r.Register("runtime.MemStats.BuckHashSys", runtimeMetrics.MemStats.BuckHashSys)
   191  	r.Register("runtime.MemStats.DebugGC", runtimeMetrics.MemStats.DebugGC)
   192  	r.Register("runtime.MemStats.EnableGC", runtimeMetrics.MemStats.EnableGC)
   193  	r.Register("runtime.MemStats.Frees", runtimeMetrics.MemStats.Frees)
   194  	r.Register("runtime.MemStats.HeapAlloc", runtimeMetrics.MemStats.HeapAlloc)
   195  	r.Register("runtime.MemStats.HeapIdle", runtimeMetrics.MemStats.HeapIdle)
   196  	r.Register("runtime.MemStats.HeapInuse", runtimeMetrics.MemStats.HeapInuse)
   197  	r.Register("runtime.MemStats.HeapObjects", runtimeMetrics.MemStats.HeapObjects)
   198  	r.Register("runtime.MemStats.HeapReleased", runtimeMetrics.MemStats.HeapReleased)
   199  	r.Register("runtime.MemStats.HeapSys", runtimeMetrics.MemStats.HeapSys)
   200  	r.Register("runtime.MemStats.LastGC", runtimeMetrics.MemStats.LastGC)
   201  	r.Register("runtime.MemStats.Lookups", runtimeMetrics.MemStats.Lookups)
   202  	r.Register("runtime.MemStats.Mallocs", runtimeMetrics.MemStats.Mallocs)
   203  	r.Register("runtime.MemStats.MCacheInuse", runtimeMetrics.MemStats.MCacheInuse)
   204  	r.Register("runtime.MemStats.MCacheSys", runtimeMetrics.MemStats.MCacheSys)
   205  	r.Register("runtime.MemStats.MSpanInuse", runtimeMetrics.MemStats.MSpanInuse)
   206  	r.Register("runtime.MemStats.MSpanSys", runtimeMetrics.MemStats.MSpanSys)
   207  	r.Register("runtime.MemStats.NextGC", runtimeMetrics.MemStats.NextGC)
   208  	r.Register("runtime.MemStats.NumGC", runtimeMetrics.MemStats.NumGC)
   209  	r.Register("runtime.MemStats.GCCPUFraction", runtimeMetrics.MemStats.GCCPUFraction)
   210  	r.Register("runtime.MemStats.PauseNs", runtimeMetrics.MemStats.PauseNs)
   211  	r.Register("runtime.MemStats.PauseTotalNs", runtimeMetrics.MemStats.PauseTotalNs)
   212  	r.Register("runtime.MemStats.StackInuse", runtimeMetrics.MemStats.StackInuse)
   213  	r.Register("runtime.MemStats.StackSys", runtimeMetrics.MemStats.StackSys)
   214  	r.Register("runtime.MemStats.Sys", runtimeMetrics.MemStats.Sys)
   215  	r.Register("runtime.MemStats.TotalAlloc", runtimeMetrics.MemStats.TotalAlloc)
   216  	r.Register("runtime.NumCgoCall", runtimeMetrics.NumCgoCall)
   217  	r.Register("runtime.NumGoroutine", runtimeMetrics.NumGoroutine)
   218  	r.Register("runtime.NumThread", runtimeMetrics.NumThread)
   219  	r.Register("runtime.ReadMemStats", runtimeMetrics.ReadMemStats)
   220  }