2014-12-30 21:09:05 +08:00
|
|
|
package cpu
|
2014-04-18 15:34:47 +08:00
|
|
|
|
|
|
|
import (
|
2014-05-01 17:43:11 +08:00
|
|
|
"encoding/json"
|
2014-04-18 15:34:47 +08:00
|
|
|
"runtime"
|
2014-11-02 11:05:52 +08:00
|
|
|
"time"
|
2014-04-18 15:34:47 +08:00
|
|
|
)
|
|
|
|
|
2014-04-30 14:32:05 +08:00
|
|
|
type CPUTimesStat struct {
|
2014-04-30 15:16:07 +08:00
|
|
|
CPU string `json:"cpu"`
|
|
|
|
User float32 `json:"user"`
|
|
|
|
System float32 `json:"system"`
|
|
|
|
Idle float32 `json:"idle"`
|
|
|
|
Nice float32 `json:"nice"`
|
|
|
|
Iowait float32 `json:"iowait"`
|
|
|
|
Irq float32 `json:"irq"`
|
|
|
|
Softirq float32 `json:"softirq"`
|
|
|
|
Steal float32 `json:"steal"`
|
|
|
|
Guest float32 `json:"guest"`
|
|
|
|
GuestNice float32 `json:"guest_nice"`
|
|
|
|
Stolen float32 `json:"stolen"`
|
2014-04-18 15:34:47 +08:00
|
|
|
}
|
|
|
|
|
2014-05-16 17:12:18 +08:00
|
|
|
type CPUInfoStat struct {
|
2014-05-16 17:39:17 +08:00
|
|
|
CPU int32 `json:"cpu"`
|
2014-12-27 22:42:00 +08:00
|
|
|
VendorID string `json:"vendor_id"`
|
2014-05-16 17:39:17 +08:00
|
|
|
Family string `json:"family"`
|
|
|
|
Model string `json:"model"`
|
|
|
|
Stepping int32 `json:"stepping"`
|
2014-12-27 22:42:00 +08:00
|
|
|
PhysicalID string `json:"physical_id"`
|
|
|
|
CoreID string `json:"core_id"`
|
2014-05-16 17:39:17 +08:00
|
|
|
Cores int32 `json:"cores"`
|
2014-12-27 22:42:00 +08:00
|
|
|
ModelName string `json:"model_name"`
|
2014-05-16 17:39:17 +08:00
|
|
|
Mhz float64 `json:"mhz"`
|
2014-12-27 22:42:00 +08:00
|
|
|
CacheSize int32 `json:"cache_size"`
|
2014-05-16 17:12:18 +08:00
|
|
|
Flags []string `json:"flags"`
|
|
|
|
}
|
|
|
|
|
2014-04-30 15:16:07 +08:00
|
|
|
func CPUCounts(logical bool) (int, error) {
|
2014-04-18 15:34:47 +08:00
|
|
|
return runtime.NumCPU(), nil
|
|
|
|
}
|
2014-05-01 17:43:11 +08:00
|
|
|
|
2014-11-02 11:05:52 +08:00
|
|
|
var lastCPUTimes []CPUTimesStat
|
|
|
|
var lastPerCPUTimes []CPUTimesStat
|
|
|
|
|
|
|
|
func CPUPercent(interval time.Duration, percpu bool) ([]float32, error) {
|
|
|
|
getAllBusy := func(t CPUTimesStat) (float32, float32) {
|
|
|
|
busy := t.User + t.System + t.Nice + t.Iowait + t.Irq +
|
|
|
|
t.Softirq + t.Steal + t.Guest + t.GuestNice + t.Stolen
|
|
|
|
return busy + t.Idle, busy
|
|
|
|
}
|
|
|
|
|
|
|
|
calculate := func(t1, t2 CPUTimesStat) float32 {
|
|
|
|
t1All, t1Busy := getAllBusy(t1)
|
|
|
|
t2All, t2Busy := getAllBusy(t2)
|
|
|
|
|
|
|
|
if t2Busy <= t1Busy {
|
|
|
|
return 0
|
|
|
|
}
|
2014-11-12 10:16:23 +08:00
|
|
|
if t2All <= t1All {
|
|
|
|
return 1
|
|
|
|
}
|
2014-11-02 11:05:52 +08:00
|
|
|
return (t2Busy - t1Busy) / (t2All - t1All) * 100
|
|
|
|
}
|
|
|
|
|
|
|
|
cpuTimes, err := CPUTimes(percpu)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if interval > 0 {
|
|
|
|
if !percpu {
|
|
|
|
lastCPUTimes = cpuTimes
|
|
|
|
} else {
|
|
|
|
lastPerCPUTimes = cpuTimes
|
|
|
|
}
|
|
|
|
time.Sleep(interval)
|
|
|
|
cpuTimes, err = CPUTimes(percpu)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ret := make([]float32, len(cpuTimes))
|
|
|
|
if !percpu {
|
|
|
|
ret[0] = calculate(lastCPUTimes[0], cpuTimes[0])
|
|
|
|
lastCPUTimes = cpuTimes
|
|
|
|
} else {
|
|
|
|
for i, t := range cpuTimes {
|
|
|
|
ret[i] = calculate(lastPerCPUTimes[i], t)
|
|
|
|
}
|
|
|
|
lastPerCPUTimes = cpuTimes
|
|
|
|
}
|
|
|
|
return ret, nil
|
|
|
|
}
|
|
|
|
|
2014-05-01 17:43:11 +08:00
|
|
|
func (c CPUTimesStat) String() string {
|
|
|
|
s, _ := json.Marshal(c)
|
|
|
|
return string(s)
|
|
|
|
}
|
2014-05-16 17:12:18 +08:00
|
|
|
|
|
|
|
func (c CPUInfoStat) String() string {
|
|
|
|
s, _ := json.Marshal(c)
|
|
|
|
return string(s)
|
|
|
|
}
|
2014-11-02 11:05:52 +08:00
|
|
|
|
|
|
|
func init() {
|
|
|
|
lastCPUTimes, _ = CPUTimes(false)
|
|
|
|
lastPerCPUTimes, _ = CPUTimes(true)
|
|
|
|
}
|