docker stats命令原始碼分析結果

2021-07-25 16:58:48 字數 2321 閱讀 4935

本文是基於docker 1.10.3版本的原始碼,對docker stats命令進行原始碼分析,看看docker stats命令輸出的資料是從cgroups fs中怎麼怎麼計算出來的。

$ docker stats nginx-test

container

cpu %

mem usage / limit

mem %

net i/o

block i/o

nginx-test

0.00%

4.268 mb / 1.041 gb

0.41%

1.296 kb / 648 b

7.463 mb / 0 b

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

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

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

讀取/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

獲取屬於該容器network namespace veth pairs在主機中對應的veth*虛擬網絡卡ethinte***ce陣列,然後迴圈陣列中每個網絡卡裝置,讀取/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

獲取每個塊裝置的ioservicebytesrecursive資料:先去讀取/sys/fs/cgroup/blkio/docker/[containerid]/blkio.io_serviced_recursive中是否有有效值,

將每個塊裝置的ioservicebytesrecursive資料中所有read field對應value進行累加,得到該容器的blk_read值;

將每個塊裝置的ioservicebytesrecursive資料中所有write field對應value進行累加,得到該容器的blk_write值;

docker stats計算block io資料的演算法:

block i = blk_read

block o = blk_write

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...

ThreadPoolExecutor原始碼閱讀

執行緒池解決兩個問題 一是復用執行緒,減少建立銷毀執行緒帶來系統開銷 二是限定系統資源使用邊界,避免大量執行緒消耗盡系統記憶體 適用於互不依賴,執行時間短,不需要對執行緒控制操作的執行緒 新增任務時,1.若執行緒數量小於corepoolsize,則新增執行緒執行任務 2.若執行緒數量大於等於core...

OrangePi One Android 原始碼編譯

一 系統環境搭建參照 二 lichee原始碼編譯 1.檢視help build.sh h2.配置核心 cd linux 3.4 make arch arm menuconfig 進入配置頁面,上下移動列表,空格是選擇列表,左右移動選擇退出選項 3.首次編譯執行清除 在 lichee linux3.4...