• turboboost55's avatar
    metrics: improve accuracy of CPU gauges (#26793) · 544e4a70
    turboboost55 authored
    This PR changes metrics collection to actually measure the time interval between collections, rather
    than assume 3 seconds. I did some ad hoc profiling, and on slower hardware (eg, my Raspberry Pi 4)
    I routinely saw intervals between 3.3 - 3.5 seconds, with some being as high as 4.5 seconds. This
    will generally cause the CPU gauge readings to be too high, and in some cases can cause impossibly
    large values for the CPU load metrics (eg. greater than 400 for a 4 core CPU).
    
    ---------
    Co-authored-by: 's avatarFelix Lange <fjl@twurst.com>
    Unverified
    544e4a70
cputime_unix.go 1.31 KB
// Copyright 2018 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

//go:build !windows && !js
// +build !windows,!js

package metrics

import (
	syscall "golang.org/x/sys/unix"

	"github.com/ethereum/go-ethereum/log"
)

// getProcessCPUTime retrieves the process' CPU time since program startup.
func getProcessCPUTime() float64 {
	var usage syscall.Rusage
	if err := syscall.Getrusage(syscall.RUSAGE_SELF, &usage); err != nil {
		log.Warn("Failed to retrieve CPU time", "err", err)
		return 0
	}
	return float64(usage.Utime.Sec+usage.Stime.Sec) + float64(usage.Utime.Usec+usage.Stime.Usec)/1000000 //nolint:unconvert
}