metrics: replace gosigar with gopsutil (#21041)
* replace gosigar with gopsutil * removed check for whether GOOS is openbsd * removed accidental import of runtime * potential fix for difference in units between gosig and gopsutil * fixed lint error * remove multiplication factor * uses cpu.ClocksPerSec as the multiplication factor * changed dependency from shirou to renaynay (#20) * updated dep * switching back from using renaynay fork to using upstream as PRs were merged on upstream * removed empty line * optimized imports * tidied go mod
This commit is contained in:
		@@ -21,14 +21,12 @@ import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math"
 | 
			
		||||
	"os"
 | 
			
		||||
	"runtime"
 | 
			
		||||
	godebug "runtime/debug"
 | 
			
		||||
	"sort"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/elastic/gosigar"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/accounts"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/accounts/keystore"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/cmd/utils"
 | 
			
		||||
@@ -42,6 +40,7 @@ import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/log"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/metrics"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/node"
 | 
			
		||||
	gopsutil "github.com/shirou/gopsutil/mem"
 | 
			
		||||
	cli "gopkg.in/urfave/cli.v1"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
@@ -310,20 +309,16 @@ func prepare(ctx *cli.Context) {
 | 
			
		||||
		ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(128))
 | 
			
		||||
	}
 | 
			
		||||
	// Cap the cache allowance and tune the garbage collector
 | 
			
		||||
	var mem gosigar.Mem
 | 
			
		||||
	// Workaround until OpenBSD support lands into gosigar
 | 
			
		||||
	// Check https://github.com/elastic/gosigar#supported-platforms
 | 
			
		||||
	if runtime.GOOS != "openbsd" {
 | 
			
		||||
		if err := mem.Get(); err == nil {
 | 
			
		||||
			if 32<<(^uintptr(0)>>63) == 32 && mem.Total > 2*1024*1024*1024 {
 | 
			
		||||
				log.Warn("Lowering memory allowance on 32bit arch", "available", mem.Total/1024/1024, "addressable", 2*1024)
 | 
			
		||||
				mem.Total = 2 * 1024 * 1024 * 1024
 | 
			
		||||
			}
 | 
			
		||||
			allowance := int(mem.Total / 1024 / 1024 / 3)
 | 
			
		||||
			if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance {
 | 
			
		||||
				log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance)
 | 
			
		||||
				ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance))
 | 
			
		||||
			}
 | 
			
		||||
	mem, err := gopsutil.VirtualMemory()
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		if 32<<(^uintptr(0)>>63) == 32 && mem.Total > 2*1024*1024*1024 {
 | 
			
		||||
			log.Warn("Lowering memory allowance on 32bit arch", "available", mem.Total/1024/1024, "addressable", 2*1024)
 | 
			
		||||
			mem.Total = 2 * 1024 * 1024 * 1024
 | 
			
		||||
		}
 | 
			
		||||
		allowance := int(mem.Total / 1024 / 1024 / 3)
 | 
			
		||||
		if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance {
 | 
			
		||||
			log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance)
 | 
			
		||||
			ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	// Ensure Go's GC ignores the database cache for trigger percentage
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@@ -19,7 +19,6 @@ require (
 | 
			
		||||
	github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf
 | 
			
		||||
	github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87
 | 
			
		||||
	github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c
 | 
			
		||||
	github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa
 | 
			
		||||
	github.com/fatih/color v1.3.0
 | 
			
		||||
	github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc
 | 
			
		||||
	github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff
 | 
			
		||||
@@ -50,6 +49,7 @@ require (
 | 
			
		||||
	github.com/rjeczalik/notify v0.9.1
 | 
			
		||||
	github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00
 | 
			
		||||
	github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 // indirect
 | 
			
		||||
	github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible
 | 
			
		||||
	github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4
 | 
			
		||||
	github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570
 | 
			
		||||
	github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								go.sum
									
									
									
									
									
								
							@@ -61,8 +61,6 @@ github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87 h1:OMbqMXf9OAXzH1dDH82
 | 
			
		||||
github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87/go.mod h1:Mw6PkjjMXWbTj+nnj4s3QPXq1jaT0s5pC0iFD4+BOAA=
 | 
			
		||||
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c h1:JHHhtb9XWJrGNMcrVP6vyzO4dusgi/HnceHTgxSejUM=
 | 
			
		||||
github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
 | 
			
		||||
github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa h1:XKAhUk/dtp+CV0VO6mhG2V7jA9vbcGcnYF/Ay9NjZrY=
 | 
			
		||||
github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs=
 | 
			
		||||
github.com/fatih/color v1.3.0 h1:YehCCcyeQ6Km0D6+IapqPinWBK6y+0eB5umvZXK9WPs=
 | 
			
		||||
github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
			
		||||
github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc h1:jtW8jbpkO4YirRSyepBOH8E+2HEw6/hKkBvFPwhUN8c=
 | 
			
		||||
@@ -167,6 +165,8 @@ github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9Ac
 | 
			
		||||
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521 h1:3hxavr+IHMsQBrYUPQM5v0CgENFktkkbg1sfpgM3h20=
 | 
			
		||||
github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ=
 | 
			
		||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
			
		||||
github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible h1:+gAR1bMhuoQnZMTWFIvp7ukynULPsteLzG+siZKLtD8=
 | 
			
		||||
github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
 | 
			
		||||
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 | 
			
		||||
github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 | 
			
		||||
github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4 h1:Gb2Tyox57NRNuZ2d3rmvB3pcmbu7O1RS3m8WRx7ilrg=
 | 
			
		||||
 
 | 
			
		||||
@@ -18,14 +18,22 @@
 | 
			
		||||
 | 
			
		||||
package metrics
 | 
			
		||||
 | 
			
		||||
import "github.com/elastic/gosigar"
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/ethereum/go-ethereum/log"
 | 
			
		||||
	"github.com/shirou/gopsutil/cpu"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// ReadCPUStats retrieves the current CPU stats.
 | 
			
		||||
func ReadCPUStats(stats *CPUStats) {
 | 
			
		||||
	global := gosigar.Cpu{}
 | 
			
		||||
	global.Get()
 | 
			
		||||
 | 
			
		||||
	stats.GlobalTime = int64(global.User + global.Nice + global.Sys)
 | 
			
		||||
	stats.GlobalWait = int64(global.Wait)
 | 
			
		||||
	// passing false to request all cpu times
 | 
			
		||||
	timeStats, err := cpu.Times(false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		log.Error("Could not read cpu stats", "err", err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	// requesting all cpu times will always return an array with only one time stats entry
 | 
			
		||||
	timeStat := timeStats[0]
 | 
			
		||||
	stats.GlobalTime = int64((timeStat.User + timeStat.Nice + timeStat.System) * cpu.ClocksPerSec)
 | 
			
		||||
	stats.GlobalWait = int64((timeStat.Iowait) * cpu.ClocksPerSec)
 | 
			
		||||
	stats.LocalTime = getProcessCPUTime()
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user