Skip to content

Commit

Permalink
# This is a combination of 154 commits.
Browse files Browse the repository at this point in the history
# This is the 1st commit message:

refactor

# This is the commit message #2:

modify powerNodeSelector

# This is the commit message #3:

modify powerNodeSelector

# This is the commit message #4:

modify powerNodeSelector

# This is the commit message #5:

modify namespace

# This is the commit message #6:

modify namespace

# This is the commit message #7:

add namespace

# This is the commit message #8:

init power manager script

# This is the commit message #9:

add go code

# This is the commit message #10:

test

# This is the commit message #11:

test

# This is the commit message #12:

test

# This is the commit message #13:

test

# This is the commit message #14:

go.sum

# This is the commit message #15:

go sum

# This is the commit message #16:

go mod tidy

# This is the commit message #17:

test

# This is the commit message #18:

test

# This is the commit message #19:

test

# This is the commit message #20:

test

# This is the commit message #21:

test

# This is the commit message #22:

test

# This is the commit message #23:

test

# This is the commit message #24:

test

# This is the commit message #25:

test

# This is the commit message #26:

test

# This is the commit message #27:

test

# This is the commit message #28:

test

# This is the commit message #29:

print output

# This is the commit message #30:

test

# This is the commit message #31:

test

# This is the commit message #32:

test

# This is the commit message #33:

test

# This is the commit message #34:

test

# This is the commit message #35:

test

# This is the commit message #36:

test

# This is the commit message #37:

test

# This is the commit message #38:

test

# This is the commit message #39:

test

# This is the commit message #40:

refactor

# This is the commit message #41:

change val

# This is the commit message #42:

test

# This is the commit message #43:

test

# This is the commit message #44:

test

# This is the commit message #45:

exp1

# This is the commit message #46:

add url

# This is the commit message #47:

test

# This is the commit message #48:

test

# This is the commit message #49:

test auth

# This is the commit message #50:

test

# This is the commit message #51:

test

# This is the commit message #52:

test

# This is the commit message #53:

test

# This is the commit message #54:

test

# This is the commit message #55:

fix bug

# This is the commit message #56:

remove log

# This is the commit message #57:

test

# This is the commit message #58:

test

# This is the commit message #59:

test

# This is the commit message #60:

fix loop

# This is the commit message #61:

increase invocation

# This is the commit message #62:

test

# This is the commit message #63:

test

# This is the commit message #64:

test

# This is the commit message #65:

test

# This is the commit message #66:

test

# This is the commit message #67:

test

# This is the commit message #68:

test

# This is the commit message #69:

Test

# This is the commit message #70:

test

# This is the commit message #71:

test

# This is the commit message #72:

test

# This is the commit message #73:

test

# This is the commit message #74:

test

# This is the commit message #75:

test

# This is the commit message #76:

test

# This is the commit message #77:

test

# This is the commit message #78:

test

# This is the commit message #79:

test

# This is the commit message #80:

test

# This is the commit message #81:

test

# This is the commit message #82:

test

# This is the commit message #83:

test

# This is the commit message #84:

test

# This is the commit message #85:

test

# This is the commit message #86:

test

# This is the commit message #87:

test

# This is the commit message #88:

test

# This is the commit message #89:

test

# This is the commit message #90:

test1

# This is the commit message #91:

test

# This is the commit message #92:

test

# This is the commit message #93:

test

# This is the commit message #94:

test

# This is the commit message #95:

test

# This is the commit message #96:

test

# This is the commit message #97:

test

# This is the commit message #98:

test

# This is the commit message #99:

test

# This is the commit message #100:

test

# This is the commit message #101:

test

# This is the commit message #102:

test

# This is the commit message #103:

test

# This is the commit message #104:

test

# This is the commit message #105:

test

# This is the commit message #106:

test

# This is the commit message #107:

test

# This is the commit message #108:

test

# This is the commit message #109:

test1

# This is the commit message #110:

test

# This is the commit message #111:

test

# This is the commit message #112:

Test

# This is the commit message #113:

test

