架構師成長之路4.2-多維監控體系_系統監控

點擊返回架構師成長之路html

架構師成長之路4.2-多維監控體系_系統監控

監控入門:linux

  • 識別監控對象:
  • 監控對象的理解:CPU工做原理  
  • 監控對象的指標:CPU使用率、CPU負載 、CPU個數、 CPU上下文切換
  • 確認告警基準線:怎麼樣纔算故障?CPU負載多少纔算高?

預中級監控須要作:sql

  • 工具化和監控分離
  • 監控對象的分類:
    硬件監控(機房巡檢、IPMI、SNMP) 
    系統監控(對象:CPU、內存、IO[磁盤、網絡]、進程等)
    服務監控(對象:各種服務[Nginx|Tomcat|RabbitMQ|Openstack|Mysql|*])
    日誌監控(方法:Elastic Stack)
    網絡監控(方法:第三方、Smokeping)
    APM應用性能管理(工具:PINPoint)
    流量監控(工具:Piwik、xx統計、xx分析)
    其餘監控(APP監控、安全監控、業務監控、輿論監控、xx監控)
  • 掌握一個監控工具:好比zabbix

中級監控須要作數據庫

  • 標準化監控(標準化的腳本、模板等等)
  • 分佈式監控(主動、被動、分佈式)
  • 自動化監控(自動發現、主動註冊[Agent主動註冊、Server經過API主動添加])
  • 性能優化(數據採集、數據存儲、數據查詢)
  • 二次開發(定製報表、API調用、xxx)

進階監控須要作:安全

    • 動態告警
    • 智能告警:1.告警去重 2.去除依賴性
    • 故障自愈
    • 大規模監控

系統監控

1  系統監控_CPU

1.1  CPU三個重要的概念

    [A] 上下文切換: 性能優化

         目前流行的CPU在同一時間內只能運行一個線程,超線程的處理器能夠在同一時間運行多個線程(包括多核CPU),Linux內核會把多核  的處理器看成多個單獨的CPU來識別。
         一個標準的Linux內核能夠支持運行50~50000個進程運行,對於普通的CPU,內核會調度和執行這些進程。每一個進程都會分到CPU的時間片來運行,當一個進程用完時間片或者被更高優先級的進程搶佔後,它會備份 到CPU的運行隊列中,同時其餘進程在CPU上運行。這個進程切換的過程被稱做上下文切 換。過多的上下文切換會形成系統很大的開銷。網絡

   [B]  運行隊列(負載):
