1. 程式人生 > >docker stats 命令源碼分析

docker stats 命令源碼分析

https hint .com del size length IT tar ati

本文是基於docker 1.10.3版本的源碼,對docker stats命令進行源碼分析,看看docker stats命令輸出的數據是從cgroups fs中怎麽怎麽計算出來的。

docker client相關代碼入口可參考:/docker/docker/api/client/stats.go#141

docker daemon相關代碼入口可參考:/docker/docker/daemon/daemon.go#1474

源碼分析結果

Cpu數據:

docker daemon會記錄這次讀取/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage的值,作為cpu_total_usage;

並記錄了上一次讀取的該值為pre_cpu_total_usage;

讀取/proc/stat中cpu field value,並進行累加,得到system_usage;

並記錄上一次的值為pre_system_usage;

讀取/sys/fs/cgroup/cpuacct/docker/[containerId]/cpuacct.usage_percpu中的記錄,組成數組per_cpu_usage_array;

docker stats計算Cpu Percent的算法:

cpu_delta = cpu_total_usage - pre_cpu_total_usage;
system_delta = system_usage - pre_system_usage;
CPU % = ((cpu_delta / system_delta) * length(per_cpu_usage_array) ) * 100.0

Memory數據:

讀取/sys/fs/cgroup/memory/docker/[containerId]/memory.usage_in_bytes的值,作為mem_usage;

如果容器限制了內存,則讀取/sys/fs/cgroup/memory/docker/[id]/memory.limit_in_bytes作為mem_limit,否則mem_limit = machine_mem;

docker stats計算Memory數據的算法:

MEM USAGE = mem_usage
MEM LIMIT = mem_limit
MEM % = (mem_usage / mem_limit) * 100.0

Networt Stats數據:

獲取屬於該容器network namespace veth pairs在主機中對應的veth*虛擬網卡EthInterface數組,然後循環數組中每個網卡設備,讀取/sys/class/net//statistics/rx_bytes得到rx_bytes, 讀取/sys/class/net//statistics/tx_bytes得到對應的tx_bytes。

將所有這些虛擬網卡對應的rx_bytes累加得到該容器的rx_bytes。

將所有這些虛擬網卡對應的tx_bytes累加得到該容器的tx_bytes。

docker stats計算Network IO數據的算法:

NET I = rx_bytes
NET O = tx_bytes

Blkio Stats數據:

獲取每個塊設備的IoServiceBytesRecursive數據:先去讀取/sys/fs/cgroup/blkio/docker/[containerId]/blkio.io_serviced_recursive中是否有有效值,

如果有,則讀取/sys/fs/cgroup/blkio/docker/[containerId]/blkio.io_service_bytes_recursive的值返回; 如果沒有,就去讀取/sys/fs/cgroup/blkio/docker/[containerId]/blkio.throttle.io_service_bytes中的值返回;

將每個塊設備的IoServiceBytesRecursive數據中所有read field對應value進行累加,得到該容器的blk_read值;
將每個塊設備的IoServiceBytesRecursive數據中所有write field對應value進行累加,得到該容器的blk_write值;

docker stats計算Block IO數據的算法:

BLOCK I = blk_read
BLOCK O = blk_write

docker stats 命令源碼分析