天天看點

CPU

平均負載:機關時間内系統處于可運作狀态和不可中斷狀态的平均程序數,也就是平均活躍程序數。

可運作狀态程序:指正在使用CPU或者正在等待CPU的程序。ps指令中處于R狀态的程序。

不可終端狀态的程序:指正處于核心态關鍵流程中的程序,并且這些流程是不可打斷的。不可中斷狀态是系統對程序和硬體裝置的一種保護機制。比如,當一個程序像磁盤寫資料時,為了保證資料的一緻性,在得到磁盤的回複前,它是不能被其他程序或者中斷打斷的,這個時候程序就處于不可中斷的狀态。如果此時的程序被打斷,就容易出現磁盤資料與程序資料不一緻的問題。ps指令中處于D狀态的程序。

程序各種狀态?

R 運作

S 可中斷睡眠 Sleep

D 不可中斷睡眠

T 停止的程序

Z 僵屍程序

X 死掉的程序

uptime--檢視過去的1分鐘、5分鐘和15分鐘内程序隊列中的平均程序數量。

比如目前負載為2時,就意味着什麼?

1.在隻有2個CPU的系統上,意味着所有的CPU剛好被完成占用

2.在有4個CPU的系統上,意味着CPU有50%的空閑

3.在隻有一個CPU的系統中,意味着有一半的程序競争不到CPU

平均負載多少時合理?

(1)平局負載最理想的狀态是等于CPU個數

檢視CPU個數,通過CPU指令或者從檔案/proc/cpuinfo中讀取,或者使用lscpu指令:

檢視實體cpu個數:cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l

檢視每個實體cpu中的core個數:cat /proc/cpuinfo |grep "cpu cores"|wc -l

邏輯cpu的個數:cat /proc/cpuinfo |grep "processor"|wc -l

實體cpu個數*核數=邏輯cpu個數(不支援超線程技術的情況下)

邏輯核數>實體CPU個數*核數,即開啟了超線程

平均負載和CPU使用率之間的關系?ping

平均負載包括了正在等待CPU、正在等待CPU和等待I/O的程序

CPU使用率是機關時間内CPU繁忙情況的統計,跟平均負載并不完全對應

1.CPU密集型程序,使用大量CPU會導緻平均負載升高,此時兩者是一緻的

2.I/O密集型程序,等待I/O也會導緻平均負載升高。但CPU使用率并不一定高

3.大量等待CPU的程序排程也會導緻平均負載升高,此時的CPU使用率也會比較高

平均負載分析

使用iostat、mpstat、pidstat、vmstat等工具,找出平均負載高的根源。

vmstat工具:

procs

r:運作和等待cpu時間片的程序數,這個值如果長期大于系統CPU的個數,說明CPU不足,需要增加CPU

b:在等待資源的程序數,比如正在等待I/O、或者記憶體交換等

memeory

swpd:虛拟記憶體使用情況,機關為KB。

free:空閑的記憶體,機關為KB。

buff:被用來作為緩存的記憶體數,機關為KB。

swap

si:從磁盤交換到記憶體的交換頁數量,機關為KB。

so:從記憶體交換到磁盤的交換頁數量,機關為KB。

如果這個資料不為0,說明系統已經在使用交換區(swap),機器實體記憶體已經不足。

io

bi:發送到塊裝置的塊數,機關為KB。

bo:從塊裝置接受的塊數,機關為KB。

system

in:每秒的中斷數,包括時鐘中斷。

cs:每秒的環境(上下文)切換次數。

cpu

按cpu的總使用百分比來顯示。

us:cpu使用時間。

sy:cpu系統使用時間。

id:閑置時間。

mpstat -P ALL 1

該指令可以顯示每個CPU的占用情況,如果有一個CPU占用率特别高,那麼有可能是一個單線程應用程式引起的。

all : 指所有CPU

%usr : 顯示在使用者級别(例如應用程式)執行時CPU使用率的百分比

%nice :顯示在擁有nice優先級的使用者級别執行時CPU使用率的百分比

%sys : 現實在系統級别(例如核心)執行時CPU使用率的百分比

