专栏首页Kubernetesdocker stats命令源码分析结果

docker stats命令源码分析结果

本文是基于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

##源码分析结果 ###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/<EthInterface>/statistics/rx_bytes得到rx_bytes, 读取/sys/class/net/<EthInterface>/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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Docker容器内的监控命令数据修正思路

    思路概述:编写linux c代码,生成对应的动态链接库(so文件),通过LDPRELOAD实现对/proc文件系统访问的劫持。劫持之后,实现容器内正确的数据计算...

    Walton
  • 利用Kubernetes和Helm进行高效的超参数调优

    在进行Hyperparameter Sweep的时候,我们需要根据许多不同的超参数组合进行不同的训练,为同一模型进行多次训练需要消耗大量计算资源或者耗费大量时间...

    Walton
  • cluster-proportional-autoscaler源码分析及如何解决KubeDNS性能瓶颈

    Author: xidianwangtao@gmail.com 工作机制 cluster-proportional-autoscaler是kubernetes的...

    Walton
  • .NET Core+MySql+Nginx 容器化部署

    1. 引言 上两节我们通过简单的demo学习了docker的基本操作。这一节我们来一个进阶学习,完成ASP.NET Core + MySql + Nginx的容...

    圣杰
  • 基于 Github+Jenkins+Maven+Docker 自动化构建部署

    传统的开发、测试、部署方式,是由开发人员本机或打包机进行打包,将war包提交给测试人员部署,测试通过后,再由实施人员负责部署到预发、生产环境中。中间的衔接不连贯...

    DevOps时代
  • Varnish为网站加速

    Varnish是一款高性能的开源HTTP加速器,挪威最大的在线报纸Verdens Gang (http://www.vg.no)使用3台Varnish代替了原来...

    胡齐
  • EOS开发环境搭建,如何编译安装构建EOSIO

    如果忘记加 --recursive 参数也没关系,随后也可以用命令 clone 所有子模块。

    笔阁
  • LINUX weblogic集群搭建- 03启动脚本的控制

    1.adminServer配置 base_domain/servers/AdminServer下新建文件夹security 同时里面创建一个新的文件boot.p...

    用户1499526
  • 腾讯区块链加速器全球32强诞生,入围率仅6.4%!|腾讯产业加速器·动态

    ? ? ? PS:接下来千万别错过腾讯SaaS加速器二期招募 腾讯SaaS加速器 二期30席项目招募 报名方式 腾讯SaaS加速器,作为腾讯产业加速器的一个重...

    腾讯SaaS加速器
  • Linux 服务器压力测试工具 – webbench 安装及使用教程

    魏艾斯博客www.vpsss.net

扫码关注云+社区

领取腾讯云代金券