Docker 监控实战

现在,愈来愈多的公司开始使用 Docker 了,如今来给你们看几组数据:html

2 / 3 的公司在尝试了 Docker 后最终使用了它node

也就是说 Docker 的转化率达到了 67%,而转化市场也控制在 60 天内。git

Docker 监控实战

越大型的公司越早开始使用 Dockergithub

研究发现主机数量越多的公司,越早开始使用 Docker。而主机数量多,在这个研究里就默认等同因而大型公司了。web

Docker 监控实战

Docker 优点

那为何 Docker 愈来愈火呢?一谈起 Docker 老是会跟着让人联想到轻量这个词,甚至会有一种经过 Docker 启动一个服务会节省不少资源的错觉。然而 Docker 的「轻」也只是相对于传统虚拟机而已。mongodb

传统虚拟机和 Docker 的对好比图:docker

Docker 监控实战

从图中能够看出 Docker 和 虚拟机的差别,虚拟机的 Guest OS 和 Hypervisor 层在 Docker 中被 Docker Engine 层所替代,Docker 有着比虚拟机更少的抽象层。数据库

因为 Docker 不须要经过 Hypervisor 层实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用实际物理机的硬件资源。所以在 CPU、内存利用率上 Docker 略胜一筹。浏览器

Docker利用的是宿主机的内核,而不须要 Guest OS,所以,当新建一个容器时,Docker 不须要和虚拟机同样从新加载一个操做系统内核,所以新建一个 Docker 容器只须要几秒钟。tomcat

总结一下 Docker 容器相对于 VM 有如下几个优点:启动速度快、资源利用率高、性能开销小。

Docker 监控方案

那么,Docker 如何监控呢?可能具体问题要具体分析。可是彷佛你们都在使用开源的监控方案,来解决 Docker监控的问题。

就拿腾讯游戏来讲吧,咱们看看尹烨(腾讯互娱运营部高级工程师, 干货 | 腾讯游戏是如何使用 Docker 的? )怎么说:

容器的监控问题也花了咱们不少精力。监控、告警是运营系统最核心的功能之一,腾讯内部有一套很成熟的监控告警平台,并且开发运维同窗已经习惯这套平台,若是咱们针对 Docker 容器再开发一个监控告警平台,会花费不少精力,并且没有太大的意义。因此,咱们尽可能去兼容公司现有的监控告警平台。每一个容器内部会运行一个代理,从 /proc 下面获取 CPU、内存、IO 的信息,而后上报公司的监控告警平台。可是,默认状况下,容器内部的 proc 显示的是 Host 信息,咱们须要用 Host 上 cgroup 中的统计信息来覆盖容器内部的部分 proc 信息。咱们基于开源的 lxcfs,作了一些改造实现了这个需求。

Docker 监控实战

这些解决方案都是基于开源系统来实现的,固然,咱们也会把咱们本身以为有意义的修改回馈给社区,咱们给 Docker、Kubernetes 和 lxcfs 等开源项目贡献了一些 patch。融入社区,与社区共同发展,这是一件颇有意义的事情。

在没有专业运维团队来监控 Docker 的状况下,而且还想加快 Docker 监控的日程,怎么办呢?

为了可以更精确的分配每一个容器能使用的资源,咱们想要实时获取容器运行时使用资源的状况,怎样对 Docker 上的应用进行监控呢?Docker 的结构会不会加大监控难度?

咱们都了解, container 至关于小型 host,能够说存在于 hosts 与应用之间的监控盲区,不管是传统的基础组件监控仍是应用性能监控的方式,都很难有效地监控 Docker。了解了一下现有的 Docker 相关监测 App 和服务,包括简单的开源工具和复杂的企业总体解决方案,下面列举其中的几种做为参考:

1. cAdvisor

谷歌的 container introspection 解决方案是 cAdvisor,这是一个 Docker 容器内封装的实用工具,可以搜集、集料、处理和导出运行中的容器的信息。经过它能够看到 CPU 的使用率、内存使用率、网络吞吐量以及磁盘空间利用率。而后,你能够经过点击在网页顶部的 Docker Containers 连接,而后选择某个容器来详细了解它的使用状况。cAdvisor 部署和使用简单,但它只能够监视在同一个 host 上运行的容器,对多节点部署不是太管用。

2. Cloud Insight

在咱们列举的几个监控 Docker 的服务或平台中,这是惟一一款国内产品。Cloud Insight 支持多种操做系统、云主机、数据库和中间件的监控,原理是在平台服务仪表盘和自定义仪表盘中,采集并处理 Metric,对数据进行聚合与分组等计算,提供曲线图、柱状图等多样化的展示形式。优势是监控的指标很全,简单易用,但目前正式版还未上线,能够期待一下。

3. Scout

Scout 是一款监视服务,并非一个独立的开源项目。它有大量的插件,除了 Docker 信息还能够吸取其余有关部署的数据。所以 Scout 算是一站式监控系统,无需对系统的各类资源来安装各类不一样的监控系统。 Scout 的一个缺点是,它不显示有关每一个主机上单独容器的详细信息。此外,每一个监控的主机十美圆这样略微昂贵的价格也是是否选择 Scout 做为监控服务的一个考虑因素,若是运行一个有多台主机的超大部署,成本会比较高。

4. Sematext

