目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路。

1、关于监控的内容

监控宿主机本身

监控宿主机本身还是比较简单的,同其他服务器监控类似,对cpu、network、io、disk等做通用的检查,这里不再细说。

额外的,因为是docker的宿主机,还应该监控 容器本身的一些指标,如 :

  • 拥有的全部的容器数量;
  • 正在运行的容器的数量;
  • dead容器的数量(如果此数量变化应该报警);
  • docker 本身的信息,如Storage Driver、Data Space Used、Data Space Total、Metadata Space Total、Metadata Space Used、client version、client api version、server version、servier api version 等;

监控容器

docker容器通过namespace做资源隔离,通过cgroup来做资源限制。监控方便,只能通过在宿主机本身查看对应容器的cgroup stats。

具体大项有:

  1. 容器的本身信息,如名称,ip、使用的镜像、启动时间、启动命令等;
  2. 容器的状态,如可先监控两个量值,running or not running (当状态变化时报警);
  3. 容器使用cpu的资源信息;
  4. 容器使用memory的资源信息;
  5. 容器的network io信息;
  6. 容器的disk信息;

2、关于监控项的获取

宿主机本身

宿主机的一般信息获取 见zabbix监控项,不重复。

  1. 拥有的全部容器的数量:

    docker ps -a -q | wc -l 
  2. 正在运行的容器的数量:

    docker ps  -q | wc -l  
  3. 非运行状态的容器的数量:

    docker ps -a  | grep -v 'Up '  | grep -v 'CONTAINER' | wc -l 
  4. docker本身信息,可从命令 docker version & docker info中获取

监控容器

1、容器本身信息 & 状态:

从docker inspect 中获取,简单脚本如下:

#!/usr/bin/env python import commands import sys import types import json def get_container_info( container ): msg = commands.getoutput('docker inspect '+container) #return msg data = json.loads( msg ) return data[0] container = sys.argv[1] msg = get_container_info( container ) containerid = msg["Id"] image = msg['Image'] name = msg['Name'] ip = msg['NetworkSettings']['IPAddress'] status = msg['State']['Running'] startedat = msg['State']['StartedAt'] print containerid, image, name, ip, status, startedat 

2、 容器使用cpu情况:

从cpuacct中获取相应的值,首先要获取一个cpu周期的时间值,getconf CLK_TCK,默认为100,即100Hz,一个周期即为 1/100s = 10ms = 10^7 ns;

可以获取cpuacct.usage、 cpuacct.stat ,但是具体怎么做对比,还得观察。

理论上的计算方法为,在单位时间内,docker 容器对应的cpu使用的变化值 除以 总系统cpu时间的变化值 乘以 100%;其中,docker容器对应的cpu值可以从cgroup.cpuacct中的cpuacct.usage值得到,他的单位是纳秒,10^9个纳秒为1秒;系统的cpu总时间可以从/proc/stat中获取,第一行中。以“cpu ”开头那行,数值累加就是当前系统cpu总时间,需要注意的是,他的数值单位为 “cpu周期”,就是刚才获取到的 1/CLK_TCK ,关于/proc/stat 的说明文档:http://www.linuxhowtos.org/System/procstat.htm

从docker源码中获知,docker的stats计算方法和这个有点出入,它在此计算的基础上,又乘以 cpu核数 得到最终结果,这个让我有点不理解,和官方确认中。。。。。
已经和官方确认,只是双方对“cpu利用率如何定义”的问题,我认为应该是平均利用率,官方认为应该是total cpu 利用率,好吧。。。。。 地址为: #issues 13626
相关源码地址为:https://github.com/docker/docker/blob/0d445685b8d628a938790e50517f3fb9...

以下是用shell完成的模拟docker计算cpu利用率方法的小脚本:

#!/bin/sh ##echo user nice system idle iowait irq softirq CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}') Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}') CGROUP_USAGE_1=$(cat /cgroup/cpuacct/docker/55dec85d2e93c487fbeb1e85c9677e64dd1b4bdcc5be0e5f2539e52c87641d4e/cpuacct.usage) sleep 1 CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}') Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}') CGROUP_USAGE_2=$(cat /cgroup/cpuacct/docker/55dec85d2e93c487fbeb1e85c9677e64dd1b4bdcc5be0e5f2539e52c87641d4e/cpuacct.usage) CGROUP_USAGE=`expr $CGROUP_USAGE_2 - $CGROUP_USAGE_1` Total=`expr $Total_2 - $Total_1` CGROUP_RATE=`expr $CGROUP_USAGE*24/$Total/10000000*100|bc -l` echo $CGROUP_USAGE_1 , $CGROUP_USAGE_2 , $CGROUP_USAGE , $Total,  $CGROUP_RATE 

