From 611c8b576e8451735fb103f83ccb2da6bbaa913e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Wed, 2 Jun 2021 14:11:11 +0200 Subject: [PATCH] process, v3/process: use SC_CLK_TCK sysconf value instead of hard-coding clock ticks The github.com/tklauser/go-sysconf package is already a dependency used in the cpu and v3/cpu packages to determine clock ticks using `sysconf.Sysconf(sysconf.SC_CLK_TCK)`, see #1036. Use the same in packages process and v3/process as well instead of hard-coding clock ticks to 100. --- process/process_darwin.go | 15 +++++++++++---- process/process_linux.go | 22 +++++++++++++++------- v3/process/process_darwin.go | 15 +++++++++++---- v3/process/process_linux.go | 22 +++++++++++++++------- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/process/process_darwin.go b/process/process_darwin.go index dc75526cc..383e0994d 100644 --- a/process/process_darwin.go +++ b/process/process_darwin.go @@ -14,6 +14,7 @@ import ( "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/internal/common" "github.com/shirou/gopsutil/net" + "github.com/tklauser/go-sysconf" "golang.org/x/sys/unix" ) @@ -27,9 +28,15 @@ const ( KernProcPathname = 12 // path to executable ) -const ( - ClockTicks = 100 // C.sysconf(C._SC_CLK_TCK) -) +var ClockTicks = 100 // default value + +func init() { + clkTck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) + // ignore errors + if err == nil { + ClockTicks = int(clkTck) + } +} type _Ctype_struct___0 struct { Pad uint64 @@ -314,7 +321,7 @@ func convertCPUTimes(s string) (ret float64, err error) { t += h * ClockTicks h, err = strconv.Atoi(_t[1]) t += h - return float64(t) / ClockTicks, nil + return float64(t) / float64(ClockTicks), nil } func (p *Process) TimesWithContext(ctx context.Context) (*cpu.TimesStat, error) { diff --git a/process/process_linux.go b/process/process_linux.go index c9edf808c..a5dc60203 100644 --- a/process/process_linux.go +++ b/process/process_linux.go @@ -18,15 +18,23 @@ import ( "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/internal/common" "github.com/shirou/gopsutil/net" + "github.com/tklauser/go-sysconf" "golang.org/x/sys/unix" ) var PageSize = uint64(os.Getpagesize()) -const ( - PrioProcess = 0 // linux/resource.h - ClockTicks = 100 // C.sysconf(C._SC_CLK_TCK) -) +const PrioProcess = 0 // linux/resource.h + +var ClockTicks = 100 // default value + +func init() { + clkTck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) + // ignore errors + if err == nil { + ClockTicks = int(clkTck) + } +} // MemoryInfoExStat is different between OSes type MemoryInfoExStat struct { @@ -1031,9 +1039,9 @@ func (p *Process) fillFromTIDStatWithContext(ctx context.Context, tid int32) (ui cpuTimes := &cpu.TimesStat{ CPU: "cpu", - User: float64(utime / ClockTicks), - System: float64(stime / ClockTicks), - Iowait: float64(iotime / ClockTicks), + User: utime / float64(ClockTicks), + System: stime / float64(ClockTicks), + Iowait: iotime / float64(ClockTicks), } bootTime, _ := common.BootTimeWithContext(ctx) diff --git a/v3/process/process_darwin.go b/v3/process/process_darwin.go index 2b2b24297..5a575dc81 100644 --- a/v3/process/process_darwin.go +++ b/v3/process/process_darwin.go @@ -14,6 +14,7 @@ import ( "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/internal/common" "github.com/shirou/gopsutil/v3/net" + "github.com/tklauser/go-sysconf" "golang.org/x/sys/unix" ) @@ -27,9 +28,15 @@ const ( KernProcPathname = 12 // path to executable ) -const ( - clockTicks = 100 // C.sysconf(C._SC_CLK_TCK) -) +var clockTicks = 100 // default value + +func init() { + clkTck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) + // ignore errors + if err == nil { + clockTicks = int(clkTck) + } +} type _Ctype_struct___0 struct { Pad uint64 @@ -314,7 +321,7 @@ func convertCPUTimes(s string) (ret float64, err error) { t += h * clockTicks h, err = strconv.Atoi(_t[1]) t += h - return float64(t) / clockTicks, nil + return float64(t) / float64(clockTicks), nil } func (p *Process) TimesWithContext(ctx context.Context) (*cpu.TimesStat, error) { diff --git a/v3/process/process_linux.go b/v3/process/process_linux.go index 302dc9fcf..74549b1a4 100644 --- a/v3/process/process_linux.go +++ b/v3/process/process_linux.go @@ -18,15 +18,23 @@ import ( "github.com/shirou/gopsutil/v3/cpu" "github.com/shirou/gopsutil/v3/internal/common" "github.com/shirou/gopsutil/v3/net" + "github.com/tklauser/go-sysconf" "golang.org/x/sys/unix" ) var pageSize = uint64(os.Getpagesize()) -const ( - prioProcess = 0 // linux/resource.h - clockTicks = 100 // C.sysconf(C._SC_CLK_TCK) -) +const prioProcess = 0 // linux/resource.h + +var clockTicks = 100 // default value + +func init() { + clkTck, err := sysconf.Sysconf(sysconf.SC_CLK_TCK) + // ignore errors + if err == nil { + clockTicks = int(clkTck) + } +} // MemoryInfoExStat is different between OSes type MemoryInfoExStat struct { @@ -1026,9 +1034,9 @@ func (p *Process) fillFromTIDStatWithContext(ctx context.Context, tid int32) (ui cpuTimes := &cpu.TimesStat{ CPU: "cpu", - User: float64(utime / clockTicks), - System: float64(stime / clockTicks), - Iowait: float64(iotime / clockTicks), + User: utime / float64(clockTicks), + System: stime / float64(clockTicks), + Iowait: iotime / float64(clockTicks), } bootTime, _ := common.BootTimeWithContext(ctx)