數據結構

          每一個CPU都會維持一個運行隊列,理想狀況下,調度器會不斷讓隊列中的進程運行。進程不是處在sleep狀態就是runable狀態。若是CPU過載,就會出現調度器跟不上系統的要求,致使可運行的進程會填滿隊列。隊列愈大,程序執行時間就愈長。多線程

   補充:關於時間片和動態優先級架構

          時間片對於CPU來講是很關鍵的參數,若是時間片太長,就會使系統的交互性能變差,用戶感受不到並行。若是過短,又會形成系統頻繁的上下文切換,使性能 降低。對於IO Bound的系統來說並不須要太長的  時間片,由於系統主要是IO操做;而對於CPU Bound的系統來講須要長的時間片以保持cache的有效性。
           每個進程啓動的時候系統都會給出一個默認的優先級,但在運行過程當中,系統會根據進程的運行情況不斷調整優先級,內核會升高或下降進程的優先級(每次增長或下降5),判斷標準是根據進程處於sleep狀態的時間。
           IO Bound進程大部分時間在sleep狀態,因此內核會調高它的優先級,CPU Bound進程會被內核懲罰下降優先級。所以,若是一個系統上即運行IO Bound進程,又運行CPU Bound進程,會發現,IO Bound進程的性能不會降低,而CPU Bound進程性能會不斷降低。

   [C] CPU使用率:

         CPU使用的百分比。對於上下文切換要結合CPU使用率來看,若是CPU使用知足上述分佈,大量的上下文切換也是能夠接受的。

    補充:內核態與用戶態

     intel x86 CPU有四種不一樣的執行級別0-3,linux只使用了其中的0級和3級分別來表示內核態和用戶態。
     內核態與用戶態是操做系統的兩種運行級別。

  • 當程序運行在3級特權級上時,就能夠稱之爲運行在用戶態,由於這是最低特權級,是普通的用戶進程運行的特權級,大部分用戶直接面對的程序都是運行在用戶態;
  • 當程序運行在0級特權級上時,就能夠稱之爲運行在內核態。

     運行在用戶態下的程序不能直接訪問操做系統內核數據結構和程序。
     當咱們在系統中執行一個程序時,大部分時間是運行在用戶態下的,在其須要操做系統幫助完成某些它沒有權力和能力完成的工做時就會切換到內核態。 
     這兩種狀態的主要差異是:

  • 處於用戶態執行時,進程所能訪問的內存空間和對象受到限制,其所處於佔有的處理機是可被搶佔的 ;
  • 而處於核心態執行中的進程,則能訪問全部的內存空間和對象,且所佔有的處理機是不容許被搶佔的。

    補充:用戶態和內核態的轉換 

    1)用戶態切換到內核態的3種方式

  • 系統調用
    這是用戶態進程主動要求切換到內核態的一種方式,用戶態進程經過系統調用申請使用操做系統提供的服務程序完成工做,好比前例中fork()實際上就是執行了一個建立新進程的系統調用。而系統調用的機制其核心仍是使用了操做系統爲用戶特別開放的一箇中斷來實現,例如Linux的int 80h中斷。
  • 異常
    當CPU在執行運行在用戶態下的程序時,發生了某些事先不可知的異常,這時會觸發由當前運行進程切換處處理此異常的內核相關程序中,也就轉到了內核態,好比缺頁異常。
  • 外圍設備的中斷
    當外圍設備完成用戶請求的操做後,會向CPU發出相應的中斷信號,這時CPU會暫停執行下一條即將要執行的指令轉而去執行與中斷信號對應的處理程序,若是先前執行的指令是用戶態下的程序,那麼這個轉換的過程天然也就發生了由用戶態到內核態的切換。好比硬盤讀寫操做完成,系統會切換到硬盤讀寫的中斷處理程序中執行後續操做等。

       這3種方式是系統在運行時由用戶態轉到內核態的最主要方式,其中系統調用能夠認爲是用戶進程主動發起的,異常和外圍設備中斷則是被動的。

    2)具體的切換操做

         從觸發方式上看,能夠認爲存在前述3種不一樣的類型,可是從最終實際完成由用戶態到內核態的切換操做上來講,涉及的關鍵步驟是徹底一致的,沒有任何區別,都至關於執行了一箇中斷響應的過程,由於系統調用實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,關於它們的具體區別這裏再也不贅述。關於中斷處理機制的細節和步驟這裏也不作過多分析,涉及到由用戶態切換到內核態的步驟主要包括:

  • 從當前進程的描述符中提取其內核棧的ss0及esp0信息。
  • 使用ss0和esp0指向的內核棧將當前進程的cs,eip,eflags,ss,esp信息保存起來,這個過程也完成了由用戶棧到內核棧的切換過程,同時保存了被暫停執行的程序的下一條指令。
  • 將先前由中斷向量檢索獲得的中斷處理程序的cs,eip信息裝入相應的寄存器,開始執行中斷處理程序,這時就轉到了內核態的程序執行了。

1.2  肯定服務類型

  【A】CPU密集型(CPU-bound)
       CPU密集型也叫計算密集型,指的是系統的硬盤、內存性能相對CPU要好不少,此時,系統運做大部分的情況是CPU Loading 100%,CPU要讀/寫I/O(硬盤/內存),I/O在很短的時間就能夠完成,而CPU還有許多運算要處理,CPU Loading很高。
       在多重程序系統中,大部份時間用來作計算、邏輯判斷等CPU動做的程序稱之CPU bound。例如一個計算圓周率至小數點一千位如下的程序,在執行的過程中絕大部份時間用在三角函數和開根號的計算,即是屬於CPU bound的程序。
      CPU bound的程序通常而言CPU佔用率至關高。這多是由於任務自己不太須要訪問I/O設備,也多是由於程序是多線程實現所以屏蔽掉了等待I/O的時間。

【B】IO密集型(I/O bound)
      IO密集型指的是系統的CPU性能相對硬盤、內存要好不少,此時,系統運做,大部分的情況是CPU在等I/O (硬盤/內存) 的讀/寫操做,此時CPU Loading並不高。
      I/O bound的程序通常在達到性能極限時,CPU佔用率仍然較低。這多是由於任務自己須要大量I/O操做,而pipeline作得不是很好,沒有充分利用處理器能力。

  CPU密集型適合C語言多線程,I/O密集型適合腳本語言開發的多線程。

