2019独角兽企业重金招聘Python工程师标准>>>

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

转载于:https://my.oschina.net/jxcdwangtao/blog/828648

docker stats命令源码分析结果相关推荐

  1. rm删除命令源码分析

    为什么看? 想要在删除文件前,先覆盖文件内容,防止他人恢复文件,从而得到文件原内容:并且需要支持rm命令原本的参数选项: NAME rm - remove files or directories S ...

  2. spice-gtk的spicy命令源码分析

    1.主函数入口 int main(int argc, char *argv[]) {GError *error = NULL;GOptionContext *context;spice_connect ...

  3. docker volume源码分析

    2019独角兽企业重金招聘Python工程师标准>>> 这是在docker v1.10.3版本的使用过程中,使用convoy 作为volume driver,在一次docker vo ...

  4. Docker源码分析(二):Docker Client创建与命令执行

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part2 1. 前言 如今,Docker作为业界领先的轻量级虚拟化容器管理引 ...

  5. celery源码分析:multi命令分析

    celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery简介 celery是一款异步任务框架,基于AMQP协议的任务调度框架.使用的场景 ...

  6. Docker源码分析(一):Docker架构

    1 背景 1.1 Docker简介 Docker是Docker公司开源的一个基于轻量级虚拟化技术的容器引擎项目,整个项目基于Go语言开发,并遵从Apache 2.0协议.目前,Docker可以在容器内 ...

  7. Docker源码分析(十):Docker镜像下载

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part10 1.前言 说Docker Image是Docker体系的价值所在 ...

  8. Docker源码分析(八):Docker Container网络(下)

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part8 1.Docker Client配置容器网络模式 Docker目前支 ...

  9. Docker源码分析(七):Docker Container网络 (上)

    http://www.infoq.com/cn/articles/docker-source-code-analysis-part7 1.前言(什么是Docker Container) 如今,Dock ...

最新文章

  1. 看麦田“蚂蚁网” 想网络新社区
  2. location和location.href跳转url的区别
  3. 设置QtreeWidget水平滚动条
  4. powermockito教程_Mockito与PowerMock的使用基础教程
  5. mysql面试关联查询语句_sql语句多表联查语句的练习(面试题)
  6. ios html5 文件上传,【Web前端问题】上传文件使用axios发送FormData数据,参数为空...
  7. 买房子需要注意什么?最佳答案
  8. 2D空间中求线段与圆的交点
  9. OpenCV图像处理基础操作(4)
  10. 临时邮箱获取验证信息
  11. 有负数c语言除法,C语言负数的除法和求余运算
  12. html作品使用说明,使用说明html模板
  13. ZOJ - 3939
  14. 艹,我竟然找到了克服「微信提示音」焦虑症的方法
  15. Python+Excel法力无穷
  16. php创蓝253四要素认证_创蓝253配置
  17. ion-slides广告轮播
  18. SQL 数据库 学习 011 关系、一对一、一对多、多对多
  19. python根据出生日期计算年龄的源码
  20. 雷柏MT750w鼠标无线蓝牙连接教程

热门文章

  1. GPSInfoProvider定位
  2. 8种Nosql数据库系统对比
  3. 深入讲解MPLS/×××技术原理
  4. SQLServer Date
  5. 进程、应用程序域、程序集、对象上下文区别与联系
  6. 发现一个很好的工具——VNN
  7. 一份非常详尽的 Objective-C 到 Swift 的迁移指南
  8. 前端工程师的mysql笔记
  9. .INFO域名总量跌破700万,8月第三周净减51,477个
  10. js脚本屏蔽页面点击