现在,愈来愈多的公司开始使用 Docker 了,2 / 3 的公司在尝试了 Docker 后最终使用了它。为了可以更精确的分配每一个容器能使用的资源,咱们想要实时获取容器运行时使用资源的状况,怎样对 Docker 上的应用进行监控呢?Docker 的结构会不会加大监控难度?html
但是在没有专业运维团队来监控 Docker 的状况下,而且还想加快 Docker 监控的日程,怎么办呢?node
咱们经过调查了解到几种不错的 Docker 监控方法,其中 Prometheus 和 Cloud Insight 让人很感兴趣。docker
先来讲说一套开源的 Docker 监控方案:Prometheus;而此篇文字的原文地址:Monitor Docker Containers with Prometheus。数据库
Prometheus 由 SoundCloud 发明,适合于监控基于容器的基础架构。Prometheus 特色是高维度数据模型,时间序列是经过一个度量值名字和一套键值对识别。灵活的查询语言容许查询和绘制数据。它采用了先进的度量标准类型像汇总(summaries),从指定时间跨度的总数构建比率或者是在任何异常的时候报警而且没有任何依赖,中断期间使它成为一个可靠的系统进行调试。架构
Prometheus 支持维度数据,你能够拥有全局和简单的指标名像 container_memory_usage_bytes
,使用多个维度来标识你服务的指定实例。运维
我已经建立了一个简单的 container-exporter
来收集 Docker 容器的指标以及输出给 Prometheus 来消费。这个输出器使用容器的名字,id 和 镜像做为维度。额外的 per-exporter
维度能够在 prometheus.conf
中设置。jvm
若是你使用指标名字直接做为一个查询表达式,它将返回有这个使用这个指标名字做为标签的全部时间序列。工具
container_memory_usage_bytes{env="prod",id="23f731ee29ae12fef1ef6726e2fce60e5e37342ee9e35cb47e3c7a24422f9e88",instance="http://1.2.3.4:9088/metrics",job="container-exporter",name="haproxy-exporter-int",image="prom/haproxy-exporter:latest"} 11468800.000000
性能
container_memory_usage_bytes{env="prod",id="57690ddfd3bb954d59b2d9dcd7379b308fbe999bce057951aa3d45211c0b5f8c",instance="http://1.2.3.5:9088/metrics",job="container-exporter",name="haproxy-exporter",image="prom/haproxy-exporter:latest"} 16809984.000000
优化
container_memory_usage_bytes{env="prod",id="907ac267ebb3299af08a276e4ea6fd7bf3cb26632889d9394900adc832a302b4",instance="http://1.2.3.2:9088/metrics",job="container-exporter",name="node-exporter",image="prom/container-exporter:latest"}
... ...
若是你运行了许多容器,这个看起来像这样:
为了帮助你使得这数据更有意义,你能够过滤(filter) and/or 聚合(aggregate) 这些指标。
使用 Prometheus 的查询语言,你能够对你想的任何维度的数据切片和切块。若是你对一个给定名字的全部容器感兴趣,你可使用一个表达式像 container_memory_usage_bytes{name="consul-server"}
,这个将仅仅显示 name == "consul-server"
的时间序列。
像多维度的数据模型,来实现数据聚合、分组、过滤,不仅仅是 Prometheus。OpenTSDB 和 InfluxDB 这些时间序列数据库和系统监控工具的结合,让系统监控这件事情变得更加的多元。
接下来,咱们为你们介绍国内一家一样提供该功能的监控方案:Cloud Insight。有关其数据聚合的功能能够阅读:数据聚合 & 分组:新一代系统监控的核心功能。
如今咱们来对比 Prometheus 和 Cloud Insight 在数据聚合、分组(切片)上的展示效果和功能。
###数据聚合
根据不一样的 Container Name 或 Image Name 对内存使用量或 Memeory Cache 进行聚合。
###数据分组(切片)
根据不一样的 Container Name 或 Image Name 对内存使用量或 Memeory Cache进行分组(切片)。
Cloud Insight 支持多种操做系统、云主机、数据库和中间件的监控,原理是在平台服务仪表盘和自定义仪表盘中,采集并处理 Metric,对数据进行聚合与分组等计算,提供曲线图、柱状图等多样化的展示形式。优势是监控的指标很全,简单易用,也能够期待一下。
Cloud Insight 监控 Docker 试验
咱们用 AcmeAir 做为试验的应用,AcmeAir 是一款由原 IBM 新技术架构部资深工程师 Andrew Spyker,利用 Netflix 开源的 Netflix OSS 打造的开源电子商务应用。
首先,咱们要打开 Cloud Insight 监控,还好 Cloud Insight 安装简单,一条命令便可。接着,咱们新建一个用于这次监控的仪表盘,依次将想要获取的指标通通添加进去。
咱们添加了如下指标:
应用 Acme 部署在四台 servers 上,咱们开启四台 servers, 而后用 JMeter 给应用加压。
随着时间 JMeter 不断给应用加压,当 users 人数达到188时,咱们再来看一下仪表盘的视图。
从图中能够看到,性能数据发生了变化,根据 JMeter 里的数据,此时 CPU 占用超过了50%,错误率也有所提高;对比来看,根据 Cloud Insight 里的曲线显示,蓝色的线所表明的 Container CPU 占用率已经超过50%,逐渐接近75%,系统剩余的 CPU 资源逐渐降低,该 Container 的系统 CPU 资源消耗也忽然增大。咱们能够经过这些定位到 CPU 占用率太高的 Container ,及时而主动地去了解性能瓶颈,从而优化性能,合理分配资源。Cloud Insight 所抓取的性能指标算是较为全面,部署和展示方式都是至关简单易懂的。
Docker 兼容相比其余的数据库、系统、中间件监控,要复杂一些。因为须要表征不一样 Container 的性能消耗,来了解不一样应用的运行状况,因此数据的聚合、切片(分组)和过滤,在 Docker 监控中成为了必备功能。
因此咱们推荐使用了时间序列数据库,或者相似设计逻辑的监控方案,如:Prometheus 和 Cloud Insight。
而 Docker 单方面的监控,可能不太知足一些大型公司的需求,若是一个工具在监控 Docker 同时可以监控其余组件,那就更好了。
国外出现了 Graphite、Grafana 和 Host Graphite,可以让用户将不一样数据来源都集中在同一个地方进行展示;而国内 Cloud Insight 彷佛也是这样的思路。