%iowait : 顯示在系統有未完成的磁盤I/O請求期間CPU空閑時間的百分比

%irq : 顯示CPU服務硬體中斷所花費時間的百分比

%soft : 顯示CPU服務軟體中斷所花費時間的百分比

%steal : 顯示虛拟機管理器在服務另一個虛拟處理器時虛拟CPU處在非自願等待下花費時間的百分比

%guest : 顯示運作虛拟處理器時CPU花費時間的百分比

%idle : 顯示CPU空閑和系統沒有未完成的磁盤I/O請求情況下的時間百分比系統有兩個CPU。如果使用參數 -P 然後緊跟CPU編号得到指定CPU的使用率

使用者态CPU使用率高

反映了應用程式的繁忙程度,通常與我們自己寫的代碼息息相關。

(一)通過top指令查找cpu消耗最多的程序号

(二)通過top -Hp 程序号  找到CPU消耗最多的線程号

(三)通過printf “%x\n” 線程号  輸出該線程号對應的16進制數字

(四)PID程序在核心調用情況。如果是java應用可以通過jstack 程序号|grep 16進制線程号 -A 10  找到CPU消耗最多的線程方法堆棧。非java程式使用perf top -p 程序号

一、top  

用top指令檢視各個程序CPU的使用情況,找出占用CPU高的程序的程序id

二、top -Hp 程序ID   

 通過此指令檢視該程序下各個線程的CPU的使用情況,找出占用CPU資源較多的線程ID

三、printf “%x\n” 線程号    

将找出的占用CPU資源多的線程的ID轉換成16進制:printf “%x” 線程号

四、jstack 程序ID(方法一)   

 指令檢視目前java程序的堆棧資訊

已經擷取的16進制的線程ID對應的是thread dump中的nid參數,找到對應的nid即可;隔段時間再執行一次jstack指令擷取thread dump,區分兩份dump是否有差別。

五、 jstack  程序ID|grep 轉換成16進制的線程ID  -A 30(方法二)

其中30為顯示的行數

在dump中,線程一般存在如下幾種狀态

Deadlock,死鎖(重點關注)----指多個線程調用間,進入互相資源占用,導緻一直等待無法釋放的情況。

RUNNABLE,線程處于執行中,指該線程正在執行狀态中,該線程占用了資源,正在處理某個請求,有可能正在傳遞SQL到資料庫執行,有可能在對某個檔案操作,有可能進行資料類型轉換等

Waiting on condition,等待資源或等待某個條件的發生(重點關注)

如堆棧資訊明确是應用代碼,則證明該線程正在等待資源。

Waiting on monitor entry,等待擷取螢幕(重點關注)

TIMED_WAITING或者Object.wait(),對象等待中,分為兩類:sleeping(線程處于休眠中)和parking(線程處于挂起中)

Suspended,暫停

BLOCKED,線程被阻塞,并等待螢幕鎖(重點關注)

Parked,停止

根據上述平均負載的定義,能夠導緻平均負載升高的場景有:

1、處于Running狀态的程序大量消耗cpu(CPU密集型程序)

2、大量處于Runnable的程序,cpu會頻繁進行上下文切換(寄存器、程式計數器)

作業系統管理的任務包括程序(線程),還有硬體通過觸發信号,會導緻中斷處理程式的調用

上下文切換包括:程序上下文切換(虛拟記憶體、棧、全局變量等使用者空間的資源,還包括了核心堆棧、寄存器等核心空間的狀态)、線程上下文切換、以及中斷上下文切換

特權模式切換:使用者态到核心态的上下文切換

怎麼确認上下文切換頻繁?

每秒鐘的上下文切換次數:cat /proc/stat | grep ctxt && sleep 30 && cat /proc/stat | grep ctxt

通過vmstat檢視是一個更便捷的方法

上下文切換頻繁時怎麼排查?

僅靠總的上下文切換次數無法定位到哪個程序或者哪個驅動出的問題,這時就需要pidstat(在sysstat包裡)可以檢視具體到每個程序每秒的上下文切換次數,下圖是執行 $pidstat -w 1的結果