1.3  肯定性能基準線

 經驗總結:

  • 運行隊列: 對於每個CPU來講運行隊列1~3
      若1CPU,4核,負載不超過12
  • CPU使用:若是CPU在滿負荷運行,應該符合下列分佈:
      User Time用戶態利用率:65%~70%       
      System Time內核態利用率:30%~35%       
      Idle空閒:0%~5%
  • 上下文切換: 

 1.4   CPU監控工具

【A】top 命令

   P CPU使用率排序
   W 內存使用率排序

 

【B】sysstat工具包

 

   vmstat(Virtual Memory Statistics 虛擬內存統計) 命令用來顯示Linux系統虛擬內存狀態,也能夠報告關於進程、內存、I/O等系統總體運行狀態。

  • -a:顯示活躍和非活躍內存
  • -f:顯示從系統啓動至今的fork數量 。
  • -m:顯示slabinfo
  • -n:只在開始時顯示一次各字段名稱。
  • -s:顯示內存相關統計信息及多種系統活動數量。
  • delay:刷新時間間隔。若是不指定,只顯示一條結果。
  • count:刷新次數。若是不指定刷新次數,但指定了刷新時間間隔,這時刷新次數爲無窮。
  • -d:顯示磁盤相關統計信息。
  • -p:顯示指定磁盤分區統計信息
  • -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別表明1000、102四、1000000、1048576字節(byte)。默認單位爲K(1024 bytes)
  • -V:顯示vmstat版本信息。

    mpstat:其報告與CPU的一些統計信息,這些信息存放在/proc/stat文件中。在多CPUs系統裏,其不但能查看全部CPU的平均情況信息,並且可以查看特定CPU的信息。

  • -P {|ALL} 表示監控哪一個CPU,cpu在[0,cpu個數-1]中取值
  • internal 相鄰的兩次採樣的間隔時間
  • count採樣的次數,count只能和delay一塊兒使用
  • 當沒有參數時,mpstat則顯示系統啓動之後全部信息的平均值。有interval時,第一行的信息自系統啓動以來的平均信息。

2  系統監控_內存

    分紅頁  每頁4KB

2.1  內存兩個重要的概念

    [A] 內存尋址:

    內存尋址是指CPU容許支持的內存大小。雙通道內存技術實際上是一種內存控制和管理技術,它依賴於芯片組的內存控制器發生做用,在理論上可以使兩條同等規格內存所提供的帶寬增加一倍。當計算機面臨大量的數據流時,32位的寄存器和指令集不能及時進行相應的處理運算。

  • 32位處理器一次只能處理32位,也就是4個字節的數據;
  • 64位處理器一次就能處理64位,即8個字節的數據。

   計算機管理內存的基本方式有兩種:段式管理和頁式管理。

  • CPU段式管理:段式管理的基本原理是指把一個程序分紅若干個段(segment)進行存儲,每一個段都是一個邏輯實體(logical entity)。一個用戶 做業或進程所包含的段對應一個二維線形虛擬空間,程序經過分段(segmentation)劃分爲多個模塊,故能夠對程序的各個模塊分別編寫和編譯。段式管理程序以段爲單位分配內存,而後經過地址影射機構把段式虛擬地址轉換爲虛擬地址。
  • CPU頁式管理:頁式管理的基本原理將各進程的虛擬空間劃分紅若干個長度相等的頁(通常爲4K),頁式管理把內存空間按頁的大小劃分紅片或者頁面(page frame),而後把頁式虛擬地址與內存地址創建一一對應頁表,並用相應的硬件地址變換機構,來解決離散地址變換問題。

       而在使用80x86微處理器時,內存地址分爲三個不一樣的地址:邏輯地址,線性地址,物理地址。

  • 邏輯地址:包含在機器語言指令中用來指定一個操做數或一條指令的地址,每一個邏輯地址都由一個段和偏移量組成,表示爲[段標識符:段內偏移量]。例如,在C/C++程序中咱們使用指針對變量地址操做,該地址就是邏輯地址(準確的應該說是邏輯地址的段內偏移量)。對應上述段式管理,邏輯地址是段式管理轉換前的程序地址。

  • 線性地址:也稱爲虛擬地址,它是一個32位無符號整數,故能夠用來表達高達4GB的地址。線性地址同邏輯地址同樣也是不真實的地址。對應上述頁式管理,線性地址是頁式管理轉換前的地址。
  • 物理地址:用於內存芯片級內存單元尋址,與處理器和CPU鏈接的地址總線相對應。通常狀況下,咱們說的計算機內存條中的內存就是它(雖然不許確)。
       顯然,CPU將一個虛擬內存空間中的地址轉換爲物理地址,須要進行兩步:
  • 首先將給定一個邏輯地址,CPU要利用其段式內存管理單元,先將每一個邏輯地址轉換成一個線程地址,
  • 再利用其頁式內存管理單元,轉換爲最終物理地址。
      這就是咱們所知道的段頁式管理,這樣兩次轉換的好處能夠克服段式管理和頁式管理的缺點。

    [B] 內存空間:

      內存是計算機系統中一個主要部件, 用於保存進程運行時的程序和數據,也稱可執行存儲器。在計算機中,內存空間通常是指主存儲器空間(物理地址空間)或系統爲一個用戶程序分配內存空間。擴展內存空間的方法通常有增長內存大小和虛擬內存。

