bitwise or and samir can set requests and limits now via cgroups!
My Own Docker Samir (WIP)#
Bitwise OR and Samir can set requests and limits now via cgroups!
Bitwise OR Refresher#
Remember learning bitwise OR at university but never quite understanding its practical use? Bitwise OR works with integer values by comparing their bits position by position.
Rule: If either bit is 1
, the result is 1
at that position; otherwise, the result is 0
.
Example:
001
010
=011
So, bitwise OR between 001
and 010
equals 011
.
Kernel Feature Flags with Bitwise OR#
Suppose we have the following features, each represented in 8 bits:
feature1 = 00000001 = 1
feature2 = 00000010 = 2
feature3 = 00000100 = 4
If you want to enable feature1
and feature3
, you don't pass them as a list. Instead, the kernel uses bitwise OR:
00000001
00000100
=00000101 = 5
The kernel enables features based on which bits are set to 1
. So, 00000101
enables the first and third features.
In Go, bitwise OR is represented by |
. For example:
CreateNamespaces(unix.CLONE_NEWUTS | unix.CLONE_NEWPID | unix.CLONE_NEWNS)
Resource Requests and Limits with Cgroups#
I have implemented resource requests and limits for both CPU and memory.
To create a new cgroup, place it in the cgroup filesystem:
/sys/fs/cgroup/your-group
This will automatically populate new files.
Memory Resources#
- Requests: Write bytes to
/sys/fs/cgroup/your-group/memory.low
- Limits: Write bytes to
/sys/fs/cgroup/your-group/memory.max
CPU Resources#
- Requests: Write to
/sys/fs/cgroup/your-group/cpu.weight
- Limits: Write to
/sys/fs/cgroup/your-group/cpu.max
cpu.max
Format#
cpu.max
expects the format: quota period
.
For example, if you specify CPU as 500m
(half a core), the kernel understands it in time, not cores.
Formula:
quota = (millicores / 1000) * period
The default period is 100000
microseconds.
For 500m
:
quota = (500 / 1000) * 100000 = 50000
microseconds
So, write to /sys/fs/cgroup/your-group/cpu.max
:
50000 100000
This means every 100000
microseconds, your process can use the CPU for 50000
microseconds.
You can find the implementation code in my samir repository on GitHub.