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