github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/metrics/runtime.go (about)

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