Reduce memory churn on module load by reusing kernel BTF spec #487
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Before this change we always parsed the given BTFPath spec. In 99% of the cases, the path pointed to the default kernel BTF location. Due to the way the cilium/ebpf library handles passing BTF spec, this caused the kernels BTF spec to be effectively parsed twice, causing quite the memory churn.
The docs mention that not passing
KernelTypes
for the program option will implicitly use the kernel BTF spec. While this is true, it also causes a lot of memory churn in the process, as each time thebtf.LoadKernelSpec
function gets called, the spec is copied.To work around this, kvisor detects if the given
BTFPath
is the default BTF location, parses the kernel BTF spec once and passes it to the ebpf lib via theKernelTypes
option.Running benchmarks, this change allows to cut the number of allocations by ~1/3.
Benchmark before optimization
Benchmark after optimization