mirror of
https://github.com/kubernetes/kubernetes.git
synced 2026-03-09 10:00:54 -04:00
Automatic merge from submit-queue
Reduce memory allocations in kube proxy
Memory allocation (and Go GarbageCollection) seems to be one of the most expensive operations in kube-proxy (I've seen profiles where it was more than 50%).
The commits are mostly independent from each other and all of them are mostly about reusing already allocated memory.
This PR is reducing memory allocation by ~5x (results below from 100-node load test):
before:
```
(pprof) top
38.64GB of 39.11GB total (98.79%)
Dropped 249 nodes (cum <= 0.20GB)
Showing top 10 nodes out of 61 (cum >= 0.20GB)
flat flat% sum% cum cum%
15.10GB 38.62% 38.62% 15.10GB 38.62% bytes.makeSlice
9.48GB 24.25% 62.87% 9.48GB 24.25% runtime.rawstringtmp
8.30GB 21.21% 84.07% 32.47GB 83.02% k8s.io/kubernetes/pkg/proxy/iptables.(*Proxier).syncProxyRules
2.08GB 5.31% 89.38% 2.08GB 5.31% fmt.(*fmt).padString
1.90GB 4.86% 94.24% 3.82GB 9.77% strings.Join
0.67GB 1.72% 95.96% 0.67GB 1.72% runtime.hashGrow
0.36GB 0.92% 96.88% 0.36GB 0.92% runtime.stringtoslicebyte
0.31GB 0.79% 97.67% 0.62GB 1.58% encoding/base32.(*Encoding).EncodeToString
0.24GB 0.62% 98.29% 0.24GB 0.62% strings.genSplit
0.20GB 0.5% 98.79% 0.20GB 0.5% runtime.convT2E
```
after:
```
7.94GB of 8.13GB total (97.75%)
Dropped 311 nodes (cum <= 0.04GB)
Showing top 10 nodes out of 65 (cum >= 0.11GB)
flat flat% sum% cum cum%
3.32GB 40.87% 40.87% 8.05GB 99.05% k8s.io/kubernetes/pkg/proxy/iptables.(*Proxier).syncProxyRules
2.85GB 35.09% 75.95% 2.85GB 35.09% runtime.rawstringtmp
0.60GB 7.41% 83.37% 0.60GB 7.41% runtime.hashGrow
0.31GB 3.76% 87.13% 0.31GB 3.76% runtime.stringtoslicebyte
0.28GB 3.43% 90.56% 0.55GB 6.80% encoding/base32.(*Encoding).EncodeToString
0.19GB 2.29% 92.85% 0.19GB 2.29% strings.genSplit
0.18GB 2.17% 95.03% 0.18GB 2.17% runtime.convT2E
0.10GB 1.28% 96.31% 0.71GB 8.71% runtime.mapassign
0.10GB 1.21% 97.51% 0.10GB 1.21% syscall.ByteSliceFromString
0.02GB 0.23% 97.75% 0.11GB 1.38% syscall.SlicePtrFromStrings
```
|
||
|---|---|---|
| .. | ||
| async | ||
| bandwidth | ||
| config | ||
| configz | ||
| crlf | ||
| dbus | ||
| ebtables | ||
| env | ||
| errors | ||
| exec | ||
| flock | ||
| framer | ||
| goroutinemap | ||
| hash | ||
| i18n | ||
| initsystem | ||
| interrupt | ||
| intstr | ||
| io | ||
| ipconfig | ||
| iptables | ||
| json | ||
| keymutex | ||
| labels | ||
| limitwriter | ||
| logs | ||
| maps | ||
| metrics | ||
| mount | ||
| net | ||
| netsh | ||
| node | ||
| oom | ||
| parsers | ||
| procfs | ||
| rand | ||
| removeall | ||
| resourcecontainer | ||
| rlimit | ||
| runtime | ||
| selinux | ||
| sets | ||
| slice | ||
| strings | ||
| sysctl | ||
| system | ||
| tail | ||
| taints | ||
| term | ||
| threading | ||
| tolerations | ||
| uuid | ||
| validation | ||
| version | ||
| wait | ||
| workqueue/prometheus | ||
| yaml | ||
| BUILD | ||
| doc.go | ||
| template.go | ||
| template_test.go | ||
| umask.go | ||
| umask_windows.go | ||
| util.go | ||
| util_test.go | ||