全部產品
Search
文件中心

Alibaba Cloud Linux:增強容器資源可見度

更新時間:Jul 17, 2024

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