3、 容器使用memory情况:

从容器所在cgroup组中查看memory.stats信息,具体值 的信息如下

统计  描述 cache   页缓存,包括 tmpfs(shmem),单位为字节 Rss 匿名和 swap 缓存,不包括 tmpfs(shmem),单位为字节 Mapped_file memory-mapped 映射的文件大小,包括 tmpfs(shmem),单位为字节 pgpgin  存入内存中的页数 pgpgout 从内存中读出的页数 swap    swap 用量,单位为字节 Active_anon 在活跃的最近最少使用(least-recently-used,LRU)列表中的匿名和 swap 缓存,包括 tmpfs(shmem),单位为字节 Inactive_anon   不活跃的 LRU 列表中的匿名和 swap 缓存,包括tmpfs(shmem),单位为字节 Active_file 活跃 LRU 列表中的 file-backed 内存,以字节为单位 Inactive_file   不活跃 LRU 列表中的 file-backed 内存,以字节为单位 unevictable 无法再生的内存,以字节为单位 hierarchical_memory_limit(重点)   包含 memory cgroup 的层级的内存限制,单位为字节 hierarchical_memsw_limit    包含 memory cgroup 的层级的内存加 swap 限制,单位为字节 

4、容器网络io情况: 可以执行命令: docker exec ifconfig eth0 看 Rx和Tx的值。

5、磁盘io情况 从blkio 中获取,相关参考:

  1. blkio.time:统计cgroup对设备的访问时间,按格式device_types:node_numbers milliseconds读取信息即可,以下类似。
  2. blkio.io_serviced:统计cgroup对特定设备的IO操作(包括read、write、sync及async)次数,格式device_types:node_numbers operation number
  3. blkio.sectors:统计cgroup对设备扇区访问次数,格式device_types:node_numbers sector_count
  4. blkio.io_service_bytes:统计cgroup对特定设备IO操作(包括read、write、sync及async)的数据量,格式device_types:node_numbers operation bytes
  5. blkio.io_queued:统计cgroup的队列中对IO操作(包括read、write、sync及async)的请求次数,格式number operation
  6. blkio.io_service_time:统计cgroup对特定设备的IO操作(包括read、write、sync及async)时间(单位为ns),格式device_types:node_numbers operation time
  7. blkio.io_merged:统计cgroup 将 BIOS 请求合并到IO操作(包括read、write、sync及async)请求的次数,格式number operation
  8. blkio.io_wait_time:统计cgroup在各设备中各类型IO操作(包括read、write、sync及async)在队列中的等待时间(单位ns),格式device_types:node_numbers operation time

6、磁盘使用情况,我以为只需要监控docker pool space的状况即可,默认建立100G的空间供docker使用,可通过docker info来查看,一个典型的输出如下:

CPUs: 24 Total Memory: 62.87 GiB Name: jx-lj-opweb01.lianjia.com ID: QTML:RSSS:IKAX:FRIP:4YEQ:IXWX:ROMV:APZD:RV4M:ISY2:QW2D:VMXW " title="" data-original-title="复制" style="box-sizing: border-box; cursor: pointer; display: block; float: left; background-image: url("../img/codeTools.svg"); height: 16px; width: 16px; background-size: auto 16px; margin: 4px 5px; opacity: 0.5; background-position: -16px 0px !important;">
Containers: 11 Images: 181 Storage Driver: devicemapper Pool Name: docker-8:5-7471107-pool Pool Blocksize: 65.54 kB Backing Filesystem: extfs Data file:  Metadata file:  Data Space Used: 7.846 GB Data Space Total: 107.4 GB Metadata Space Used: 15.92 MB Metadata Space Total: 2.147 GB Udev Sync Supported: true Library Version: 1.02.89-RHEL6 (2014-09-01) Execution Driver: native-0.2 Kernel Version: 2.6.32-431.el6.x86_64 Operating System: <unknown> CPUs: 24 Total Memory: 62.87 GiB Name: jx-lj-opweb01.lianjia.com ID: QTML:RSSS:IKAX:FRIP:4YEQ:IXWX:ROMV:APZD:RV4M:ISY2:QW2D:VMXW 

7、在前期可以先重点监控 宿主机情况 & 容器的memory状态,其他状态可记录,监控值可稍后商榷。

