從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作為數據源,即可查看到正確的數據。