命令簡介
在容器的使用過程中,可以通過 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)方式主要為:
- 兩次讀取
/sys/fs/cgroup/cpuacct/docker/containerID/cpuacct.usage的值,獲取其差值,單位為 ns、記為container_cpu_total_delta; - 兩次讀取
/proc/stat中的cpu字段的值,獲取其差值,單位為tick,記為system_cpu_usage_delta; - 將步驟 2 中的
system_cpu_usage_delta轉(zhuǎn)換為 ns 表示,即system_cpu_usage_delta * nanoSecondsPerSecond / clockTicksPerSecond,記為system_cpu_total_delta; - 最后計算容器的 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