docker监控的一点想法的更多相关文章

  1. Docker 监控的一点想法

    目前项目内部署了docker,于是涉及到关于监控的事情,参考一些经典实例以及一些自己的想法,总结一下思路. 1.关于监控的内容 监控宿主机本身 监控宿主机本身还是比较简单的,同其他服务器监控类似,对c ...

  2. docker监控

    [编者的话]这篇文章作者是Usman,他是服务器和基础架构工程师,有非常丰富的分布式构建经验.该篇文章主要分析评估了五种Docker监控工具,包括免费的和不免费的:Docker Stats.CAdvi ...

  3. 【干货】解密监控宝Docker监控实现原理

    分享人高驰涛(Neeke),云智慧高级架构师,PHP 开发组成员,同时也是 PECL/SeasLog 的作者.8 年研发管理经验,早期从事大规模企业信息化研发架构,09 年涉足互联网数字营销领域并深入 ...

  4. 【活动】监控宝惹火Docker监控,开放试用中

    要说这两年最火爆的技术有哪些,Docker绝对是其中之一. 有人说,Docker缺少必要的运维监控工具,实践起来有难度. 幸福来的太快了. 云智慧旗下产品监控宝又惹火了,推出重量级新功能——Docke ...

  5. Docker 监控实战

    如今,越来越多的公司开始使用 Docker 了,现在来给大家看几组数据: 2 / 3 的公司在尝试了 Docker 后最终使用了它 也就是说 Docker 的转化率达到了 67%,而转化市场也控制在 ...

  6. Docker 监控- Prometheus VS Cloud Insight

    如今,越来越多的公司开始使用 Docker 了,2 / 3 的公司在尝试了 Docker 后最终使用了它.为了能够更精确的分配每个容器能使用的资源,我们想要实时获取容器运行时使用资源的情况,怎样对 D ...

  7. Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法

    原文:Installshield关于.NET安装时需要重启动的处理办法,以及延伸出的重启后继续安装的安装包的一点想法 很多朋友做安装包的时候,所打包的软件需要.NET Framework之类的环境,他 ...

  8. 7、Docker监控方案(cAdvisor+InfluxDB+Grafana)

    一.组件介绍 我们采用现在比较流行的cAdvisor+InfluxDB+Grafana组合进行Docker监控. 1.cAdvisor(数据采集) 开源软件cAdvisor(Container Adv ...

  9. Docker 监控之 SaaS 解决方案

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

随机推荐

  1. SpringInAction--自动化装配Bean(隐式装配)

    关于Bean的介绍就具体不多介绍了,,, Spring在配置时候有三种方案可选 1.在xml中进行显示配置 2.在java中进行显示配置 3.隐式的Bean发现机制和自动装配 今天学习的就是自动化装配 ...

  2. C# POST请求 json格式

    /* * url:POST请求地址,例如:url = "http://localhost:35229/ddn/GetPostData"; * postData:json格式的请求报 ...

  3. APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍

    以下不少内容来自man手册 结构体struct stat         结构体struct stat用于保存文件相关的所有信息.         struct stat的基本成员如下所示 struc ...

  4. 【SQL查询】分区查询Over

    1. Over介绍 Over为开窗函数.就是把满足条件的数据分成几个区域,每个区域可以通过像现实中的“窗口”来观察统计这些数据. over不能单独使用,要和分析函数:rank(), dense_ran ...

  5. 【HEVC学习与研究】29、解码第一个Coding Quadtree结构(1)

    ctu tree属性 http://blog.csdn.net/shaqoneal/article/details/26088817

  6. three.js入门系列之光和阴影

    初中物理教过我们镜面反射和漫反射,这是由于物体的材质直接导致的. 在three.js中,由于物体的材料不同,对于光源的反应也是不一样的,下面就让我们一探究竟. 一.材料 据Three.js中描述,有两 ...

  7. Lua基础---一维数组与多维数组

    Lua语言中,数组和C还是有区别的,Lua的数组下标从1开始计数,而C语言的数组下标从0开始计数,我想这可能是设计Lua的人想要符合人的思维习惯而去这么设计的. 数组,也就是按相同类型,在内存中顺序排 ...

  8. Xcode9 新功能

    翻译: https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcod ...

  9. CS231n课程笔记翻译2:图像分类笔记

    译者注:本文智能单元首发,译自斯坦福CS231n课程笔记image classification notes,由课程教师Andrej Karpathy授权进行翻译.本篇教程由杜客翻译完成.Shiqin ...

  10. RxJava 1.x 笔记:创建型操作符

    本篇文章是阅读 官方文档 的笔记. 作者:shixinzhang(百度搜索 "shixinzhang CSDN" 即可找到我) RxJava 也用了有段时间,那么多操作符总不想去记 ...