# This is the commit message #114:

test

# This is the commit message #115:

test

# This is the commit message #116:

test

# This is the commit message #117:

test

# This is the commit message #118:

test

# This is the commit message #119:

Test

# This is the commit message #120:

Test

# This is the commit message #121:

test

# This is the commit message #122:

test

# This is the commit message #123:

Test

# This is the commit message #124:

test

# This is the commit message #125:

test

# This is the commit message #126:

test

# This is the commit message #127:

test

# This is the commit message #128:

test

# This is the commit message #129:

test

# This is the commit message #130:

test

# This is the commit message #131:

test

# This is the commit message #132:

test

# This is the commit message #133:

test

# This is the commit message #134:

test

# This is the commit message #135:

test

# This is the commit message #136:

test

# This is the commit message #137:

test

# This is the commit message #138:

test

# This is the commit message #139:

test

# This is the commit message #140:

test

# This is the commit message #141:

test

# This is the commit message #142:

test

# This is the commit message #143:

Test

# This is the commit message #144:

Test

# This is the commit message #145:

Test

# This is the commit message #146:

Test

# This is the commit message #147:

test

# This is the commit message #148:

test

# This is the commit message #149:

test

# This is the commit message #150:

test

# This is the commit message #151:

test

# This is the commit message #152:

test

# This is the commit message #153:

test

# This is the commit message #154:

Test
  • Loading branch information
KTCyber authored and HermioneKT committed Jan 31, 2024
1 parent 22054ad commit 6674807
Show file tree
Hide file tree
Showing 22 changed files with 97,744 additions and 69 deletions.
59 changes: 59 additions & 0 deletions examples/powermanger/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
# K8s Power Manager

## Components
1. **PowerManager Controller**: ensures the actual state matches the desired state of the cluster.
2. **PowerConfig Controller**: sees the powerConfig created by user and deploys Power Node Agents onto each node specified using a DaemonSet.
- powerNodeSelector: A key/value map used to define a list of node labels that a node must satisfy for the operator's node
agent to be deployed.
- powerProfiles: The list of PowerProfiles that the user wants available on the nodes
3. **Power Node Agent**: containerized applications used to communicate with the node's Kubelet PodResources endpoint to discover the exact CPUs that
are allocated per container and tune frequency of the cores as requested


## Setup
### 1. Manual
#### on both nodes
git clone -b new_test --depth=1 https://github.com/vhive-serverless/vhive.git
cd vhive
mkdir -p /tmp/vhive-logs
./scripts/cloudlab/setup_node.sh stock-only > >(tee -a /tmp/vhive-logs/setup_node.stdout) 2> >(tee -a /tmp/vhive-logs/setup_node.stderr >&2)

#### for worker
./scripts/cluster/setup_worker_kubelet.sh stock-only > >(tee -a /tmp/vhive-logs/setup_worker_kubelet.stdout) 2> >(tee -a /tmp/vhive-logs/setup_worker_kubelet.stderr >&2)
sudo screen -dmS containerd bash -c "containerd > >(tee -a /tmp/vhive-logs/containerd.stdout) 2> >(tee -a /tmp/vhive-logs/containerd.stderr >&2)"

#### for master
sudo screen -dmS containerd bash -c "containerd > >(tee -a /tmp/vhive-logs/containerd.stdout) 2> >(tee -a /tmp/vhive-logs/containerd.stderr >&2)"
./scripts/cluster/create_multinode_cluster.sh stock-only > >(tee -a /tmp/vhive-logs/create_multinode_cluster.stdout) 2> >(tee -a /tmp/vhive-logs/create_multinode_cluster.stderr >&2)

join the cluster from worker, answer 'y' to master

## Setup
### 1. Manual

