Skip to content

Commit 0985f6f

Browse files
Restructure files
1 parent 88c653e commit 0985f6f

File tree

2 files changed

+116
-107
lines changed

2 files changed

+116
-107
lines changed

pkg/controller/container.go pkg/controller/kondense.go

-107
Original file line numberDiff line numberDiff line change
@@ -5,120 +5,13 @@ import (
55
"fmt"
66
"math"
77
"net/http"
8-
"os/exec"
98
"strconv"
10-
"strings"
11-
"time"
129

1310
"github.com/rs/zerolog/log"
1411
"github.com/unagex/kondense/pkg/utils"
1512
corev1 "k8s.io/api/core/v1"
1613
)
1714

18-
func (r *Reconciler) UpdateStats(pod *corev1.Pod, container corev1.Container) error {
19-
var err error
20-
var output []byte
21-
for i := 0; i < 3; i++ {
22-
cmd := exec.Command("kubectl", "exec", "-i", r.Name, "-c", container.Name, "--", "cat", "/sys/fs/cgroup/memory.pressure", "/sys/fs/cgroup/cpu.stat")
23-
// we don't need kubectl for kondense container.
24-
if strings.ToLower(container.Name) == "kondense" {
25-
cmd = exec.Command("cat", "/sys/fs/cgroup/memory.pressure", "/sys/fs/cgroup/cpu.stat")
26-
}
27-
output, err = cmd.Output()
28-
if err == nil {
29-
r.CStats[container.Name].LastUpdate = time.Now()
30-
break
31-
}
32-
time.Sleep(50 * time.Millisecond)
33-
}
34-
if err != nil {
35-
return err
36-
}
37-
38-
txt := strings.Split(string(output), " ")
39-
if len(txt) != 15 {
40-
return fmt.Errorf("error got unexpected stats for container %s: %s", container.Name, txt)
41-
}
42-
43-
err = r.UpdateMemStats(container.Name, txt)
44-
if err != nil {
45-
return err
46-
}
47-
48-
err = r.UpdateCPUStats(container.Name, txt)
49-
if err != nil {
50-
return err
51-
}
52-
53-
s := r.CStats[container.Name]
54-
log.Info().
55-
Str("container", container.Name).
56-
Int64("memory_limit", s.Mem.Limit).
57-
Uint64("memory_time to decrease", s.Mem.GraceTicks).
58-
Uint64("memory_total", s.Mem.PrevTotal).
59-
Uint64("integral", s.Mem.Integral).
60-
Int64("cpu_limit", s.Cpu.Limit).
61-
Uint64("cpu_average", s.Cpu.Avg).
62-
Msg("updated stats")
63-
64-
return nil
65-
}
66-
67-
func (r *Reconciler) UpdateMemStats(containerName string, txt []string) error {
68-
s := r.CStats[containerName]
69-
70-
totalTmp := strings.TrimPrefix(txt[4], "total=")
71-
totalTmp = strings.TrimSuffix(totalTmp, "\nfull")
72-
total, err := strconv.ParseUint(totalTmp, 10, 64)
73-
if err != nil {
74-
return err
75-
}
76-
77-
delta := total - s.Mem.PrevTotal
78-
s.Mem.PrevTotal = total
79-
s.Mem.Integral += delta
80-
81-
return nil
82-
}
83-
84-
func (r *Reconciler) UpdateCPUStats(containerName string, txt []string) error {
85-
s := r.CStats[containerName]
86-
87-
totalTmp := strings.TrimSuffix(txt[9], "\nuser_usec")
88-
total, err := strconv.ParseUint(totalTmp, 10, 64)
89-
if err != nil {
90-
return err
91-
}
92-
93-
if len(s.Cpu.Probes) == int(s.Cpu.Interval) {
94-
// Pop oldest probe if Probes is full
95-
s.Cpu.Probes = s.Cpu.Probes[1:]
96-
}
97-
98-
p := Probe{
99-
Total: total,
100-
T: s.LastUpdate,
101-
}
102-
s.Cpu.Probes = append(s.Cpu.Probes, p)
103-
104-
// We can calculate when we have 2 or more probes
105-
if len(s.Cpu.Probes) == 1 {
106-
return nil
107-
}
108-
109-
oldestProbe := s.Cpu.Probes[0]
110-
newestProbe := s.Cpu.Probes[len(s.Cpu.Probes)-1]
111-
112-
delta := newestProbe.Total - oldestProbe.Total
113-
t := newestProbe.T.Sub(oldestProbe.T)
114-
115-
avgCPU := float64(delta) / max(1, float64(t.Microseconds()))
116-
avgMCPU := uint64(avgCPU * 1000)
117-
s.Cpu.Avg = avgMCPU
118-
119-
return nil
120-
}
121-
12215
func (r *Reconciler) KondenseContainer(container corev1.Container) error {
12316
memFactor := r.KondenseMemory(container)
12417
cpuFactor := r.KondenseCPU(container)

pkg/controller/update.go

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package controller
2+
3+
import (
4+
"fmt"
5+
"os/exec"
6+
"strconv"
7+
"strings"
8+
"time"
9+
10+
"github.com/rs/zerolog/log"
11+
corev1 "k8s.io/api/core/v1"
12+
)
13+
14+
func (r *Reconciler) UpdateStats(pod *corev1.Pod, container corev1.Container) error {
15+
var err error
16+
var output []byte
17+
for i := 0; i < 3; i++ {
18+
cmd := exec.Command("kubectl", "exec", "-i", r.Name, "-c", container.Name, "--", "cat", "/sys/fs/cgroup/memory.pressure", "/sys/fs/cgroup/cpu.stat")
19+
// we don't need kubectl for kondense container.
20+
if strings.ToLower(container.Name) == "kondense" {
21+
cmd = exec.Command("cat", "/sys/fs/cgroup/memory.pressure", "/sys/fs/cgroup/cpu.stat")
22+
}
23+
output, err = cmd.Output()
24+
if err == nil {
25+
r.CStats[container.Name].LastUpdate = time.Now()
26+
break
27+
}
28+
time.Sleep(50 * time.Millisecond)
29+
}
30+
if err != nil {
31+
return err
32+
}
33+
34+
txt := strings.Split(string(output), " ")
35+
if len(txt) != 15 {
36+
return fmt.Errorf("error got unexpected stats for container %s: %s", container.Name, txt)
37+
}
38+
39+
err = r.UpdateMemStats(container.Name, txt)
40+
if err != nil {
41+
return err
42+
}
43+
44+
err = r.UpdateCPUStats(container.Name, txt)
45+
if err != nil {
46+
return err
47+
}
48+
49+
s := r.CStats[container.Name]
50+
log.Info().
51+
Str("container", container.Name).
52+
Int64("memory_limit", s.Mem.Limit).
53+
Uint64("memory_time to decrease", s.Mem.GraceTicks).
54+
Uint64("memory_total", s.Mem.PrevTotal).
55+
Uint64("integral", s.Mem.Integral).
56+
Int64("cpu_limit", s.Cpu.Limit).
57+
Uint64("cpu_average", s.Cpu.Avg).
58+
Msg("updated stats")
59+
60+
return nil
61+
}
62+
63+
func (r *Reconciler) UpdateMemStats(containerName string, txt []string) error {
64+
s := r.CStats[containerName]
65+
66+
totalTmp := strings.TrimPrefix(txt[4], "total=")
67+
totalTmp = strings.TrimSuffix(totalTmp, "\nfull")
68+
total, err := strconv.ParseUint(totalTmp, 10, 64)
69+
if err != nil {
70+
return err
71+
}
72+
73+
delta := total - s.Mem.PrevTotal
74+
s.Mem.PrevTotal = total
75+
s.Mem.Integral += delta
76+
77+
return nil
78+
}
79+
80+
func (r *Reconciler) UpdateCPUStats(containerName string, txt []string) error {
81+
s := r.CStats[containerName]
82+
83+
totalTmp := strings.TrimSuffix(txt[9], "\nuser_usec")
84+
total, err := strconv.ParseUint(totalTmp, 10, 64)
85+
if err != nil {
86+
return err
87+
}
88+
89+
if len(s.Cpu.Probes) == int(s.Cpu.Interval) {
90+
// Pop oldest probe if Probes is full
91+
s.Cpu.Probes = s.Cpu.Probes[1:]
92+
}
93+
94+
p := Probe{
95+
Total: total,
96+
T: s.LastUpdate,
97+
}
98+
s.Cpu.Probes = append(s.Cpu.Probes, p)
99+
100+
// We can calculate when we have 2 or more probes
101+
if len(s.Cpu.Probes) == 1 {
102+
return nil
103+
}
104+
105+
oldestProbe := s.Cpu.Probes[0]
106+
newestProbe := s.Cpu.Probes[len(s.Cpu.Probes)-1]
107+
108+
delta := newestProbe.Total - oldestProbe.Total
109+
t := newestProbe.T.Sub(oldestProbe.T)
110+
111+
avgCPU := float64(delta) / max(1, float64(t.Microseconds()))
112+
avgMCPU := uint64(avgCPU * 1000)
113+
s.Cpu.Avg = avgMCPU
114+
115+
return nil
116+
}

0 commit comments

Comments
 (0)