mirror of
https://github.com/shirou/gopsutil.git
synced 2025-04-26 13:48:59 +08:00
Merge pull request #611 from marcospedreiro/master
[cpu][windows] cpu.Times(true) should not return percent values
This commit is contained in:
commit
eead265362
@ -6,6 +6,8 @@ import (
|
||||
"runtime"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCpu_times(t *testing.T) {
|
||||
@ -22,6 +24,34 @@ func TestCpu_times(t *testing.T) {
|
||||
t.Errorf("could not get CPU User: %v", vv)
|
||||
}
|
||||
}
|
||||
|
||||
// test sum of per cpu stats is within margin of error for cpu total stats
|
||||
cpuTotal, err := Times(false)
|
||||
if err != nil {
|
||||
t.Errorf("error %v", err)
|
||||
}
|
||||
if len(cpuTotal) == 0 {
|
||||
t.Error("could not get CPUs ", err)
|
||||
}
|
||||
perCPU, err := Times(true)
|
||||
if err != nil {
|
||||
t.Errorf("error %v", err)
|
||||
}
|
||||
if len(perCPU) == 0 {
|
||||
t.Error("could not get CPUs ", err)
|
||||
}
|
||||
var perCPUUserTimeSum float64
|
||||
var perCPUSystemTimeSum float64
|
||||
var perCPUIdleTimeSum float64
|
||||
for _, pc := range perCPU {
|
||||
perCPUUserTimeSum += pc.User
|
||||
perCPUSystemTimeSum += pc.System
|
||||
perCPUIdleTimeSum += pc.Idle
|
||||
}
|
||||
margin := 2.0
|
||||
assert.InEpsilon(t, cpuTotal[0].User, perCPUUserTimeSum, margin)
|
||||
assert.InEpsilon(t, cpuTotal[0].System, perCPUSystemTimeSum, margin)
|
||||
assert.InEpsilon(t, cpuTotal[0].Idle, perCPUIdleTimeSum, margin)
|
||||
}
|
||||
|
||||
func TestCpu_counts(t *testing.T) {
|
||||
|
@ -23,8 +23,7 @@ type Win32_Processor struct {
|
||||
MaxClockSpeed uint32
|
||||
}
|
||||
|
||||
// win32_PerfFormattedData_Counters_ProcessorInformation stores instance value of the perf counters
|
||||
type win32_PerfFormattedData_Counters_ProcessorInformation struct {
|
||||
type win32_PerfRawData_Counters_ProcessorInformation struct {
|
||||
Name string
|
||||
PercentDPCTime uint64
|
||||
PercentIdleTime uint64
|
||||
@ -44,6 +43,10 @@ type Win32_PerfFormattedData_PerfOS_System struct {
|
||||
ProcessorQueueLength uint32
|
||||
}
|
||||
|
||||
const (
|
||||
win32_TicksPerSecond = 10000000.0
|
||||
)
|
||||
|
||||
// Times returns times stat per cpu and combined for all CPUs
|
||||
func Times(percpu bool) ([]TimesStat, error) {
|
||||
return TimesWithContext(context.Background(), percpu)
|
||||
@ -119,13 +122,13 @@ func InfoWithContext(ctx context.Context) ([]InfoStat, error) {
|
||||
|
||||
// PerfInfo returns the performance counter's instance value for ProcessorInformation.
|
||||
// Name property is the key by which overall, per cpu and per core metric is known.
|
||||
func perfInfoWithContext(ctx context.Context) ([]win32_PerfFormattedData_Counters_ProcessorInformation, error) {
|
||||
var ret []win32_PerfFormattedData_Counters_ProcessorInformation
|
||||
func perfInfoWithContext(ctx context.Context) ([]win32_PerfRawData_Counters_ProcessorInformation, error) {
|
||||
var ret []win32_PerfRawData_Counters_ProcessorInformation
|
||||
|
||||
q := wmi.CreateQuery(&ret, "WHERE NOT Name LIKE '%_Total'")
|
||||
err := common.WMIQueryWithContext(ctx, q, &ret)
|
||||
if err != nil {
|
||||
return []win32_PerfFormattedData_Counters_ProcessorInformation{}, err
|
||||
return []win32_PerfRawData_Counters_ProcessorInformation{}, err
|
||||
}
|
||||
|
||||
return ret, err
|
||||
@ -157,10 +160,10 @@ func perCPUTimesWithContext(ctx context.Context) ([]TimesStat, error) {
|
||||
for _, v := range stats {
|
||||
c := TimesStat{
|
||||
CPU: v.Name,
|
||||
User: float64(v.PercentUserTime),
|
||||
System: float64(v.PercentPrivilegedTime),
|
||||
Idle: float64(v.PercentIdleTime),
|
||||
Irq: float64(v.PercentInterruptTime),
|
||||
User: float64(v.PercentUserTime) / win32_TicksPerSecond,
|
||||
System: float64(v.PercentPrivilegedTime) / win32_TicksPerSecond,
|
||||
Idle: float64(v.PercentIdleTime) / win32_TicksPerSecond,
|
||||
Irq: float64(v.PercentInterruptTime) / win32_TicksPerSecond,
|
||||
}
|
||||
ret = append(ret, c)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user