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 }