docker stats 命令統(tǒng)計CPU利用率的底層實現(xiàn)

命令簡介

在容器的使用過程中,可以通過 docker stats 命令,及時查看容器使用的系統(tǒng)資源情況,默認(rèn)情況下,docker stats 命令會間隔 1 秒鐘刷新一次輸出的容器系統(tǒng)資源使用情況數(shù)據(jù)。命令輸出的主要內(nèi)容包括容器 ID、CPU 使用率、內(nèi)存使用率、網(wǎng)絡(luò) IO、磁盤 IO 等信息。

比如,某個輸出實例為:

[root@vm_rp0_cpu0_docker ~]# docker stats
CONTAINER           CPU %               MEM USAGE / LIMIT      MEM %               NET I/O             BLOCK I/O           PIDS
9c5b90413b6b        0.00%               3.711 MiB / 2.71 GiB   0.13%               0 B / 0 B           99.4 MB / 360 kB    9

命令統(tǒng)計 CPU 利用率的底層實現(xiàn)

docker stats 命令統(tǒng)計 CPU 利用率的底層實現(xiàn)方式主要為:

  1. 兩次讀取 /sys/fs/cgroup/cpuacct/docker/containerID/cpuacct.usage 的值,獲取其差值,單位為 ns、記為 container_cpu_total_delta;
  2. 兩次讀取 /proc/stat 中的 cpu 字段的值,獲取其差值,單位為 tick,記為 system_cpu_usage_delta;
  3. 將步驟 2 中的 system_cpu_usage_delta 轉(zhuǎn)換為 ns 表示,即 system_cpu_usage_delta * nanoSecondsPerSecond / clockTicksPerSecond,記為 system_cpu_total_delta
  4. 最后計算容器的 CPU 利用率,即 CPU_percent = container_cpu_total_delta / system_cpu_total_delta * getNumberOnlineCPUs,其中 getNumberOnlineCPUs 為系統(tǒng)的核數(shù)。至于為什么需要使用該值,可參考 https://github.com/moby/moby/issues/13626 中的說明。

根據(jù)以上的原理,可以整理為 shell 腳本,如下:

#!/bin/sh

while [ 1 ]
do
    CPU_TOTAL_ONE=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    CPU_TOTAL_ONE_SUM=$(echo $CPU_TOTAL_ONE | awk '{print $1+$2+$3+$4+$5+$6+$7}')
    CONTAINER_USE_1=$(cat /sys/fs/cgroup/cpuacct/docker/contaienrdID/cpuacct.usage) 
    sleep 1
    CPU_TOTAL_TWO=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    CPU_TOTAL_TWO_SUM=$(echo $CPU_TOTAL_TWO | awk '{print $1+$2+$3+$4+$5+$6+$7}')
    CONTAINER_USE_2=$(cat /sys/fs/cgroup/cpuacct/docker/contaienrdID/cpuacct.usage)
    CGROUP_USAGE=`expr $CONTAINER_USE_2 - $CONTAINER_USE_1`
    SYSTEM_TOTAL_DELTA=`expr $CPU_TOTAL_TWO_SUM - $CPU_TOTAL_ONE_SUM`
    CPU_PERCENT_RESULT=`expr $CGROUP_USAGE*4/$SYSTEM_TOTAL_DELTA/10000000*100|bc -l`   
    #clockTicksPerSecond=100, 4核, 核數(shù)根據(jù)實際情況調(diào)整
    #clockTicksPerSecond 可以使用clockTicksPerSecond = uint64(system.GetClockTicks())獲取,一般為100
    echo  $CPU_PERCENT_RESULT
done
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容