Sematext 也是一款付费监控解决方案,计划收费方案是3.5美分/小时。一样也支持 Docker 监控,还包括对容器级事件的监测(中止、开始等等)和管理容器产生的日志。

Docker 监控实践

Prometheus

咱们先来讲说一套开源的 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 中设置。

若是你使用指标名字直接做为一个查询表达式,它将返回有这个使用这个指标名字做为标签的全部时间序列。

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"}  

...
...

若是你运行了许多容器,这个看起来像这样:

Docker 监控实战

为了帮助你使得这数据更有意义,你能够过滤(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 进行聚合。

Docker 监控实战

数据分组(切片)

根据不一样的 Container Name 或 Image Name 对内存使用量或 Memeory Cache进行分组(切片)。

Docker 监控实战

Docker 监控实战

单方面监控 Docker 可能并不太适合与业务挂钩的应用,当业务量上涨,不仅仅是 Docker 的负载上升,其余 JVM 指标也能也会出现上升的趋势。

咱们尝试使用一个支持比较多中间件、数据库、操做系统、容器的 Cloud Insight 来讲明这个实际的场景。

Cloud Insight

Cloud Insight 因为是一个 SaaS 监控方案,相对来讲它的安装和部署都比较简单。在此次监控实战中,咱们以 AcmeAir 为实验对象:一个能够模拟压力的电子商务类应用。ac

AcmeAir 是一款由原 IBM 新技术架构部资深工程师 Andrew Spyker,利用 Netflix 开源的 Netflix OSS 打造的开源电子商务应用。此应用具备以下特性:

  1. 模拟提供航班订票服务。用户能够经过移动设备或者 web 浏览器,完成新用户注册,用户登陆,航班查询,订票等操做。
  2. AcmeAir 融入了 Docker,微服务架构等理念。并采用 tomcat,node.js , WebSphere application server, WebSphere extreme scale, mongodb, cassandra 分别打造了不一样版本的实现。
  3. AcmeAir 利用 JMeter 模拟用户行为。可经过动态调整用户数量,模拟产生各类压力的事物流量。并可在应用中预先植入错误代码,模拟各类故障场景。该应用可作为压力测试,终端用户体验异常检测,故障诊断等各类测试场景的测试用例。

Docker 监控实战

首先,咱们要打开 Cloud Insight 监控,还好 Cloud Insight 安装简单,一条命令便可。接着,咱们新建一个用于这次监控的仪表盘,依次将想要获取的指标通通添加进去。好比,选中 jvm.non_heap_memory 这个指标,选择按照 instance 分组。

咱们添加如下指标:

docker.cpu.user
docker.cpu.sysytem
docker.containers.running
jvm.heap_memory
jvm.non_heap_memory
jvm.gc.cms.count
jvm.heap_memory_max
jvm.gc.parnew.time

添加后,由自定义仪表盘中的显示效果如图:

Docker 监控实战

应用 Acme 部署在四台 servers 上,咱们开启四台 servers, 而后用 JMeter 给应用加压。

Docker 监控实战

随着时间 JMeter 不断给应用加压,当 users 人数达到 188 时,咱们再来看一下仪表盘的视图。

Docker 监控实战

如图,性能数据发生了变化,根据 JMeter 里的数据,CPU 占用和错误率都有所提高;与此同时,根据 Cloud Insight 里的曲线显示,在指标 docker.cpu.user 这幅图中,蓝色的线所表明的 Container CPU 占用率已经超过 50%,逐渐接近 75%,系统剩余的 CPU 资源逐渐降低。

而指标 docker.cpu.system 图中一样能够看到蓝色的那条数据在 18:29 左右出现了一个波峰,表明系统 CPU 资源消耗忽然增大。经过这两幅图,咱们能够定位到 CPU 占用率太高的 Container ,及时而主动地去了解性能瓶颈,从而优化性能,合理分配资源。

再看 jvm.heap_memory 指标,图中几条曲线在 18:20 以后逐渐升高,黄色曲线在 18:28 左右出现波峰,浅蓝色曲线数值较高,用 jvm.heap_memory 的值去比左图 jvm.heap_memory_max 的值,将能更清楚的反映 JVM 堆内存的消耗状况。

jvm.gc.parnew.time 图中显示了新生代并行 GC 的时间数据。GC 是须要时间和资源的,很差的 GC 会严重影响系统的系能,良好的 GC 是 JVM 高性能的保证。

没法被监控的软件是很危险的,经过解读这张 Docker 仪表盘总览图,咱们能够了解到 Docker 实时性能情况,精准定位到性能薄弱的环节,从而优化咱们的应用。

总结

Docker 兼容相比其余的数据库、系统、中间件监控,要复杂一些。因为须要表征不一样 Container 的性能消耗,来了解不一样应用的运行状况,因此数据的聚合、切片(分组)和过滤,在 Docker 监控中成为了必备功能。

因此咱们推荐使用了时间序列数据库,或者相似设计逻辑的监控方案,如:Prometheus 和 Cloud Insight。

而 Docker 单方面的监控,可能不太知足一些大型公司的需求,若是一个工具在监控 Docker 同时可以监控其余组件,那就更好了。

国外出现了 Graphite、Grafana 和 Host Graphite,可以让用户将不一样数据来源都集中在同一个地方进行展示;而国内 Cloud Insight 彷佛也是这样的思路。

相关文章
相关标签/搜索