Linux性能優化實戰學習筆記:第五十四講

1、上節回顧

上一節,我帶你學習了,如何使用 USE 法來監控系統的性能,先簡單回顧一下。網絡

系統監控的核心是資源的使用狀況,這既包括 CPU、內存、磁盤、文件系統、網絡等硬件資源,也包括文件描述符數、鏈接數、鏈接跟蹤數等軟件資源。而要描述這些資源瓶頸,最簡單有效的
方法就是 USE 法。架構

USE 法把系統資源的性能指標,簡化爲了三個類別:使用率、飽和度以及錯誤數。 當這三者之中任一類別的指標太高時,都表明相對應的系統資源可能存在性能瓶頸。分佈式

基於 USE 法創建性能指標後,咱們還須要經過一套完整的監控系統,把這些指標從採集、存儲、查詢、處理,再到告警和可視化展現等貫穿起來。這樣,不只能夠將系統資源的瓶頸快速暴露出
來,還能夠藉助監控的歷史數據,來追蹤定位性能問題的根源。函數

除了上一節講到的系統資源須要監控以外,應用程序的性能監控,固然也是必不可少的。今天,我就帶你一塊兒來看看,如何監控應用程序的性能。微服務

2、指標監控

跟系統監控同樣,在構建應用程序的監控系統以前,首先也須要肯定,到底須要監控哪些指標。特別是要清楚,有哪些指標能夠用來快速確認應用程序的性能問題。工具

對系統資源的監控,USE 法簡單有效,卻不表明其適合應用程序的監控。舉個例子,即便在 CPU使用率很低的時候,也不能說明應用程序就沒有性能瓶頸。由於應用程序可能會由於鎖或者 RPC
調用等,致使響應緩慢。性能

因此,應用程序的核心指標,再也不是資源的使用狀況,而是請求數、錯誤率和響應時間。這些指標不只直接關係到用戶的使用體驗,還反映應用總體的可用性和可靠性。學習

有了請求數、錯誤率和響應時間這三個黃金指標以後,咱們就能夠快速知道,應用是否發生了性能問題。可是,只有這些指標顯然仍是不夠的,由於發生性能問題後,咱們還但願可以快速定
位「性能瓶頸區」。因此,在我看來,下面幾種指標,也是監控應用程序時必不可少的。搜索引擎

第一個,是應用進程的資源使用狀況,好比進程佔用的 CPU、內存、磁盤 I/O、網絡等。使用過多的系統資源,致使應用程序響應緩慢或者錯誤數升高,是一個最多見的性能問題。spa

第二個,是應用程序之間調用狀況,好比調用頻率、錯誤數、延時等。因爲應用程序並非孤立的,若是其依賴的其餘應用出現了性能問題,應用自身性能也會受到影響。

第三個,是應用程序內部核心邏輯的運行狀況,好比關鍵環節的耗時以及執行過程當中的錯誤等。因爲這是應用程序內部的狀態,從外部一般沒法直接獲取到詳細的性能數據。因此,應用程序在
設計和開發時,就應該把這些指標提供出來,以便監控系統能夠了解其內部運行狀態。

有了應用進程的資源使用指標,你就能夠把系統資源的瓶頸跟應用程序關聯起來,從而迅速定位因系統資源不足而致使的性能問題;

  1. 有了應用程序之間的調用指標,你能夠迅速分析出一個請求處理的調用鏈中,到底哪一個組件纔是致使性能問題的罪魁禍首;
  2. 而有了應用程序內部核心邏輯的運行性能,你就能夠更進一步,直接進入應用程序的內部,定位究竟是哪一個處理環節的函數致使了性能問題。

基於這些思路,我相信你就能夠構建出,描述應用程序運行狀態的性能指標。再將這些指標歸入咱們上一期提到的監控系統(好比 Prometheus + Grafana)中,就能夠跟系統監控同樣,一方
面經過告警系統,把問題及時彙報給相關團隊處理;另外一方面,經過直觀的圖形界面,動態展現應用程序的總體性能。

除此以外,因爲業務系統一般會涉及到一連串的多個服務,造成一個複雜的分佈式調用鏈。爲了迅速定位這類跨應用的性能瓶頸,你還可使用 Zipkin、Jaeger、Pinpoint 等各種開源工具,
來構建全鏈路跟蹤系統。

好比,下圖就是一個 Jaeger 調用鏈跟蹤的示例。

全鏈路跟蹤能夠幫你迅速定位出,在一個請求處理過程當中,哪一個環節纔是問題根源。好比,從上圖中,你就能夠很容易看到,這是 Redis 超時致使的問題。

全鏈路跟蹤除了能夠幫你快速定位跨應用的性能問題外,還能夠幫你生成線上系統的調用拓撲圖。這些直觀的拓撲圖,在分析複雜系統(好比微服務)時尤爲有效

3、日誌監控

性能指標的監控,可讓你迅速定位發生瓶頸的位置,不過只有指標的話每每還不夠。好比,一樣的一個接口,當請求傳入的參數不一樣時,就可能會致使徹底不一樣的性能問題。因此,除了指標
外,咱們還須要對這些指標的上下文信息進行監控,而日誌正是這些上下文的最佳來源。對比來看,

  1. 指標是特定時間段的數值型測量數據,一般以時間序列的方式處理,適合於實時監控。
  2. 而日誌則徹底不一樣,日誌都是某個時間點的字符串消息,一般須要對搜索引擎進行索引後,才能進行查詢和彙總分析。

對日誌監控來講,最經典的方法,就是使用 ELK 技術棧,即便用 Elasticsearch、Logstash 和Kibana 這三個組件的組合。

以下圖所示,就是一個經典的 ELK 架構圖:

 

 

這其中,

  1. Logstash 負責對從各個日誌源採集日誌,而後進行預處理,最後再把初步處理過的日誌,發送給 Elasticsearch 進行索引。
  2. Elasticsearch 負責對日誌進行索引,並提供了一個完整的全文搜索引擎,這樣就能夠方便你從日誌中檢索須要的數據。
  3. Kibana 則負責對日誌進行可視化分析,包括日誌搜索、處理以及絢麗的儀表板展現等。

下面這張圖,就是一個 Kibana 儀表板的示例,它直觀展現了 Apache 的訪問概況。

值得注意的是,ELK 技術棧中的 Logstash 資源消耗比較大。因此,在資源緊張的環境中,咱們每每使用資源消耗更低的 Fluentd,來替代 Logstash(也就是所謂的 EFK 技術棧)。

4、小結

今天,我爲你梳理了應用程序監控的基本思路。應用程序的監控,能夠分爲指標監控和日誌監控兩大部分:

  1. 指標監控主要是對必定時間段內性能指標進行測量,而後再經過時間序列的方式,進行處理、存儲和告警。
  2. 日誌監控則能夠提供更詳細的上下文信息,一般經過 ELK 技術棧來進行收集、索引和圖形化展現。

在跨多個不一樣應用的複雜業務場景中,你還能夠構建全鏈路跟蹤系統。這樣能夠動態跟蹤調用鏈中各個組件的性能,生成整個流程的調用拓撲圖,從而加快定位複雜應用的性能問題。

相關文章
相關標籤/搜索