README.md
1# Memory Ballast
2
3Memory Ballast extension enables applications to configure memory ballast for the process. For more details see:
4- [Go memory ballast blogpost](https://blog.twitch.tv/go-memory-ballast-how-i-learnt-to-stop-worrying-and-love-the-heap-26c2462549a2)
5- [Golang issue related to this](https://github.com/golang/go/issues/23044)
6
7The following settings can be configured:
8
9- `size_mib` (default = 0, disabled): Is the memory ballast size, in MiB.
10 Takes higher priority than `size_in_percentage` if both are specified at the same time.
11- `size_in_percentage` (default = 0, disabled): Set the memory ballast based on the
12 total memory in percentage, value range is `1-100`.
13 It is supported in both containerized(eg, docker, k8s) and physical host environments.
14
15**How ballast size is calculated with percentage configuration**
16When `size_in_percentage` is enabled with the value(1-100), the absolute `ballast_size` will be calculated by
17`size_in_percentage * totalMemory / 100`. The `totalMemory` can be retrieved for hosts and containers(in docker, k8s, etc) by the following steps,
181. Look up Memory Cgroup subsystem on the target host or container, find out if there is any total memory limitation has been set for the running collector process.
19 Check the value in `memory.limit_in_bytes` file under cgroup memory files (eg, `/sys/fs/cgroup/memory/memory.limit_in_bytes`).
20
212. If `memory.limit_in_bytes` is positive value other than `9223372036854771712`(`0x7FFFFFFFFFFFF000`). The `ballest_size`
22 will be calculated by `memory.limit_in_bytes * size_in_percentage / 100`.
23 If `memory.limit_in_bytes` value is `9223372036854771712`(`0x7FFFFFFFFFFFF000`), it indicates there is no memory limit has
24 been set for the collector process or the running container in cgroup. Then the `totalMemory` will be determined in next step.
25
263. if there is no memory limit set in cgroup for the collector process or container where the collector is running. The total memory will be
27 calculated by `github.com/shirou/gopsutil/mem`[[link]](https://github.com/shirou/gopsutil/) on `mem.VirtualMemory().total` which is supported in multiple OS systems.
28
29
30Example:
31Config that uses 64 Mib of memory for the ballast:
32```yaml
33extensions:
34 memory_ballast:
35 size_mib: 64
36```
37
38Config that uses 20% of the total memory for the ballast:
39```yaml
40extensions:
41 memory_ballast:
42 size_in_percentage: 20
43```
44