forked from kubernetes-sigs/node-feature-discovery
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sources.go
102 lines (79 loc) · 2.83 KB
/
sources.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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"fmt"
"io/ioutil"
"os/exec"
"path"
"github.com/klauspost/cpuid"
)
// FeatureSource represents a source of discovered node features.
type FeatureSource interface {
// Returns a friendly name for this source of node features.
Name() string
// Returns discovered features for this node.
Discover() ([]string, error)
}
const (
// RDTBin is the path to RDT detection helpers.
RDTBin = "/go/src/github.com/kubernetes-incubator/node-feature-discovery/rdt-discovery"
)
////////////////////////////////////////////////////////////////////////////////
// CPUID Source
// Implements main.FeatureSource.
type cpuidSource struct{}
func (s cpuidSource) Name() string { return "cpuid" }
// Returns feature names for all the supported CPU features.
func (s cpuidSource) Discover() ([]string, error) {
// Get the cpu features as strings
return cpuid.CPU.Features.Strings(), nil
}
////////////////////////////////////////////////////////////////////////////////
// RDT (Intel Resource Director Technology) Source
// Implements main.FeatureSource.
type rdtSource struct{}
func (s rdtSource) Name() string { return "rdt" }
// Returns feature names for CMT and CAT if suppported.
func (s rdtSource) Discover() ([]string, error) {
features := []string{}
cmd := exec.Command("bash", "-c", path.Join(RDTBin, "mon-discovery"))
if err := cmd.Run(); err != nil {
stderrLogger.Printf("support for RDT monitoring was not detected: %s", err.Error())
} else {
// RDT monitoring detected.
features = append(features, "RDTMON")
}
cmd = exec.Command("bash", "-c", path.Join(RDTBin, "l3-alloc-discovery"))
if err := cmd.Run(); err != nil {
stderrLogger.Printf("support for RDT L3 allocation was not detected: %s", err.Error())
} else {
// RDT L3 cache allocation detected.
features = append(features, "RDTL3CA")
}
cmd = exec.Command("bash", "-c", path.Join(RDTBin, "l2-alloc-discovery"))
if err := cmd.Run(); err != nil {
stderrLogger.Printf("support for RDT L2 allocation was not detected: %s", err.Error())
} else {
// RDT L2 cache allocation detected.
features = append(features, "RDTL2CA")
}
return features, nil
}
////////////////////////////////////////////////////////////////////////////////
// PState Source
// Implements main.FeatureSource.
type pstateSource struct{}
func (s pstateSource) Name() string { return "pstate" }
// Returns feature names for p-state related features such as turbo boost.
func (s pstateSource) Discover() ([]string, error) {
features := []string{}
// Only looking for turbo boost for now...
bytes, err := ioutil.ReadFile("/sys/devices/system/cpu/intel_pstate/no_turbo")
if err != nil {
return nil, fmt.Errorf("can't detect whether turbo boost is enabled: %s", err.Error())
}
if bytes[0] == byte('0') {
// Turbo boost is enabled.
features = append(features, "turbo")
}
return features, nil
}