Execute the following below **as a non-root user with sudo rights** using **bash**:
1. Run the node setup script:
```bash
./examples/powermanger/setup_power_manager.sh;

go run ./examples/powermanger/experiment_1.go

while true; do current_time=$(date -u +%s%3N); cpu_average=$(grep 'MHz' /proc/cpuinfo | awk '{ total += $4 } END { print total / NR }'); echo "${current_time}: ${cpu_average}" >> memory.txt; sleep 0.01; done

while true; do
current_time=$(date -u +%s%3N)
sudo perf stat -e instructions,cycles -I 1000 -o perf_output.data sleep 1
ipc=$(grep -E '(instructions|cycles)' perf_output.data | awk '{ total += $1 } END { if (total) print total / 2 }')
echo "${current_time}: ${ipc}" >> ipc_results1.txt; done

while true; do current_time=$(date -u +%s%3N); stats=$(sudo turbostat --Summary --quiet --show Busy%,Avg_MHz,PkgWatt); echo "${current_time}, $stats" >> $output_file; sleep 0.01; done

2. Clean Up
```bash
./scripts/github_runner/clean_cri_runner.sh
```
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


curl -sG 'http://127.0.0.1:9090/api/v1/query?' --data-urlencode 'query=(avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100)' | jq -r '.data.result[1].value[1]'
curl -G 'http://10.111.120.245:9090/api/v1/label/__name__/values'
94 changes: 94 additions & 0 deletions examples/powermanger/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package main

import (
"fmt"
"os/exec"
"strconv"
"strings"
"time"
)

const (
High int = 1
Low = 2
)

func setCPUFrequency(frequency int) error {
m := map[int]string{
High: "performance",
Low: "shared",
}
fmt.Printf("applying %s profile...\n", m[frequency])
command := fmt.Sprintf("kubectl apply -f - <<EOF\napiVersion: \"power.intel.com/v1\"\nkind: PowerWorkload\nmetadata:\n name: shared-node-3.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us-workload\n namespace: intel-power\nspec:\n name: \"shared-node-3.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us-workload\"\n allCores: true\n powerNodeSelector:\n kubernetes.io/hostname: node-3.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us\n powerProfile: \"%s\"\nEOF", m[frequency])
cmd := exec.Command("bash", "-c", command)

// Capture and check for any errors.
output, err := cmd.CombinedOutput()
if err != nil {
return err
}

fmt.Println(string(output)) /////
return nil
}

func main() {
//file, err := os.Create("metrics.csv")
//if err != nil {
// panic(err)
//}
//defer file.Close()
//
//writer := csv.NewWriter(file)
//defer writer.Flush()

command := "curl -sG 'http://127.0.0.1:9090/api/v1/query?' --data-urlencode 'query=(avg by(instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[2m])) * 100)' | jq -r '.data.result[1].value[1]'"
thresholdHigh := 10.0 // > 1% is idle => decrease frequency

start := time.Now()
for time.Since(start) < (5 * time.Minute) {
cmd := exec.Command("bash", "-c", command)
output, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf(fmt.Sprintf("ERR :%+v", err))
}

resultString := strings.ReplaceAll(string(output), "\n", "")
metricValue, err := strconv.ParseFloat(resultString, 64)
if err != nil {
fmt.Printf("Error converting to float: %v\n", err)
}

fmt.Println(metricValue) /////
if metricValue > thresholdHigh {
if err := setCPUFrequency(Low); err != nil {
fmt.Println("Failed to set low CPU frequency:", err)
}
} else {
if err := setCPUFrequency(High); err != nil {
fmt.Println("Failed to set high CPU frequency:", err)
}
}

//// Run the turbostat command
//cmd = exec.Command("bash", "-c", "sudo turbostat --Summary --quiet --show Busy%,Avg_MHz,PkgTmp,PkgWatt --interval 1")
//output, err = cmd.CombinedOutput()
//if err != nil {
// fmt.Printf("Error running the turbostat command: %v\n", err)
//}
//fmt.Println(string(output)) /////
//
//// Parse and extract relevant metrics from the command output
//lines := strings.Split(string(output), "\n")
//// You may need to adjust the line index and parsing based on the actual output format
//metricsLine := lines[2]
//metrics := strings.Fields(metricsLine)
//fmt.Printf(fmt.Sprintf("metrics collected=%v", metrics)) /////
//
//// Write metrics to the CSV file
//err = writer.Write(append([]string{time.Now().Format("2006-01-02 15:04:05")}, metrics...))
//if err != nil {
// fmt.Printf("Error writing metrics to the CSV file: %v\n", err)
//}
}
}
91 changes: 91 additions & 0 deletions examples/powermanger/experiment_1.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
package main

import (
"encoding/csv"
"fmt"
"os"
"os/exec"
"strconv"
"time"
)

func setPowerProfileToNode(freq int64) error {
// powerConfig
command := fmt.Sprintf("kubectl apply -f - <<EOF\napiVersion: \"power.intel.com/v1\"\nkind: PowerConfig\nmetadata:\n name: power-config\n namespace: intel-power\nspec:\n powerNodeSelector:\n kubernetes.io/hostname: node-1.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us\n powerProfiles:\n - \"performance\"\nEOF")
cmd := exec.Command("bash", "-c", command)
_, err := cmd.CombinedOutput()
if err != nil {
return err
}
//fmt.Println(string(output))

// performanceProfile w freq
command = fmt.Sprintf("kubectl apply -f - <<EOF\napiVersion: \"power.intel.com/v1\"\nkind: PowerProfile\nmetadata:\n name: performance\n namespace: intel-power\nspec:\n name: \"performance\"\n max: %d\n min: %d\n shared: true\n governor: \"performance\"\nEOF", freq, freq)
cmd = exec.Command("bash", "-c", command)

_, err = cmd.CombinedOutput()
if err != nil {
return err
}
//fmt.Println(string(output))

// apply to node
command = fmt.Sprintf("kubectl apply -f - <<EOF\napiVersion: \"power.intel.com/v1\"\nkind: PowerWorkload\nmetadata:\n name: performance-node-1.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us-workload\n namespace: intel-power\nspec:\n name: \"performance-node-1.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us-workload\"\n allCores: true\n powerNodeSelector:\n kubernetes.io/hostname: node-1.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us\n powerProfile: \"performance\"\nEOF")
cmd = exec.Command("bash", "-c", command)

_, err = cmd.CombinedOutput()
if err != nil {
return err
}
//fmt.Println(string(output))
return nil
}

func main() {
file, err := os.Create("metrics.csv")
if err != nil {
panic(err)
}
defer file.Close()

writer := csv.NewWriter(file)
defer writer.Flush()

err = writer.Write(append([]string{"startTime", "endTime", "latency"}))
if err != nil {
fmt.Printf("Error writing metrics to the CSV file: %v\n", err)
}

frequencies := []int64{1200, 1400, 1600, 1800, 2000, 2200, 2400, 2600}
for i := 0; i < len(frequencies); i++ {
err := setPowerProfileToNode(frequencies[i])
if err != nil {
fmt.Printf(fmt.Sprintf("ERR1 :%+v", err))
}

for j := 0; j <1000; j++ {
url := "memory-go.default.192.168.1.240.sslip.io"
command := fmt.Sprintf("cd $HOME/vSwarm/tools/test-client && ./test-client --addr %s:80 --name \"allow\"", url)

startInvoke := time.Now().UTC().UnixMilli()
cmd := exec.Command("bash", "-c", command)
_, err := cmd.CombinedOutput()
if err != nil {
fmt.Printf(fmt.Sprintf("ERR2: %+v", err))
return
}
endInvoke := time.Now().UTC().UnixMilli()
latency := endInvoke-startInvoke
err = writer.Write(append([]string{strconv.FormatInt(startInvoke, 10), strconv.FormatInt(endInvoke, 10), strconv.FormatInt(latency, 10)}))
if err != nil {
fmt.Printf("Error writing metrics to the CSV file: %v\n", err)
}
}

err = writer.Write(append([]string{"-","-","-"}))
if err != nil {
fmt.Printf("Error writing metrics to the CSV file: %v\n", err)
}
fmt.Println("done")
}
}
11 changes: 11 additions & 0 deletions examples/powermanger/fyp.code-workspace
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"folders": [
{
"path": "../.."
},
{
"path": "../../../vSwarm"
}
],
"settings": {}
}
16 changes: 16 additions & 0 deletions examples/powermanger/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module github.com/vhive-serverless/vhive/examples/deployer

go 1.19

replace github.com/vhive-serverless/vhive/examples/deployer => ../deployer

require github.com/shirou/gopsutil v3.21.11+incompatible

require (
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/stretchr/testify v1.8.4 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
golang.org/x/sys v0.13.0 // indirect
)
20 changes: 20 additions & 0 deletions examples/powermanger/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ apiVersion: "power.intel.com/v1"
kind: PowerConfig
metadata:
name: power-config
namespace: intel-power
spec:
# Add labels here for the Nodes you want the PowerNodeAgent to be applied to
powerNodeSelector:
feature.node.kubernetes.io/power-node: "true"
kubernetes.io/hostname: node-1.kt-cluster.ntu-cloud-pg0.utah.cloudlab.us
# Add wanted PowerProfiles here; valid entries are as follows: performance, balance-performance, balance-power
powerProfiles:
- "performance"
41 changes: 25 additions & 16 deletions scripts/power_manager/setup_power_manager.sh → examples/powermanger/setup_power_manager.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -22,37 +22,46 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

PWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# Install K8 Power Manager
git clone https://github.com/intel/kubernetes-power-manager $HOME/kubernetes-power-manager
cd $HOME/kubernetes-power-manager

# Set up the necessary Namespace, Service Account, and RBAC rules for the Kubernetes Power Manager
kubectl apply -f config/rbac/namespace.yaml
kubectl apply -f config/rbac/rbac.yaml
kubectl apply -f $HOME/kubernetes-power-manager/config/rbac/namespace.yaml
kubectl apply -f $HOME/kubernetes-power-manager/config/rbac/rbac.yaml

# Generate the CRD templates, create the Custom Resource Definitions, and install the CRDs
make
# Install go1.20
sudo rm -rf /usr/local/go
sudo apt update
wget https://go.dev/dl/go1.20.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.20.2.linux-amd64.tar.gz
export GOROOT=/usr/local/go
export GOPATH=$HOME
export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

# Built Docker images locally
make images

# Generate the CRD templates, create the Custom Resource Definitions, and install the CRDs and Built Docker images locally
cd $HOME/kubernetes-power-manager
make
sudo docker pull intel/power-operator
sudo docker pull intel/power-node-agent:latest

# Apply Power Manager Controller
kubectl apply -f config/manager/manager.yaml
kubectl apply -f $HOME/kubernetes-power-manager/config/manager/manager.yaml

# Apply PowerConfig -> create the power-node-agent DaemonSet that manages the Power Node Agent pods.
kubectl apply -f ${PWD}/powerconfig.yaml
kubectl apply -f $HOME/vhive/examples/powermanger/powerconfig.yaml

# Apply Profile. U can modify the spec in the shared-profile.yaml file
kubectl apply -f ${PWD}/shared-profile.yaml
kubectl apply -f $HOME/vhive/examples/powermanger/shared-profile.yaml

# Apply the shared PowerWorkload. All CPUs (except reservedCPUs specified in this yaml file) will be tuned ti the specified frequency in shared-profile.yaml
kubectl apply -f ${PWD}/shared-workload.yaml
kubectl apply -f $HOME/vhive/examples/powermanger/shared-workload.yaml

kubectl get powerprofiles -n intel-power
kubectl get powerworkloads -n intel-power




# Add prometheus
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install prometheus prometheus-community/kube-prometheus-stack
kubectl port-forward svc/prometheus-kube-prometheus-prometheus 9090
13 changes: 13 additions & 0 deletions examples/powermanger/shared-profile.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
kubectl apply -f - <<EOF
apiVersion: "power.intel.com/v1"
kind: PowerProfile
metadata:
name: performance
namespace: intel-power
spec:
name: "performance"
max: 3400
min: 3400
shared: true
governor: "performance"
EOF
Loading

0 comments on commit 6674807

Please sign in to comment.