一,基礎知識:
1.平均負載:單位時間內,系統處於可運行狀態和不可中斷狀態的平均進程數,也就是平均活躍進程數
{
所謂可運行狀態的進程,是指正在使用 CPU 或者正在等待 CPU 的進程,就是我們常用 ps 命令看到的,處於 R 狀態的進 程。
不可中斷狀態的進程則是正處於內核態關鍵流程中的進程,並且這些流程是不可打斷的,
比如最常見的是等待硬件設備的 I/O 響應,也就是我們在 ps 命令中看到的 D 狀態的進程
}
2.cpu使用率:單位時間內 CPU 繁忙情況
3.上下文切換:進程上下文切換、線程上下文切換、中斷上下文切換
4.中斷(硬,軟中斷):硬中斷是硬件產生的,比如鍵盤、鼠標的輸入,硬盤的寫入讀取、網卡有數據了;軟中斷是軟件產生的,比如程序內的定時器,網絡收發,就是異步操作,硬中斷會打斷 CPU 正在執行的任務,然後立即執行中斷處理程序。而軟中斷以內核線程的方式執行,並且每個 CPU 都對應一個軟中斷內核線程
二,常見問題和查詢方向:
1.平均負載很高,超過cpu核數:
CPU 密集型進程,大量io。不可中斷進程過多
2.cpu利用率很高:
首先通過uptime查看系統負載,然後使用 mpstat結合pidstat來初步判斷到底是cpu計算量大還是進程爭搶過大或者是io過多,
接着使用vmstat( vmstat 是一個常用的系統性能分析工具,主要用來分析系統的內存使用情況,也常用來分析 CPU 上下文切換和中斷的次數)分析切換次數,以及切換類型,來進一步判斷到底是io過多導致問題還是進程爭搶激烈導致問題
通過top觀察CPU使用率很高,但是看下面的進程的CPU使用率好像很正常,通過pidstat命令查看cpu也很正常。但通過top查看task數量不正常,處於R狀態的進程是可疑點。
如果碰到不好解釋的CPU問題時,比如現象:
通過top觀察CPU使用率很高,但是看下面的進程的CPU使用率好像很正常,通過pidstat命令查看cpu也很正常。但通過top查看task數量不正常,處於R狀態的進程是可疑點
首要想到可能是短時間的應用導致的問題,如下面的兩個:
(1)應用裏直接調用了其他二進制程序,這些程序通常運行時間比較短,通過top等工具發現不了
(2)應用本身在不停地崩潰重啓,而啓動過程的資源初始化,很可能會佔用很多CPU資源
3.大量不可中斷進程(與硬件交互的進程),殭屍進程(子進程已經結束,但是父進程還沒有回收):
1.先分析iowait升高的原因
一般iowait升高,可能的原因是i/o問題
①用dstat 命令同時查看cpu和i/o對比情況(如 dstat 1 10 間隔1秒輸出10組數據),通過結果可以發現iowait升高時,磁盤讀請求(read)升高
所以推斷iowait升高是磁盤讀導致
②定位磁盤讀的進程,使用top命令查看處於不可中斷狀態(D)的進程PID
③查看對應進程的磁盤讀寫情況,使用pidstat命令,加上-d參數,可以看到i/o使用情況(如 pidstat -d -p <pid> 1 3),發現處於不可中斷狀態的進程都沒有進行磁盤讀寫
④繼續使用pidstat命令,但是去掉進程號,查看所有進程的i/o情況(pidstat -d 1 20),可以定位到進行磁盤讀寫的進程。我們知道進程訪問磁盤,需要使用系統調用
4.大量的軟中斷
查看中斷類型:/proc/interrupts 這個只讀文件中讀取
查看軟中斷: watch -d cat /proc/softirqs 通過 /proc/softirqs 文件內容的變化情況,你可以發現, TIMER(定時中斷)、NET_RX(網絡接收)、SCHED(內核調度)、RCU(RCU 鎖)等這幾個軟中斷都在不停變化
在實際生產中,軟中斷導致的性能瓶頸大多是網絡收發類型的,特別是網絡接收的軟中斷。在碰到這類問題時,可以借用 sar、tcpdump 等工具,做進一步分析。sar 可以用來查看系統的網絡收發情況,tcpdump用來抓包具體分析
5.頻繁的上下文切換
# 每隔5秒輸出1組數據$ vmstat 5 vmstat 只給出了系統總體的上下文切換情況,要想查看每個進程的詳細情況,就需要 pidstat # 每隔5秒輸出1組數據$ pidstat -w 5
cswch:自願上下文切換,是指進程無法獲取所需資源,導致的上下文切換。比如說, I/O、內存等系統資源不足時,就會發生自願上下文切換
nvcswch:非自願上下文切換,則是指進程由於時間片已到等原因,被系統強制調度,進而發生的上下文切換。比如說,大量進程都在爭搶 CPU 時,就容易發生非自願上下文切換。
自願上下文切換變多了,說明進程都在等待資源,有可能發生了 I/O 等其他問題;
非自願上下文切換變多了,說明進程都在被強制調度,也就是都在爭搶 CPU,說明 CPU 的確成了瓶頸;
中斷次數變多了,說明 CPU 被中斷處理程序佔用,還需要通過查看 /proc/interrupts 文件來分析具體的中斷類型
最後放一張網上的工具使用圖: