diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 42b025cfd..d6e4c311b 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -21,14 +21,13 @@ import ( "fmt" "math" "os" - "runtime" godebug "runtime/debug" "sort" "strconv" "strings" "time" - "github.com/elastic/gosigar" + gopsutil "github.com/shirou/gopsutil/mem" "github.com/urfave/cli" "github.com/ledgerwatch/turbo-geth/accounts" @@ -40,6 +39,7 @@ import ( "github.com/ledgerwatch/turbo-geth/eth/downloader" "github.com/ledgerwatch/turbo-geth/ethclient" "github.com/ledgerwatch/turbo-geth/internal/debug" + "github.com/ethereum/go-ethereum/les" "github.com/ledgerwatch/turbo-geth/log" "github.com/ledgerwatch/turbo-geth/metrics" "github.com/ledgerwatch/turbo-geth/node" @@ -314,20 +314,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 diff --git a/go.mod b/go.mod index 09cc5f364..20f8c9e1c 100644 --- a/go.mod +++ b/go.mod @@ -18,13 +18,12 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea github.com/dgraph-io/badger/v2 v2.0.3 - github.com/dlclark/regexp2 v1.2.0 // indirect github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf github.com/dop251/goja v0.0.0-20200219165308-d1232e640a87 github.com/dustin/go-humanize v1.0.0 github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c - github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa github.com/ethereum/evmc/v7 v7.3.0 + github.com/ethereum/go-ethereum v1.9.15 github.com/fatih/color v1.7.0 github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff @@ -43,12 +42,10 @@ require ( github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458 github.com/julienschmidt/httprouter v1.2.0 github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356 - github.com/kylelemons/godebug v1.1.0 // indirect github.com/ledgerwatch/bolt v1.4.6-0.20200605053542-69293d8f1d33 github.com/llgcode/draw2d v0.0.0-20180825133448-f52c8a71aff0 github.com/mattn/go-colorable v0.1.2 github.com/mattn/go-isatty v0.0.12 - github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222 @@ -58,10 +55,10 @@ require ( github.com/prometheus/tsdb v0.10.0 github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00 github.com/rs/xhandler v0.0.0-20170707052532-1eb70cf1520d // indirect + github.com/shirou/gopsutil v2.20.5-0.20200531151128-663af789c085+incompatible github.com/spf13/cobra v1.0.0 github.com/status-im/keycard-go v0.0.0-20190424133014-d95853db0f48 github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 - github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3 // indirect github.com/stretchr/testify v1.5.1 github.com/tyler-smith/go-bip39 v1.0.2 github.com/ugorji/go/codec v1.1.7 @@ -77,6 +74,5 @@ require ( golang.org/x/time v0.0.0-20190921001708-c4c64cad1fd0 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce - gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200316214253-d7b0ff38cac9 - gotest.tools v2.2.0+incompatible // indirect + gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200603215123-a4a8cb9d2cbc ) diff --git a/metrics/cpu_enabled.go b/metrics/cpu_enabled.go index 99d44e400..52a3c2e96 100644 --- a/metrics/cpu_enabled.go +++ b/metrics/cpu_enabled.go @@ -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() }