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"
|
"runtime"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestCpu_times(t *testing.T) {
|
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)
|
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) {
|
func TestCpu_counts(t *testing.T) {
|
||||||
|
@ -23,8 +23,7 @@ type Win32_Processor struct {
|
|||||||
MaxClockSpeed uint32
|
MaxClockSpeed uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
// win32_PerfFormattedData_Counters_ProcessorInformation stores instance value of the perf counters
|
type win32_PerfRawData_Counters_ProcessorInformation struct {
|
||||||
type win32_PerfFormattedData_Counters_ProcessorInformation struct {
|
|
||||||
Name string
|
Name string
|
||||||
PercentDPCTime uint64
|
PercentDPCTime uint64
|
||||||
PercentIdleTime uint64
|
PercentIdleTime uint64
|
||||||
@ -44,6 +43,10 @@ type Win32_PerfFormattedData_PerfOS_System struct {
|
|||||||
ProcessorQueueLength uint32
|
ProcessorQueueLength uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
win32_TicksPerSecond = 10000000.0
|
||||||
|
)
|
||||||
|
|
||||||
// Times returns times stat per cpu and combined for all CPUs
|
// Times returns times stat per cpu and combined for all CPUs
|
||||||
func Times(percpu bool) ([]TimesStat, error) {
|
func Times(percpu bool) ([]TimesStat, error) {
|
||||||
return TimesWithContext(context.Background(), percpu)
|
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.
|
// 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.
|
// 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) {
|
func perfInfoWithContext(ctx context.Context) ([]win32_PerfRawData_Counters_ProcessorInformation, error) {
|
||||||
var ret []win32_PerfFormattedData_Counters_ProcessorInformation
|
var ret []win32_PerfRawData_Counters_ProcessorInformation
|
||||||
|
|
||||||
q := wmi.CreateQuery(&ret, "WHERE NOT Name LIKE '%_Total'")
|
q := wmi.CreateQuery(&ret, "WHERE NOT Name LIKE '%_Total'")
|
||||||
err := common.WMIQueryWithContext(ctx, q, &ret)
|
err := common.WMIQueryWithContext(ctx, q, &ret)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return []win32_PerfFormattedData_Counters_ProcessorInformation{}, err
|
return []win32_PerfRawData_Counters_ProcessorInformation{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret, err
|
return ret, err
|
||||||
@ -157,10 +160,10 @@ func perCPUTimesWithContext(ctx context.Context) ([]TimesStat, error) {
|
|||||||
for _, v := range stats {
|
for _, v := range stats {
|
||||||
c := TimesStat{
|
c := TimesStat{
|
||||||
CPU: v.Name,
|
CPU: v.Name,
|
||||||
User: float64(v.PercentUserTime),
|
User: float64(v.PercentUserTime) / win32_TicksPerSecond,
|
||||||
System: float64(v.PercentPrivilegedTime),
|
System: float64(v.PercentPrivilegedTime) / win32_TicksPerSecond,
|
||||||
Idle: float64(v.PercentIdleTime),
|
Idle: float64(v.PercentIdleTime) / win32_TicksPerSecond,
|
||||||
Irq: float64(v.PercentInterruptTime),
|
Irq: float64(v.PercentInterruptTime) / win32_TicksPerSecond,
|
||||||
}
|
}
|
||||||
ret = append(ret, c)
|
ret = append(ret, c)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user