为什么cgroup中的contianer内存限制不准确

时间:2019-09-02 09:05:53

标签: kubernetes

容器设置资源限制:

resources:
      limits:
        cpu: "1"
        memory: 1G
      requests:
        cpu: "1"
        memory: 1G

cgroup内存限制:

cat /sys/fs/cgroup/memory/kubepods.slice/kubepods-podaace5b66_c7d0_11e9_ba2a_dcf401d01e81.slice/memory.limit_in_bytes 
999997440

1GB = 1 * 1024 * 1024 * 1024 = 1,073,741,824B

k8s版本:1.14.4

docker版本:docker-ce-18.09.6 作业系统:ubuntu 18.04

2 个答案:

答案 0 :(得分:1)

因为您使用G标度声明了 GibiByte :如果期望使用 GigaByte ,则应使用Gi

# k get deployments.apps memory -o yaml|grep -i limits -C 1
        resources:
          limits:
            memory: 1Gi

$ cat /sys/fs/cgroup/memory/kubepods/burstable/pod15dff9ec-7815-48c0-bfce-453be77413ad/memory.limit_in_bytes 
1073741824

答案 1 :(得分:1)

我已经做了一些测试。

对于999997440 B(976560 KB)和1000000000 B(如您的示例)之间的值,您在memory.limit_in_bytes = 999997440 B中将具有相同的结果。 直到达到下一个(整数)字节数(可被页面大小整除)(默认值为4096)。在我的示例中为1000001536 B(976564K)。

我不是Linux专家,但根据documentation

  

成功写入此文件并不能保证成功设置   此限制为写入文件的值。这可能是由于   因素数量,例如四舍五入到页面边界或总数   系统上的内存可用性。要求用户重新阅读   写该文件以保证内核提交的值之后。

我建议使用prometherion中提到的Gi表示法来更好地控制资源限制。

希望获得帮助。