@@ -5,120 +5,13 @@ import (
5
5
"fmt"
6
6
"math"
7
7
"net/http"
8
- "os/exec"
9
8
"strconv"
10
- "strings"
11
- "time"
12
9
13
10
"github.com/rs/zerolog/log"
14
11
"github.com/unagex/kondense/pkg/utils"
15
12
corev1 "k8s.io/api/core/v1"
16
13
)
17
14
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 , "\n full" )
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 ], "\n user_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
-
122
15
func (r * Reconciler ) KondenseContainer (container corev1.Container ) error {
123
16
memFactor := r .KondenseMemory (container )
124
17
cpuFactor := r .KondenseCPU (container )
0 commit comments