`

Docker 监控

阅读更多

        

目前项目内部署了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来查看,一个典型的输出如下:

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状态,其他状态可记录,监控值可稍后商榷。

转自http://segmentfault.com/a/1190000002811652

分享到:
评论

相关推荐

    Go-Liman-基本docker监控Web应用程序

    **Go-Liman:基本Docker监控Web应用程序** Go-Liman是一个使用Go语言开发的轻量级Web应用程序,专为监控Docker容器而设计。它提供了一个直观的界面,用于跟踪和管理Docker宿主机上的容器状态,性能指标以及日志。在...

    Docker监控方案比较与选型指南.pptx

    在选择Docker监控方案时,首先要明确监控目标。对于小型应用和开发环境,轻量级监控可能就足够了,主要关注容器的基本运行状态。而对于生产环境和高负载应用,全面监控更为重要,需要对资源使用、性能指标和日志等...

    dockerana, 支持Grafana和 Graphite的Docker 监控.zip

    dockerana, 支持Grafana和 Graphite的Docker 监控 dockeranaDocker hackathon幻灯片Docker dockercon14幻灯片概述:时间系列 Docker 仪器和可视化构建/测试在Ubuntu信任的时候,需要在boot2docker上测试需要跨多个

    zabbix监控docker模板

    这个是zabbix监控docker的模板,支持主动和被动模式,使用方法见博文https://blog.csdn.net/qq_36961530/article/details/80448301

    promethues(普罗米修斯)监控docker容器-详细文档

    promethues(普罗米修斯)监控docker容器——详细文档,超详细文档总结

    zabbix-监控redis的info下信息,nginx桩信息,docker自动发现各个容器的资源信息

    docker监控样例: 2.上传编译后文件: mkdir -p /usr/src/zabbix/src/modules/zabbix_module_docker/ cd /usr/src/zabbix/src/modules/zabbix_module_docker/ rz zabbix_module_docker.so chmod 777 /usr/src/zabbix/...

    docker-watchman:Docker监控工具

    【标题】 Docker Watchman:Docker 监控利器 Docker Watchman 是一款专为 Docker 容器设计的监控工具,旨在帮助用户更好地管理和监控他们的 Docker 环境。通过实时跟踪容器的状态、性能指标以及日志输出,Docker ...

    watchdock:Docker 监控和管理客户端

    Docker 监控和管理客户端 watchdock 是一个 Docker 监控 Web 应用程序。 该应用程序是自包含的,不需要额外的依赖项、服务(除了 docker :-)或服务器。 docker 恶魔需要作为 IP 服务公开并激活 CORS: -H tcp://...

    Prometheus的监控及docker监控插件、微信报警、内有使用文档

    ### 脚本部分介绍 - 运行之前先查看脚本,修改一下Basrdir的路径为你想安装的路径 - 把这个项目拷贝,记得是"拷贝"到Basedir目录下 - 功能: ``` 部署Prometheus、node_exporter、grafana、alertmanager ...

    使用 cadvisor、prometheus、redis 和 grafana 监控 docker 容器.zip

    使用 cadvisor、prometheus、redis 和 grafana 监控 docker 容器docker 监控使用 cadvisor、prometheus、redis 和 grafana 监控 docker 容器运行-docker-compose up如果一切正常,你应该看到这条消息msg="服务器已...

    docker实战详细步骤教程

    docker超详细基础教程,按步骤学习快速掌握docker的用法 Docker实战 docker概述 docker安装 内存检测 系统升级 安装依赖包 设置yum源 ...Docker监控原理 K8S集群 前置工作 安装k8s组件 部署Master节点

    用zabbix实现对docker内容器的监控

    2. **配置Docker监控模板**: Zabbix提供了预置的Docker监控模板,包括容器的CPU使用率、内存使用情况、网络带宽和磁盘使用等监控项。导入模板到Zabbix服务器后,关联到相应的宿主机或容器。 3. **自动发现容器**: ...

    prometheus监控docker容器详细资料—超详细,超全面(带文档和相关软件包)

    在容器化环境中,如Docker,Prometheus可以提供强大的监控能力,帮助运维人员实时了解容器的运行状态、资源利用率以及服务性能。 在监控Docker容器时,Prometheus的主要优势包括其灵活性、强大的查询语言PromQL以及...

    开源项目-dustinblackman-collectd-docker-plugin.zip

    总之,【开源项目-dustinblackman-collectd-docker-plugin】为Docker监控提供了一个强大且灵活的解决方案,通过集成到Collectd监控系统,可以全面了解容器化的应用程序性能,对于DevOps团队和系统管理员来说是一个...

    Linux运维监控工具(支持系统硬件信息,内存,cpu,温度,磁盘空间及IO,硬盘smart,系统负载,网络流量等监控).zip

    【资源说明】 ...Linux运维监控工具(支持系统硬件信息,内存,cpu,温度,磁盘空间及IO,硬盘smart,系统负载,网络流量等监控,服务接口,大屏展示,拓扑图,进程监控,端口监控,docker监控,文件防..

    Monitoring Docker

    一、Docker监控的重要性 Docker容器的轻量级特性使得其在资源利用、快速部署和隔离性方面具有显著优势。然而,这种灵活性也带来了挑战,如资源管理、性能瓶颈和故障定位。通过监控,我们可以实时了解容器的健康状态...

    docker官方文档_v1.6_中文翻译.pdf

    * Docker 监控和日志:如何使用 Docker 监控和日志工具来监控和记录 Docker 环境。 Docker 官方文档 v1.6 中文翻译提供了 Docker 的基础知识、容器管理、镜像管理、Compose、Swarm、机器、Hub、安全和命令行等方面...

    性能测试之Docker监控

    微服务、大中台盛行的当下,容器化已经被... Docker容器监控 效果图 安装使用 Prometheus和Grafana的安装,参阅上文 安装启动cadvisorsudodockerrun\--volume=/:/rootfs:ro\--volume=/var/run:/var/run:ro\--vol

    基于Java的Linux运维监控工具Wgcloud设计源码

    系统实现了基于Java的Linux运维监控工具Wgcloud,支持系统硬件信息、内存、CPU、温度、磁盘空间及IO、硬盘SMART、系统负载、网络流量等监控,服务接口监测,大屏展示,拓扑图,端口监控,进程监控,Docker监控,日志...

    docker-mon:基于控制台的Docker监控

    $ docker run -ti -v /var/run/docker.sock:/var/run/docker.sock icecrime/docker-mon 如果您想自己构建它: $ docker build -t docker-mon . $ docker run -ti -v /var/run/docker.sock:/var/run/docker.sock ...

Global site tag (gtag.js) - Google Analytics