2.2   內存監控工具

free命令

 

3  系統監控_硬盤

     IOPS IOPS(Input/Output Operations Per Second)是一個用於計算機存儲設備(如硬盤(HDD)、固態硬盤(SSD)或存儲區域網絡(SAN))性能測試的量測方式,能夠視爲是每秒的讀寫次數。

    隨機訪問(隨機IO)、順序訪問(順序IO

  • 隨機訪問的特色是每次IO請求的數據在磁盤上的位置跨度很大(如:分佈在不一樣的扇區),所以N個很是小的IO請求(如:1K),必須以N次IO請求才能獲取到相應的數據。
  • 順序訪問的特色跟隨機訪問相反,它請求的數據在磁盤的位置是連續的。當系統發起N個很是小的IO請求(如:1K)時,由於一次IO是有代價的,系統會取完整的一塊數據(如4K、8K),因此當第一次IO完成時,後續IO請求的數據可能已經有了。這樣能夠減小IO請求的次數。這也就是所謂的預取。

     隨機訪問和順序訪問一樣是有應用決定的。如數據庫、小文件的存儲的業務,大可能是隨機IO。而視頻類業務、大文件存取,則大多爲順序IO。

    選取合理的觀察指標:

      以上各指標中,不用的應用場景須要觀察不一樣的指標,由於應用場景不一樣,有些指標甚至是沒有意義的。

  • 隨機訪問和IOPS: 在隨機訪問場景下,IOPS每每會到達瓶頸,而這個時候去觀察Throughput,則每每遠低於理論值。
  • 順序訪問和Throughput:在順序訪問的場景下,Throughput每每會達到瓶頸(磁盤限制或者帶寬),而這時候去觀察IOPS,每每很小。

iotop 命令:監控硬盤IO的使用狀況

4  系統監控_網絡

 iftop命令    查看實時的網絡流量,監控TCP/IP鏈接等

 因爲安裝好的EPEL沒有iftop,因此沒法使用yum install iftop直接安裝,因此測試的時候採用編譯安裝。

yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel
wget http://www.ex-parrot.com/pdw/iftop/download/iftop-0.17.tar.gz
tar zxvf iftop-0.17.tar.gz
cd iftop-0.17
./configure
make && make install

經常使用的參數:

  • -i  設定監測的網卡,如:# iftop -i eth1
  • -B  以bytes爲單位顯示流量(默認是bits),如:# iftop -B
  • -n  使host信息默認直接都顯示IP,如:# iftop -n
  • -N  使端口信息默認直接都顯示端口號,如: # iftop -N
  • -F  顯示特定網段的進出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
  • -h (display this message),幫助,顯示參數信息
  • -p  使用這個參數後,中間的列表顯示的本地主機信息,出現了本機之外的IP信息;
  • -b  使流量圖形條默認就顯示;
  • -f  這個暫時還不太會用,過濾計算包用的;
  • -P  使host信息及端口信息默認就都顯示;
  • -m  設置界面最上邊的刻度的最大值,刻度分五個大段顯示,例:# iftop -m 100M

   上圖說明:

  • 最上面顯示的是相似刻度尺的刻度範圍,爲顯示流量圖形的長條做標尺用的。
  • 中間的<= =>這兩個左右箭頭,表示的是流量的方向。
  • TX:發送流量
  • RX:接收流量
  • TOTAL:總流量
  • Cumm:運行iftop到目前時間的總流量
  • peak:流量峯值
  • rates:分別表示過去 2s 10s 40s 的平均流量

....

相關文章
相關標籤/搜索