专栏首页Kubernetesdocker-monitor-injector源码分析

docker-monitor-injector源码分析

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入分析Kubernetes Critical Pod(三)

    本文介绍了Kubelet在Predicate Admit准入检查时对CriticalPod的资源抢占的原理,以及Priority Admission Contr...

    Walton
  • 浅尝TensorFlow on Kubernetes

    Author: xidianwangtao@gmail.com 更多关于Kubernetes的深度文章,请到我oschina/WalonWang的博客主页...

    Walton
  • Kubernetes Deployment滚动更新场景分析

    基于Kubernetes v1.7.4 关于Kubernetes Deployment滚动更新 Kubernetes官网文档说明:https://kube...

    Walton
  • javascript 红皮高程(8)

    今天继续,JS的数值转换。这里面的坑啊, 真是太多了。 JS有三个函数可以把非数值转为数值: Number(); parseInt(); parseFloat(...

    web前端教室
  • 6款好用的C语言编译器推荐

    一些刚开始接触C语言编译的网友想下载一款C语言编译器来使用,不过,网络上有不少C语言编译器相关的软件,让人很难抉择。那么,C语言编译器哪个好?今天的文章里,我给...

    企鹅号小编
  • 对未来的一些憧憬及回顾

    公众号是我从研一9月份开始到现在为止,已经快两年了,从一个博主角度来说,粉丝确实对我是最大的摧残,因为我只有3k粉丝,没听错,运营两年,才只有3k。不擅长,也不...

    公众号guangcity
  • 为什么我建议你多做数据仓库项目

    2010年,我到上海的第一年。年底回老家的时候,在火车站碰到一位之前的老同事。闲聊之中,发现他在寻找新的机会,原单位是老企业,没什么活力,年轻人上升空间有限。他...

    用户1564362
  • 基于Node.js实现一个小小的爬虫

    从拉钩招聘网站中找出“前端开发”这一类岗位的信息,并作相应页面分析,提取出特定的几个部分如岗位名称、岗位薪资、岗位所属公司、岗位发布日期等。并将抓取到的这些信息...

    书童小二
  • 藏在正则表达式里的陷阱,一个正则表达式导致CPU 利用率居高不下

    我们可以看到所有的堆栈都指向了一个名为 validateUrl 的方法,这样的报错信息在堆栈中一共超过 100 处。通过排查代码,我们知道这个方法的主要功能是校...

    IT大咖说
  • 一个正则表达式引发的血案,让线上CPU100%异常!

    前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具,我们...

    芋道源码

扫码关注云+社区

领取腾讯云代金券