从Alibaba Cloud Linux 2(内核版本4.19.91-22.2.al7
)和Alibaba Cloud Linux 3(内核版本5.10.46-7.al8
)开始,在内核层面提供了容器资源视图功能的相关接口,实现对容器资源的可见性增强。本文将对该功能的接口进行说明,并提供示例场景供您参考。
背景信息
Alibaba Cloud Linux的容器资源视图功能接口默认状态下是未启动的,当您在启动该功能后,如果在容器中使用top、free等命令,让容器读取以下接口的数据时,将直接获取容器资源信息,而不是获取容器所在的宿主机(即ECS实例)资源信息。
/proc/cpuinfo
/proc/meminfo
/sys/devices/system/cpu/online
接口说明
接口 | 说明 |
/proc/sys/kernel/rich_container_enable | 该接口控制容器资源视图功能是否开启。取值范围:
默认值:0 |
/proc/sys/kernel/rich_container_source | 该接口控制cgroup接口的数据源。取值范围:
默认值:0 |
/proc/sys/kernel/rich_container_cpuinfo_source | 该接口控制/proc/cpuinfo接口以及/sys/devices/system/cpu/online接口显示的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实例)资源信息。
如果您在宿主机(Linux实例)中运行命令echo 1 > /proc/sys/kernel/rich_container_enable开启了容器资源视图功能,当您在容器中运行free -m命令时,查看到的资源信息如下图所示,该信息为容器资源信息。
特殊场景说明
一般情况下,开启容器资源视图功能后,使用相关接口的默认值即可满足常规需求,但您需要注意以下特殊场景的接口配置:
对于非共享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作为数据源,即可查看到正确的数据。