本文是基於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;讀取/sys/fs/cgroup/memory/docker/[containerid]/memory.usage_in_bytes的值,作為mem_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/[id]/memory.limit_in_bytes作為mem_limit,否則mem_limit = machine_mem;
docker stats計算memory資料的演算法:
mem usage = mem_usage獲取屬於該容器network namespace veth pairs在主機中對應的veth*虛擬網絡卡ethinte***ce陣列,然後迴圈陣列中每個網絡卡裝置,讀取/sys/class/net//statistics/rx_bytes得到rx_bytes, 讀取/sys/class/net//statistics/tx_bytes得到對應的tx_bytes。mem limit = mem_limit
mem % = (mem_usage / mem_limit) * 100.0
將所有這些虛擬網絡卡對應的rx_bytes累加得到該容器的rx_bytes。
將所有這些虛擬網絡卡對應的tx_bytes累加得到該容器的tx_bytes。
docker stats計算network io資料的演算法:
net i = rx_bytes獲取每個塊裝置的ioservicebytesrecursive資料:先去讀取/sys/fs/cgroup/blkio/docker/[containerid]/blkio.io_serviced_recursive中是否有有效值,net o = tx_bytes
將每個塊裝置的ioservicebytesrecursive資料中所有read field對應value進行累加,得到該容器的blk_read值;
將每個塊裝置的ioservicebytesrecursive資料中所有write field對應value進行累加,得到該容器的blk_write值;
docker stats計算block io資料的演算法:
block i = blk_readblock 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...