/
cpu_linux.go
54 lines (49 loc) · 1012 Bytes
/
cpu_linux.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// +build linux
package utils
import (
"errors"
"io/ioutil"
"strconv"
"strings"
"time"
)
func procStat() (idle, total uint64, err error) {
contents, err := ioutil.ReadFile("/proc/stat")
if err != nil {
return 0, 0, err
}
lines := strings.Split(string(contents), "\n")
for _, line := range lines {
fields := strings.Fields(line)
if fields[0] == "cpu" {
numFields := len(fields)
for i := 1; i < numFields; i++ {
val, err := strconv.ParseUint(fields[i], 10, 64)
if err != nil {
return 0, 0, err
}
total += val
if i == 4 {
idle = val
}
}
return
}
}
return 0, 0, errors.New("文件格式错误")
}
func GetCpuUseRate() (int, error) {
oldIdle, oldTotal, err := procStat()
if err != nil {
return 0, err
}
time.Sleep(time.Second)
idle, total, err := procStat()
if err != nil {
return 0, err
}
idleTicks := idle - oldIdle
totalTicks := total - oldTotal
useRate := 100 * (totalTicks - idleTicks) / totalTicks
return int(useRate), nil
}