現在,愈來愈多的公司開始使用 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 安裝簡單,一條命令便可。接着,咱們新建一個用於這次監控的儀表盤,依次將想要獲取的指標通通添加進去。
咱們添加了如下指標:
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
應用 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 彷佛也是這樣的思路。