-
Notifications
You must be signed in to change notification settings - Fork 1
/
cgroups.go
63 lines (57 loc) · 2.04 KB
/
cgroups.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
55
56
57
58
59
60
61
62
63
package proc
import (
"github.com/aberic/gnomon"
"strconv"
"strings"
)
// CGroups CGroup集合
var CGroups []CGroup
// CGroup 是Linux下的一种将进程按组进行管理的机制,在用户层看来,cgroup技术就是把系统中的所有进程组织成一颗一颗独立的树,
// 每棵树都包含系统的所有进程,树的每个节点是一个进程组,而每颗树又和一个或者多个subsystem关联,树的作用是将进程分组,
// 而subsystem的作用就是对这些组进行操作。
type CGroup struct {
// SubSysName subsystem的名字
SubSysName string
// subsystem所关联到的cgroup树的ID,如果多个subsystem关联到同一颗cgroup树,那么他们的这个字段将一样,
// 比如这里的cpu和cpuacct就一样,表示他们绑定到了同一颗树。如果出现下面的情况,这个字段将为0:
//
// 当前subsystem没有和任何cgroup树绑定
//
// 当前subsystem已经和cgroup v2的树绑定
//
// 当前subsystem没有被内核开启
Hierarchy int
// subsystem所关联的cgroup树中进程组的个数,也即树上节点的个数
NumCGroups int
// 1表示开启,0表示没有被开启(可以通过设置内核的启动参数“cgroup_disable”来控制subsystem的开启).
Enabled bool
}
// Info CGroup 对象
func (c *CGroup) Info() error {
return c.doFormatCGroups(gnomon.StringBuild(FileRootPath(), "/cgroups"))
}
// FormatCGroups 将文件内容转为 CGroup 对象
func (c *CGroup) doFormatCGroups(filePath string) error {
data, err := gnomon.FileReadLines(filePath)
if nil == err {
size := len(data)
CGroups = make([]CGroup, size-1)
for i := 1; i < size; i++ {
c.formatCGroups(strings.Split(gnomon.StringSingleSpace(data[i]), " "))
CGroups[i-1] = *c
}
} else {
return err
}
return nil
}
func (c *CGroup) formatCGroups(arr []string) {
c.SubSysName = arr[0]
c.Hierarchy, _ = strconv.Atoi(arr[1])
c.NumCGroups, _ = strconv.Atoi(arr[2])
if enable := arr[3]; gnomon.StringIsNotEmpty(enable) && enable == "1" {
c.Enabled = true
} else {
c.Enabled = false
}
}