文档章节

docker-monitor-injector源码分析

WaltonWang
 WaltonWang
发布于 2017/01/20 22:20
字数 545
阅读 99
收藏 0

1.工具介绍 docker-monitor-injector是携程开源的一个修正docker容器内监控数据的工具,通过劫持open,fopen等linux库函数,重算/proc/meminfo,/proc/stat等度量指标,使得容器内free,top等系统工具能正确统计容器性能指标。下面将对其进行源码分析,并整理出各个数据的监控修正算法。

2.原理 图片描述 这里写图片描述 3.函数调用关系 这里写图片描述

4.算法(伪码)

  1. /proc/uptime
reaperage:  time(NULL) - lstat("/proc/1").st_ctime
idletime:   (reaperage - cpuacct.usage)/1000000000
  1. /proc/meminfo
MemTotal:   memory.limit_in_bytes
memfree:    memlimit - memusage
swaptotal:  memswlimit > 0 ? memswlimit - memlimit : 0
SwapFree:   (memswlimit > 0 && memswusage > 0)  ? (memswlimit - memlimit) - (memswusage - memusage):0
cached:     memory.stat.total_cache
Buffers:    0
SwapCached: 0
Slab:       0
  1. /proc/stat
a.proc_stat_by_shares
user_sum:   cpuacct.stat.user
system_sum: cpuacct.stat.system
nice_sum:   (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
idle_sum:   (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
iowait_sum: (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
irq_sum:    (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
softirq_sum:(_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
steal_sum:  (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
guest_sum:  (_self*cpu.shares/1024)/sysconf(_SC_NPROCESSORS_ONLN)
 
任一cpu stat值算法如下:
x           = x_sum/sysconf(_SC_NPROCESSORS_ONLN),x_sum为上述任一指标

b.flush_proc_stat_by_cpusets

btime:      stat("/proc/1").st_ctime
user_sum, nice_sum, system_sum, idle_sum, iowait_sum, irq_sum, softirq_sum, steal_sum, guest_sum
            = 容器所拥有cpu id在/proc/stat中对应值之和。
  1. /proc/cpuinfo
若容器绑定cpu,只输出绑定cpu id对应cpu info信息
否则,全部输出
  1. /sys/devices/system/cpu/online

//经过验证,该算法应该是有缺陷的,不作分析。

  1. /proc/diskstats
read        = blkio.io_serviced:major:minor:Read
write       = blkio.io_serviced:major:minor:Write
read_merged = blkio.io_merged:major:minor:Read
write_merged=blkio.io_merged:major:minor:Write
read_sectors= blkio.io_service_bytes:major:minor:Read/512
write_sectors= blkio.io_service_bytes:major:minor:Write)/512
rd_svctm    = blkio.io_service_time:major:minor:Read/1000000
rd_wait     = get_blkio_io_value(blkio.io_wait_time:major:minor:Read)/1000000
read_ticks  = rd_svctm + rd_wait
wr_svctm    = blkio.io_service_time:major:minor:Write/1000000
wr_wait     = blkio.io_wait_time:major:minor:Write/1000000;
write_ticks = wr_svctm + wr_wait
tot_ticks   = blkio.io_service_time:major:minor:Total/1000000
 
...
if (read || write || read_merged || write_merged || read_sectors || write_sectors || read_ticks || write_ticks) {
snprintf(lbuf, 256, "%u %u %s %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu %lu\n",
major, minor, dev_name, read, read_merged, read_sectors, read_ticks,
write, write_merged, write_sectors, write_ticks, ios_pgr, tot_ticks, rq_ticks);

6.参考项目 https://linuxcontainers.org/lxcfs/introduction/ https://github.com/CtripCloud/docker-monitor-injector

© 著作权归作者所有

WaltonWang
粉丝 227
博文 106
码字总数 226882
作品 0
深圳
程序员
私信 提问
angularjs源码笔记(3)--injector

简介 injector是用来做参数自动注入的,例如 ng在运行时会把$http, $scope, aService 自动作为参数传入进行执行。 其实很容易想明白,injector做了两件事 缓存那些service,以后作为参数注入...

alexqdjay
2016/08/18
3.6K
4
安装istio v1.0 详细过程和步骤

创建 istio 目录 [root@centos-110 ~]# mkdir istio [root@centos-110 ~]# cd istio 方案一: # 去下面的地址下载压缩包 # https://github.com/istio/istio/releases $ wget https://github.......

Rickie
2018/08/23
0
0
golang: Martini之inject源码分析

依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。在传统的程序设计过程中,调用者是自己来决定使用哪些被调用者实现的。但是在依赖注入模式中,创建被调用者的...

陈亦
2014/01/22
7.5K
21
jfinal 2.1 getModel有问题吧

@JFinal 如题,线上把2.0升级了2.1,在注册时候,提交了表单,里面有参数:sysuser.user_loginname 用户名,sysuser.user_password密码,后台的controller通过 SystemUser user = getModel(S...

Realfighter
2016/01/08
238
1
Martini 极好的 Go WEB 框架

已知的其他框架看到的是传统OOP的影子, 到处充蚀 Class 风格的 OOP 方法. 而我们知道GoLang中是没有Class的. 笔者也曾努力用Go 的风格做WEB开发, 总感到力不从心. 写出的代码不能完全称之为框...

喻恒春
2014/01/07
18.8K
16

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
35分钟前
4
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
49分钟前
99
7
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部