平均負(fù)載
單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)(R)和不可中斷狀態(tài)(D)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù),和cpu沒有直接關(guān)系。
那么進(jìn)程常見狀態(tài)解釋和代號如下:
$ man ps
Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the state of a process:
D uninterruptible sleep (usually IO)
R running or runnable (on run queue) )
S interruptible sleep (waiting for an event to complete)
T stopped by job control signal
t stopped by debugger during the tracing
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z defunct ("zombie") process, terminated but not reaped by its parent
可運(yùn)行狀態(tài)進(jìn)程:正在使用或者等待cpu的進(jìn)程。ps命令看到的處于R狀態(tài)(Running or Runnable)的進(jìn)程。
-
不可中斷狀態(tài)進(jìn)程:處于和IO訪問狀態(tài),并且這些流程是不可打斷的。比如常見的是等待硬件設(shè)備的/IO響應(yīng)。ps命令看到的D狀態(tài)(Uniterruptible Sleep 也稱Disk Sleep)的進(jìn)程。
- 不可中斷狀態(tài)實(shí)際上是對進(jìn)程和硬件的一種保護(hù)機(jī)制。
- 比如:當(dāng)一個(gè)進(jìn)程向磁盤寫數(shù)據(jù)時(shí),為了保證數(shù)據(jù)一致性,在得到磁盤回復(fù)之前,它是不能被其它進(jìn)程中斷打斷的,這個(gè)時(shí)候進(jìn)程處于不可中斷狀態(tài)。
查看系統(tǒng)負(fù)載情況
# 周期性查看系統(tǒng)負(fù)載信息,并顯示變化的部分
$ watch -d uptime
當(dāng)前時(shí)間 系統(tǒng)運(yùn)行時(shí)間 正在登陸的用戶 1分鐘、5分鐘、15分鐘的平均負(fù)載
07:49:31 up 1 day, 7:59, 1 user, load average: 0.00, 0.01, 0.05
CPU使用率
- 單位時(shí)間內(nèi)CPU繁忙情況的統(tǒng)計(jì),和平均負(fù)載不一定完全對應(yīng)。
平均負(fù)載高產(chǎn)生原因
- CPU密集型進(jìn)程,使用大量CPU會(huì)導(dǎo)致平均負(fù)載高,此時(shí)cpu使用率也高。
- I/O密集型進(jìn)程,等待I/O導(dǎo)致負(fù)載升高,但CPU使用率不一定高。
- 大量等待CPU的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)CPU使用率也會(huì)比較高。
# 查看系統(tǒng)有幾個(gè)cpu
$ grep 'model name' /proc/cpuinfo | wc -l
40
平均負(fù)載多少合理
- 平均負(fù)載理想情況是等于CPU個(gè)數(shù)。
- 一般平均負(fù)載高于CPU數(shù)量70%的時(shí)候,應(yīng)該分析。(不是絕對)
- 負(fù)載變高會(huì)導(dǎo)致進(jìn)程響應(yīng)變慢,進(jìn)而影響服務(wù)正常功能。
平均負(fù)載案例分析
- 壓力測試工具:stress,用來模擬進(jìn)程平均負(fù)載身高情況
- 性能分析工具:sysstat,用來監(jiān)控分析系統(tǒng)性能,這個(gè)包包含了mpstat、pidstat兩個(gè)命令
- mpstat: 用來查看每個(gè)cpu性能指標(biāo),以及所有cpu平均指標(biāo)。
- pidstat: 實(shí)時(shí)查看進(jìn)程的cpu、內(nèi)存、I/O以及上下文切換等性能指標(biāo)。
# 安裝
$ sudo yum install sysstat stress
查看應(yīng)用是CPU密集型還是IO密集型
- 1.先查看當(dāng)前系統(tǒng)負(fù)載uptime是否高
$ watch -d uptime
- 2.查看負(fù)載升高的原因?
cpu密集(%usr)、io密集(%iowait,%system)、大量等待cpu進(jìn)程調(diào)度(負(fù)載明顯大于cpu數(shù))
每隔5秒查看每個(gè)cpu的指標(biāo),以及整體cpu平均指標(biāo)
$ mpstat -P ALL 5
- 3.查看哪個(gè)應(yīng)用造成了負(fù)載升高,即哪個(gè)應(yīng)用,造成了上面的cpu密集(%CPU)、io密集(%system%wait)、大量等等cpu進(jìn)程調(diào)度(%wait)。(如果當(dāng)前系統(tǒng)只有一個(gè)應(yīng)用,那就很方便了,不然,有可能是多個(gè)應(yīng)用造成的)。
每隔5秒輸出一組進(jìn)程cpu使用數(shù)據(jù)(-u)
$ pidstat -u 5 1
測試環(huán)境
| 項(xiàng)目 | 說明 |
|---|---|
| 總的cpu核心 | 2 |
| 內(nèi)存 | 4.3G |
CPU密集型應(yīng)用
# 開啟兩個(gè)worker進(jìn)行耗費(fèi)cpu計(jì)算
$ stress -c 2
$ uptime
# 負(fù)載大于cup核心數(shù),說明負(fù)載高
16:34:34 up 45 min, 2 users, load average: 3.00, 2.71, 1.59
用htop觀察
$ htop
-
進(jìn)程的顏色是綠色,cpu使用率高
image.png
用mpstat
#每隔5秒查看每個(gè)cpu的指標(biāo),以及整體cpu平均指標(biāo)
$mpstat -P ALL 5
-
%usr值很高,%iowait低,說明cpu都花費(fèi)在計(jì)算上
image.png
用pidstat
- 查看進(jìn)程cpu使用情況
每隔5秒輸出一組進(jìn)程cpu使用數(shù)據(jù)(-u)
$ pidstat -u 5
- 可以看到是stress引起的負(fù)載升高
-
%usr高,說明stress進(jìn)程cpu利用率高,%wait高,說明cpu不夠用在等待cpu調(diào)度上花費(fèi)了不少時(shí)間。
看應(yīng)用的cpu使用情況
# 查看pid=1859進(jìn)程的cpu利用率情況
$pidstat -p 1859 -u 5
-
%wait為33.8%,說明等待情況有點(diǎn)久。
image.png
IO密集型應(yīng)用
$stress -i 1
htop觀察
最近1分鐘的負(fù)載為1.02,說明當(dāng)前的平均活躍進(jìn)程為1(即狀態(tài)為R或D的進(jìn)程)
紅色,代表當(dāng)前使用cpu的進(jìn)程是io型
stress進(jìn)程的狀態(tài)為D

mpstat
mpstat -P ALL 5
-
%idle值搞,說明cpu整體在空閑。%iowait高,說明cpu在等待io上花費(fèi)時(shí)間多。
image.png
pidstat
- 查看進(jìn)程io和cpu情況
pidstat -ud 5
-
stress進(jìn)程的iodelay延遲很高,但是rd,wr不高,cpu利率也底,說明在進(jìn)行sync操作,都花在了io同步上了。
image.png
大量等待CPU調(diào)度
# 進(jìn)程數(shù)大于cpu數(shù),會(huì)導(dǎo)致cpu切換頻繁(此時(shí)系統(tǒng)cpu為4)
$stress -c 8

mpstat
-
每個(gè)cpu利用率都高,但是過多進(jìn)程競爭,也會(huì)導(dǎo)致cpu整體利用率高(all)
pidstat
-
可以看到,8個(gè)進(jìn)程在競爭4個(gè)cpu,每個(gè)進(jìn)程等待cpu的時(shí)間達(dá)到50%(%wait),這些超出cpu計(jì)算能力的進(jìn)程,導(dǎo)致了負(fù)載變高
競爭