CPU密集型的程序和IO密集型的程序。CPU密集型的程序時間片總是不夠用,CPU使用率必然升高,不需要檢視上下文切換;而IO密集型的程序,會被頻繁排程,但是每次隻處理一小會,從CPU使用率是看不出異常的,這時就需要檢視上下文切換。一般來講IO密集型的程序(核心線程或使用者程序)主要是處理讀寫磁盤,或者網絡進來的資料;但是也可能有的程序沒有任何IO互動但是表現得像IO密集型程序

方法一:top 指令

wa 等待輸入輸出的CPU時間百分比

wa 的百分比可以大緻的展現出目前的磁盤io請求是否頻繁。如果 wa的數量比較大,說明等待輸入輸出的的io比較多。

方法二:vmstat 指令

wa 等待IO時間 Wa過高時,說明io等待比較嚴重,這可能是由于磁盤大量随機通路造成的,也有可能是磁盤的帶寬出現瓶頸。

方法三:vmstat -d 可以顯示詳細磁盤資訊

total: 總的成功讀寫次數

sectors: 成功讀寫的扇區

ms: 讀寫花費的毫秒數

merged:表示一次來自于合并的寫/讀請求,一般系統會把多個連接配接/鄰近的讀/寫請求合并到一起來操作.

方法四:iostat 指令

avg-cpu 總體cpu使用情況統計資訊,對于多核cpu,這裡為所有cpu的平均值

Device 各磁盤裝置的IO統計資訊

%user CPU在使用者态執行程序的時間百分比。

%nice CPU在使用者态模式下,用于nice操作,所占用CPU總時間的百分比

%system CPU處在核心态執行程序的時間百分比

%iowait CPU用于等待I/O操作占用CPU總時間的百分比

%steal 管理程式(hypervisor)為另一個虛拟程序提供服務而等待虛拟CPU的百分比

%idle CPU空閑時間百分比

tps 每秒向磁盤裝置請求資料的次數,包括讀、寫請求,為rtps與wtps的和。出于效率考慮,每一次IO下發後并不是立即處理請求,而是将請求合并(merge),這裡tps指請求合并後的請求計數。

Blk_read/s 每秒讀取的資料塊。塊相當于核心2.4或更高版本的扇區,是以大小為512位元組。對于較老的核心,塊的大小是不确定的

Blk_wrtn/s 每秒寫入的資料塊.

Blk_read 取樣時間間隔内讀扇區總數量

Blk_wrtn 取樣時間間隔内寫扇區總數量

1. 若 %iowait 的值過高,表示硬碟存在I/O瓶頸 

2. 若 %idle 的值高但系統響應慢時,有可能是CPU等待配置設定記憶體,此時應加大記憶體容量 

3. 若 %idle 的值持續低于1,則系統的CPU處理能力相對較低,表明系統中最需要解決的資源是 CPU

iostat -x 1

iotop 和 pidstat

https://www.cnblogs.com/xybaby/p/7867735.html

 https://blog.csdn.net/zouhui1003it/article/details/72856983

netstat -na|wc -l 連接配接數

netstat -nat|grep ESTABLISHED|wc -l 有效連接配接數

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 對伺服器各種狀态下的連接配接數分組顯示并查詢得到結果

狀态:描述 

CLOSED:無連接配接是活動的或正在進行 

LISTEN:伺服器在等待進入呼叫 

SYN_RECV:一個連接配接請求已經到達,等待确認 

SYN_SENT:應用已經開始,打開一個連接配接 

ESTABLISHED:正常資料傳輸狀态 

FIN_WAIT1:應用說它已經完成 

FIN_WAIT2:另一邊已同意釋放 

ITMED_WAIT:等待所有分組死掉 

CLOSING:兩邊同時嘗試關閉 

TIME_WAIT:另一邊已初始化一個釋放 

LAST_ACK:等待所有分組死掉

2、檢視Nginx運作程序數

ps -ef | grep nginx | wc -l

傳回的數字就是nginx的運作程序數,如果是apache則執行

ps -ef | grep httpd | wc -l

3、檢視Web伺服器程序連接配接數:

netstat -antp | grep 80 | grep ESTABLISHED -c