You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1010 B
67 lines
1010 B
package cpu
|
|
|
|
import (
|
|
"fmt"
|
|
"sync/atomic"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
interval time.Duration = time.Millisecond * 500
|
|
)
|
|
|
|
var (
|
|
stats CPU
|
|
usage uint64
|
|
)
|
|
|
|
type CPU interface {
|
|
Usage() (u uint64, e error)
|
|
Info() Info
|
|
}
|
|
|
|
func init() {
|
|
var (
|
|
err error
|
|
)
|
|
stats, err = newCgroupCPU()
|
|
if err != nil {
|
|
fmt.Printf("cgroup cpu init failed(%v),switch to psutil cpu\n", err)
|
|
stats, err = newPsutilCPU(interval)
|
|
if err != nil {
|
|
panic(fmt.Sprintf("cgroup cpu init failed!err:=%v", err))
|
|
}
|
|
}
|
|
go func() {
|
|
ticker := time.NewTicker(interval)
|
|
defer ticker.Stop()
|
|
for {
|
|
<-ticker.C
|
|
u, err := stats.Usage()
|
|
if err == nil && u != 0 {
|
|
atomic.StoreUint64(&usage, u)
|
|
}
|
|
}
|
|
}()
|
|
}
|
|
|
|
// Stat cpu stat.
|
|
type Stat struct {
|
|
Usage uint64 // cpu use ratio.
|
|
}
|
|
|
|
// Info cpu info.
|
|
type Info struct {
|
|
Frequency uint64
|
|
Quota float64
|
|
}
|
|
|
|
// ReadStat read cpu stat.
|
|
func ReadStat(stat *Stat) {
|
|
stat.Usage = atomic.LoadUint64(&usage)
|
|
}
|
|
|
|
// GetInfo get cpu info.
|
|
func GetInfo() Info {
|
|
return stats.Info()
|
|
}
|
|
|