上一節,我帶你學習了,如何使用 USE 法來監控系統的性能,先簡單回顧一下。網絡
系統監控的核心是資源的使用狀況,這既包括 CPU、內存、磁盤、文件系統、網絡等硬件資源,也包括文件描述符數、鏈接數、鏈接跟蹤數等軟件資源。而要描述這些資源瓶頸,最簡單有效的
方法就是 USE 法。架構
USE 法把系統資源的性能指標,簡化爲了三個類別:使用率、飽和度以及錯誤數。 當這三者之中任一類別的指標太高時,都表明相對應的系統資源可能存在性能瓶頸。分佈式
基於 USE 法創建性能指標後,咱們還須要經過一套完整的監控系統,把這些指標從採集、存儲、查詢、處理,再到告警和可視化展現等貫穿起來。這樣,不只能夠將系統資源的瓶頸快速暴露出
來,還能夠藉助監控的歷史數據,來追蹤定位性能問題的根源。函數
除了上一節講到的系統資源須要監控以外,應用程序的性能監控,固然也是必不可少的。今天,我就帶你一塊兒來看看,如何監控應用程序的性能。微服務
跟系統監控同樣,在構建應用程序的監控系統以前,首先也須要肯定,到底須要監控哪些指標。特別是要清楚,有哪些指標能夠用來快速確認應用程序的性能問題。工具
對系統資源的監控,USE 法簡單有效,卻不表明其適合應用程序的監控。舉個例子,即便在 CPU使用率很低的時候,也不能說明應用程序就沒有性能瓶頸。由於應用程序可能會由於鎖或者 RPC
調用等,致使響應緩慢。性能
因此,應用程序的核心指標,再也不是資源的使用狀況,而是請求數、錯誤率和響應時間。這些指標不只直接關係到用戶的使用體驗,還反映應用總體的可用性和可靠性。學習
有了請求數、錯誤率和響應時間這三個黃金指標以後,咱們就能夠快速知道,應用是否發生了性能問題。可是,只有這些指標顯然仍是不夠的,由於發生性能問題後,咱們還但願可以快速定
位「性能瓶頸區」。因此,在我看來,下面幾種指標,也是監控應用程序時必不可少的。搜索引擎
第一個,是應用進程的資源使用狀況,好比進程佔用的 CPU、內存、磁盤 I/O、網絡等。使用過多的系統資源,致使應用程序響應緩慢或者錯誤數升高,是一個最多見的性能問題。spa
第二個,是應用程序之間調用狀況,好比調用頻率、錯誤數、延時等。因爲應用程序並非孤立的,若是其依賴的其餘應用出現了性能問題,應用自身性能也會受到影響。
第三個,是應用程序內部核心邏輯的運行狀況,好比關鍵環節的耗時以及執行過程當中的錯誤等。因爲這是應用程序內部的狀態,從外部一般沒法直接獲取到詳細的性能數據。因此,應用程序在
設計和開發時,就應該把這些指標提供出來,以便監控系統能夠了解其內部運行狀態。
有了應用進程的資源使用指標,你就能夠把系統資源的瓶頸跟應用程序關聯起來,從而迅速定位因系統資源不足而致使的性能問題;
基於這些思路,我相信你就能夠構建出,描述應用程序運行狀態的性能指標。再將這些指標歸入咱們上一期提到的監控系統(好比 Prometheus + Grafana)中,就能夠跟系統監控同樣,一方
面經過告警系統,把問題及時彙報給相關團隊處理;另外一方面,經過直觀的圖形界面,動態展現應用程序的總體性能。
除此以外,因爲業務系統一般會涉及到一連串的多個服務,造成一個複雜的分佈式調用鏈。爲了迅速定位這類跨應用的性能瓶頸,你還可使用 Zipkin、Jaeger、Pinpoint 等各種開源工具,
來構建全鏈路跟蹤系統。
好比,下圖就是一個 Jaeger 調用鏈跟蹤的示例。
全鏈路跟蹤能夠幫你迅速定位出,在一個請求處理過程當中,哪一個環節纔是問題根源。好比,從上圖中,你就能夠很容易看到,這是 Redis 超時致使的問題。
全鏈路跟蹤除了能夠幫你快速定位跨應用的性能問題外,還能夠幫你生成線上系統的調用拓撲圖。這些直觀的拓撲圖,在分析複雜系統(好比微服務)時尤爲有效
性能指標的監控,可讓你迅速定位發生瓶頸的位置,不過只有指標的話每每還不夠。好比,一樣的一個接口,當請求傳入的參數不一樣時,就可能會致使徹底不一樣的性能問題。因此,除了指標
外,咱們還須要對這些指標的上下文信息進行監控,而日誌正是這些上下文的最佳來源。對比來看,
對日誌監控來講,最經典的方法,就是使用 ELK 技術棧,即便用 Elasticsearch、Logstash 和Kibana 這三個組件的組合。
以下圖所示,就是一個經典的 ELK 架構圖:
這其中,
下面這張圖,就是一個 Kibana 儀表板的示例,它直觀展現了 Apache 的訪問概況。
值得注意的是,ELK 技術棧中的 Logstash 資源消耗比較大。因此,在資源緊張的環境中,咱們每每使用資源消耗更低的 Fluentd,來替代 Logstash(也就是所謂的 EFK 技術棧)。
今天,我爲你梳理了應用程序監控的基本思路。應用程序的監控,能夠分爲指標監控和日誌監控兩大部分:
在跨多個不一樣應用的複雜業務場景中,你還能夠構建全鏈路跟蹤系統。這樣能夠動態跟蹤調用鏈中各個組件的性能,生成整個流程的調用拓撲圖,從而加快定位複雜應用的性能問題。