高並發&性能優化(二)——系統監控工具使用

上一篇主要從總體介紹了高並發&性能優化的相關思路和方法,本篇主要介紹系統監控工具。

   

CPU查看工具】

——top命令(性能)

進入top命令後,按1即可看到每核CPU的運行指標與詳細指標:

咱們依次說明下紅框裏面的參數:

Load Average

一段時間內系統的平均負載,這個一段時間一般取1分鐘、5分鐘、15分鐘

us

用戶態所佔用的 CPU 百分比,即引用程序所耗費的 CPU

sy

內核態所佔用的 CPU 百分比,可配合 vmstat 命令,查看上下文切換是否頻繁

ni

高優先級應用所佔用的 CPU 百分比

id

空閑 CPU 百分比

wa

等待 I/O 設備所佔用的 CPU 百分比,經常使用它來判斷 I/O 問題,過高輸入輸出設備可能存在非常明顯的瓶頸

hi

硬中斷所佔用的 CPU 百分比

si

軟中斷所佔用的 CPU 百分比

st

虛擬機等待宿主機 CPU 的時間佔比,在一些超售的雲服務器上,經常發生

   

?硬中斷&軟中斷

硬中斷是由與系統相連的外設(網卡,硬盤等)產生的,如當網卡收到一個數據包。

軟中斷是正在運行的應用產生的,通常指的是一些對於I/O的操作,軟中斷可放到中斷之後執行。

   

一般情況下,我們會比較關心id(空閑 CPU 百分比),可以從整體上大致看出CPU真實利用率

   

——uptime(負載)

其實,在top裏面,已經可以看出平均負載的具體數值。

但是我們也有另外一種方式,分別顯示最近 1min5min15min 的數值:

   

一般負載達到1*CPU核數,我們可以認為系統負載達到了極限。

   

——vmstatCPU 繁忙程度)

查看CPU的繁忙程度,可以通過vmstat查看:

圖中紅框需要特別關注一下:

r

運行隊列

正在運行的隊列長度,一般體現任務總量

b

阻塞隊列

等待資源的任務隊列,如果系統負載有問題,可以專註一下b列(Uninterruptible Sleep),指的是等待I/O,可能讀寫盤操作比較多。

cs

每秒鐘上下文切換(Context Switch

如果上下文切換過於頻繁,就需要考慮是否是進程或者線程數開的過多

si/so

  

顯示了交換分區的一些使用情況,交換分區對性能的影響比較大,需要格外關注

   

如果我們想進一步查看固定進程的上下文切換數量,可以通過以下命令查看:

   

【內存查看工具】

首先,我們從操作系統層面看一下內存的基本結構:

先簡單解釋下上面幾個名詞:

——邏輯內存

當我們寫了一個程序,然後去查看它的底層彙編實現的時候,看到的內存地址,其實不是真正的物理內存地址,叫邏輯內存,邏輯內存是通過MMU映射到真實的物理內存地址上的。

   

——MMU

內存管理單元

虛擬地址和物理地址的映射關係存儲在頁表中,頁表是分級的64位系統一般都是3~5級。

在硬件上會有一個叫做頁表基地址寄存器,它存儲PGD頁表的首地址

MMU就是根據頁表基地址寄存器從PGD頁表一路查到PTE,最終找到物理地址(PTE頁表中存儲物理地址)

   

——TLB

translation lookaside buffer地址轉換後援緩衝器(快表)

TLB其實就是一塊高速緩存,緩存虛擬地址和其映射的物理地址,避免了每次都需要一級一級查找頁表獲取物理地址。

   

——虛擬內存

邏輯地址可以映射到兩個內存段上:物理內存和虛擬內存

虛擬內存就是物理內存不夠用的時候把一些很少訪問的內存數據轉存到硬盤上,然後把這部分內存騰出來分配給其它應用。

   

——top

了解了基本概念之後,我們再來了解一下top在內存查看中的應用:

紅框中的三個參數是內存相關的:

VIRT

虛擬內存,一般比較大

RES

代表了進程實際佔用的內存,平常在做監控時,主要監控的也是這個數值;
需要着重注意。

SHR

共享內存,一塊內存空間可以被多個應用查看,裏面是一些可以復用的內容。

 
 

I/O

I/O 設備可能是計算機里速度最慢的組件了,它指的不僅僅是硬盤,還包括外圍的所有設備。

I/O設備和內存之間的速度差是非常大的,如何去緩解這個問題呢?

緩衝!緩衝區是現在解決速度差的唯一方法,不論是cpu->內存,還是內存->硬盤。

 
 

首先,我們回顧一下之前說過的”top“和”vmstat“,裏面有一個參數,叫wa,它是最能體現I/O的繁忙程度了。如果你的應用有大量寫入文件的操作(比如日誌),I/O wait就可能會非常高。

 
 

——iostat

當然,查看I/O也有一個很好的工具,就是iostat,可以通過sysstat安裝。

我們來大概了解一下主要參數:

%util

通常情況下,要先check這個數值;
這個數字超過 80%,就證明 I/O 的負荷已經非常嚴重了

Device

會列舉你所有的硬盤

avgqu-sz

平均請求隊列的長度

await

響應時間包含了隊列時間和服務時間,它有一個經驗值。
通常情況下應該是小於 5ms 的,如果這個值超過了 10ms,則證明等待的時間過長了。

svctm

表示操作 I/O 的平均服務時間
svctm
await 是強相關的,如果它們比較接近,則表示 I/O 幾乎沒有等待,設備的性能很好;
但如果 await svctm 的值高出很多,則證明 I/O 的隊列等待時間太長,進而系統上運行的應用程序將變慢。

 
 

——零拷貝

說到I/O了,我們再衍生一下,講一個通常的優化手段。

 
 

比如,我們在java裏面進行一個簡單的文件拷貝,在內核的支持下,零拷貝少了一個步驟,那就是內核緩存向用戶空間的拷貝,這樣既節省了內存,也節省了 CPU 的調度時間,讓效率更高。

 
 

本篇先到這裡,下一篇,咱們介紹性能測試工具。