增强容器资源可见性

从Alibaba Cloud Linux 2(内核版本4.19.91-22.2.al7)和Alibaba Cloud Linux 3(内核版本5.10.46-7.al8)开始,在内核层面提供了容器资源视图功能的相关接口,实现对容器资源的可见性增强。本文将对该功能的接口进行说明,并提供示例场景供您参考。

背景信息

Alibaba Cloud Linux的容器资源视图功能接口默认状态下是未启动的,当您在启动该功能后,如果在容器中使用topfree等命令,让容器读取以下接口的数据时,将直接获取容器资源信息,而不是获取容器所在的宿主机(即ECS实例)资源信息。

  • /proc/cpuinfo

  • /proc/meminfo

  • /sys/devices/system/cpu/online

接口说明

接口

说明

/proc/sys/kernel/rich_container_enable

该接口控制容器资源视图功能是否开启。取值范围:

  • 0:关闭容器资源视图功能。

  • 1:开启容器资源视图功能。

默认值:0

/proc/sys/kernel/rich_container_source

该接口控制cgroup接口的数据源。取值范围:

  • 0:使用指针current所在的cgroup接口作为数据源。

  • 1:使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源。

默认值:0

/proc/sys/kernel/rich_container_cpuinfo_source

该接口控制/proc/cpuinfo接口以及/sys/devices/system/cpu/online接口显示的CPU数量。取值范围:

  • 0:使用Kubernetes的Limit数据,即cpu cgroup的quotaperiod的比值(quota/period),如果 quota为 -1,则会使用cpuset.cpus接口中的CPU数据源。

  • 1:使用cpuset.cpus接口中的CPU数据源。

  • 2:使用cpu.shares 值除以 /proc/sys/kernel/rich_container_cpuinfo_sharesbase值的向上取整后的数据(原始数据如果包含小数,则整数位加1后,只取整数作为最终数据,例如:原始数据为1.1,则最终数据为2)。最终数据最多不超过实际在线CPU的数量。

默认值:0

/proc/sys/kernel/rich_container_cpuinfo_sharesbase

/proc/sys/kernel/rich_container_cpuinfo_source接口的取值为2时,需要使用该接口作为计算公式的一部分获取最终数据。取值范围:大于等于2的整数值。

默认值:1024

接口使用示例

本示例中,已在一台Linux实例中部署Docker,并创建了一个内存大小为1 GB的容器。

  • 如果您未开启容器资源视图功能,即/proc/sys/kernel/rich_container_enable接口的值为0。当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器所在的宿主机(Linux实例)资源信息。free

  • 如果您在宿主机(Linux实例)中运行命令echo 1 > /proc/sys/kernel/rich_container_enable开启了容器资源视图功能,当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器资源信息。free

特殊场景说明

一般情况下,开启容器资源视图功能后,使用相关接口的默认值即可满足常规需求,但您需要注意以下特殊场景的接口配置:

对于非共享PID Namespace的Pod,其中的每一个容器都是独立的PID Namespace,如果使用systemd启动某个特权容器,容器的进程号为1号,则采集监控数据的任务可能位于容器的某个子cgroup中,而不是根cgroup。

例如,当您通过SSH登录容器并运行cat /proc/cpuinfo命令后:

  • 如果/proc/sys/kernel/rich_container_source取值为默认值0,则指针current实际是位于容器的sshd.service所创建的子cgroup中,此时查看的结果为错误数据。

  • 如果您运行echo 1 > /proc/sys/kernel/rich_container_source命令,使用child reaper(即当前PID Namespace的1号进程)所在的cgroup作为数据源,即可查看到正确的数据。