@@ -28,22 +28,37 @@ that system resource specifically for that container to use.
28
28
29
29
If the node where a Pod is running has enough of a resource available, it's possible (and
30
30
allowed) for a container to use more resource than its ` request ` for that resource specifies.
31
- However, a container is not allowed to use more than its resource ` limit ` .
32
31
33
32
For example, if you set a ` memory ` request of 256 MiB for a container, and that container is in
34
33
a Pod scheduled to a Node with 8GiB of memory and no other Pods, then the container can try to use
35
34
more RAM.
36
35
37
- If you set a ` memory ` limit of 4GiB for that container, the kubelet (and
38
- {{< glossary_tooltip text="container runtime" term_id="container-runtime" >}}) enforce the limit.
39
- The runtime prevents the container from using more than the configured resource limit. For example:
40
- when a process in the container tries to consume more than the allowed amount of memory,
41
- the system kernel terminates the process that attempted the allocation, with an out of memory
42
- (OOM) error.
36
+ Limits are a different story. Both ` cpu ` and ` memory ` limits are applied by the kubelet (and
37
+ {{< glossary_tooltip text="container runtime" term_id="container-runtime" >}}),
38
+ and are ultimately enforced by the kernel. On Linux nodes, the Linux kernel
39
+ enforces limits with
40
+ {{< glossary_tooltip text="cgroups" term_id="cgroup" >}}.
41
+ The behavior of ` cpu ` and ` memory ` limit enforcement is slightly different.
42
+
43
+ ` cpu ` limits are enforced by CPU throttling. When a container approaches
44
+ its ` cpu ` limit, the kernel will restrict access to the CPU corresponding to the
45
+ container's limit. Thus, a ` cpu ` limit is a hard limit the kernel enforces.
46
+ Containers may not use more CPU than is specified in their ` cpu ` limit.
47
+
48
+ ` memory ` limits are enforced by the kernel with out of memory (OOM) kills. When
49
+ a container uses more than its ` memory ` limit, the kernel may terminate it. However,
50
+ terminations only happen when the kernel detects memory pressure. Thus, a
51
+ container that over allocates memory may not be immediately killed. This means
52
+ ` memory ` limits are enforced reactively. A container may use more memory than
53
+ its ` memory ` limit, but if it does, it may get killed.
43
54
44
- Limits can be implemented either reactively (the system intervenes once it sees a violation)
45
- or by enforcement (the system prevents the container from ever exceeding the limit). Different
46
- runtimes can have different ways to implement the same restrictions.
55
+ {{< note >}}
56
+ There is an alpha feature ` MemoryQoS ` which attempts to add more preemptive
57
+ limit enforcement for memory (as opposed to reactive enforcement by the OOM
58
+ killer). However, this effort is
59
+ [ stalled] ( https://github.com/kubernetes/enhancements/tree/a47155b340/keps/sig-node/2570-memory-qos#latest-update-stalled )
60
+ due to a potential livelock situation a memory hungry can cause.
61
+ {{< /note >}}
47
62
48
63
{{< note >}}
49
64
If you specify a limit for a resource, but do not specify any request, and no admission-time
@@ -883,5 +898,4 @@ memory limit (and possibly request) for that container.
883
898
and its [ resource requirements] ( /docs/reference/kubernetes-api/workload-resources/pod-v1/#resources )
884
899
* Read about [ project quotas] ( https://www.linux.org/docs/man8/xfs_quota.html ) in XFS
885
900
* Read more about the [ kube-scheduler configuration reference (v1)] ( /docs/reference/config-api/kube-scheduler-config.v1/ )
886
- * Read more about [ Quality of Service classes for Pods] ( /docs/concepts/workloads/pods/pod-qos/ )
887
-
901
+ * Read more about [ Quality of Service classes for Pods] ( /docs/concepts/workloads/pods/pod-qos/ )
0 commit comments