Docker 監控實戰

OneAPM官方技術部落格發表於2015-11-27

如今,越來越多的公司開始使用 Docker 了,現在來給大家看幾組資料:

2 / 3 的公司在嘗試了 Docker 後最終使用了它

也就是說 Docker 的轉化率達到了 67%,而轉化時長也控制在 60 天內。

Docker 監控實戰

越大型的公司越早開始使用 Docker

研究發現主機數量越多的公司,越早開始使用 Docker。而主機數量多,在這個研究裡就預設等同於是大型公司了。

Docker 監控實戰

Docker 優勢

那為什麼 Docker 越來越火呢?一談起 Docker 總是會跟著讓人聯想到輕量這個詞,甚至會有一種通過 Docker 啟動一個服務會節省很多資源的錯覺。然而 Docker 的「輕」也只是相對於傳統虛擬機器而已。

傳統虛擬機器和 Docker 的對比如圖:

Docker 監控實戰

從圖中可以看出 Docker 和 虛擬機器的差異,虛擬機器的 Guest OS 和 Hypervisor 層在 Docker 中被 Docker Engine 層所替代,Docker 有著比虛擬機器更少的抽象層。

由於 Docker 不需要通過 Hypervisor 層實現硬體資源虛擬化,執行在 Docker 容器上的程式直接使用實際物理機的硬體資源。因此在 CPU、記憶體利用率上 Docker 略勝一籌。

Docker利用的是宿主機的核心,而不需要 Guest OS,因此,當新建一個容器時,Docker 不需要和虛擬機器一樣重新載入一個作業系統核心,因此新建一個 Docker 容器只需要幾秒鐘。

總結一下 Docker 容器相對於 VM 有以下幾個優勢:啟動速度快、資源利用率高、效能開銷小。

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 為實驗物件:一個可以模擬壓力的電子商務類應用。

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 似乎也是這樣的思路。

相關文章