上一篇主要從總體介紹了高並發&性能優化的相關思路和方法,本篇主要介紹系統監控工具。
【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里面,已經可以看出平均負載的具體數值。
但是我們也有另外一種方式,分別顯示最近 1min、5min、15min 的數值:
一般負載達到1*CPU核數,我們可以認為系統負載達到了極限。
------vmstat(CPU 繁忙程度)
查看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這個數值; |
Device |
會列舉你所有的硬盤 |
avgqu-sz |
平均請求隊列的長度 |
await |
響應時間包含了隊列時間和服務時間,它有一個經驗值。 |
svctm |
表示操作 I/O 的平均服務時間; |
------零拷貝
說到I/O了,我們再衍生一下,講一個通常的優化手段。
比如,我們在java里面進行一個簡單的文件拷貝,在內核的支持下,零拷貝少了一個步驟,那就是內核緩存向用戶空間的拷貝,這樣既節省了內存,也節省了 CPU 的調度時間,讓效率更高。
本篇先到這里,下一篇,咱們介紹性能測試工具。