IT技术博客大学习 共学习 共进步

docker容器监控的实现

IPCPU--网络之路 2016-04-20 13:20:44 浏览 2,841 次

说明

本文写于2015年,所有PAAS平台相关内容都已经在2015Q3完成,当时使用的docker版本为1.6.2,虽然docker新版本发布很快,但是下面提到的监控相关的内容大致相同。

一、 docker容器有哪些指标需要监控?

  • 容器CPU、内存、IO、网络、应用存活

二、 如何监控?

宿主机监控 zabbix可以实现,容器内部安装zabbix?
(数据和宿主机一致,无法反应容器真实状态)

看别人都如何实现?

Searching GitHub…

  • seagull
    可以查看、启停容器,管理镜像,但不支持查看容器使用CPU、内存、IO、网络等情况。

  • Prometheus
    太庞大

  • Docker官方stats接口
    要求docker在1.5以上版本,有命令行和API两种方式,API为非中断式,不停的显示数据

  • Docker-mon
    命令行工具,1.5以上版本,展示效果很好,但数据无法汇总,也无法查看历史数据

  • Dockernana
    可以对docker宿主进行日常cpu、内存、IO进行监控,但无法监控容器的资源使用。

  • cAdvisor
    可以查看容器对CPU、内存、磁盘的使用情况,WEB界面方式,缺点是每个宿主都要起个容器,而且数据无法汇总,无法查看历史数据。

图1:Docker-mon


图2:cAdvisor

没办法,自己来吧…

三、 如何获取相关数据

CPU,时间片差值相减除以时间

  1. cat /cgroup/cpuacct/docker/$DOCKERID/cpuacct.stat

  2. user 5647675

  3. system 1848266

  4. #@Those times are expressed in ticks of 1/100th of a second. Actually, they are expressed in "user jiffies".

  5. There are USER_HZ "jiffies" per second, and on x86 systems, USER_HZ is 100.

如下图所示

最终脚本如下:

  1. a1_user=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep user |awk '{print $2}'`

  2. a1_sys=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep sys | awk '{print $2}'`

  3. sleep 5

  4. a2_user=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep user |awk '{print $2}'`

  5. a2_sys=`cat /cgroup/cpuacct/docker/$i/cpuacct.stat | grep sys | awk '{print $2}'`

  6. cpuall=$((a2_user + a2_sys - a1_user - a1_sys))

  7. CPUSTAT=`echo "scale=2;$cpuall/5/100" |bc`

内存

  1. #@当前使用内存除以最大内存限制

  2. [root@BJ-YF-64-7 ~]#cat /cgroup/memory/docker/$DOCKERID/memory.limit_in_bytes

  3. 1073741824

  4. [root@BJ-YF-64-7 ~]#cat /cgroup/memory/docker/$DOCKERID/memory.usage_in_bytes

  5. 186269696

网络流量

  1. #@根据容器PID来获取该进程的网络状态

  2. PID=`docker inspect -f '{{.State.Pid}}' $i`

  3. a1_rx=`cat /proc/$PID/net/dev | grep eth1 |awk '{print $2}'`

网络连接数

  1. #@根据容器PID来获取该进程的网络状态

  2. cat /proc/$PID/net/tcp

四、 初步展示shell+InfluxDB+Grafana

使用Shell打印结果:

使用InfluxDB+ Grafana展示结果:

五、 接入PAAS平台

shell定时向PAAS推送数据。PAAS将数据存储于MySQL,并展示给用户。
都是实时数据,没有历史趋势图。

五、 接入Zabbix

数据展示问题解决了,那数据报警呢? Zabbix

Zabbix一台宿主机有N张图,容器1CPU、容器1内存、容器2CPU…

数据获取很复杂,很困难

每个容器都运行Zabbix
数据通过shell脚本打印到容器在宿主的映射目录

六 、自主开发监控系统

监控客户端hunter->监控数据存储端InfluxDB(触发器报警)->监控数据展示端PAAS

历史趋势图

建议继续学习

  1. Mysql监控指南 (阅读 21,101)
  2. 批量添加主机到cacti+nagios的监控报警系统中 (阅读 14,680)
  3. 我常用的主机监控shell脚本 (阅读 13,101)
  4. 7 天打造前端性能监控系统 (阅读 11,060)
  5. 如何监控HP服务器硬件状态 (阅读 10,503)
  6. Cacti 添加 Nginx 监控 (阅读 10,361)
  7. Linux下三种常用的流量监控软件对比 (阅读 9,980)
  8. Cacti 添加 Memcached 监控 (阅读 9,160)
  9. Cacti 添加 Apache 监控 (阅读 8,981)
  10. 你应该知道的16个Linux服务器监控命令 (阅读 8,403)