1、查看Linux系統(tǒng)CPU個(gè)數(shù)
#????grep 'model name' /proc/cpuinfo | wc -l

2、每次發(fā)現(xiàn)系統(tǒng)變慢時(shí),我們通常做的第一件事,就是執(zhí)行top或者uptime命令
#????uptime?

2.1、如果1分鐘、5分鐘、15分鐘的三個(gè)值基本相同,或者相差不大,那就說明系統(tǒng)負(fù)載很平穩(wěn)。?
2.2、但如果1分鐘的值遠(yuǎn)小于15 分鐘的值,就說明系統(tǒng)最近1分鐘的負(fù)載在減少,而過去15分鐘內(nèi)卻有很大的負(fù)載。
2.3、反過來,如果1分鐘的值遠(yuǎn)大于 15 分鐘的值,就說明最近1分鐘的負(fù)載在增加,這種增加有可能只是臨時(shí)性的,也有可能還會(huì)持續(xù)增加下去,所以就需要持續(xù)觀察。一旦1分鐘的平均負(fù)載接近或超過了CPU的個(gè)數(shù),就意味著系統(tǒng)正在發(fā)生過載的問題,這時(shí)就得分析調(diào)查是哪里導(dǎo)致的問題,并要想辦法優(yōu)化了。
??eg:假設(shè)我們在一個(gè)單 CPU 系統(tǒng)上看到平均負(fù)載為 1.73,0.60,7.98,那么說明在過去 1 分鐘內(nèi),系統(tǒng)有 73% 的超載,而在 15 分鐘內(nèi),有 698% 的超載,從整體趨勢來看,系統(tǒng)的負(fù)載在降低。? ?
2.4、當(dāng)平均負(fù)載高于 CPU 數(shù)量70%的時(shí)候,你就應(yīng)該分析排查負(fù)載高的問題了。一旦負(fù)載過高,就可能導(dǎo)致進(jìn)程響應(yīng)變慢,進(jìn)而影響服務(wù)的正常功能。?
2.5、CPU 使用率,是單位時(shí)間內(nèi) CPU 繁忙情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對應(yīng)
2.5.1、CPU 密集型進(jìn)程,使用大量 CPU 會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的;
2.5.2、I/O 密集型進(jìn)程,等待 I/O 也會(huì)導(dǎo)致平均負(fù)載升高,但 CPU 使用率不一定很高;
2.5.3、大量等待 CPU 的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)的CPU使用率也會(huì)比較高。
3、使用工具iostat(stress)、mpstat、pidstat 等工具,找出平均負(fù)載升高的根源
#????yum install -y epel-release
#????yum install -y stress
??#????yum install -y sysstat
3.1、stress 是一個(gè) Linux 系統(tǒng)壓力測試工具,這里我們用作異常進(jìn)程模擬平均負(fù)載升高的場景??
3.2、而 sysstat 包含了常用的 Linux 性能工具,用來監(jiān)控和分析系統(tǒng)的性能。我們的案例會(huì)用到這個(gè)包的兩個(gè)命令 mpstat 和 pidstat。?
3.2.1、mpstat 是一個(gè)常用的多核 CPU 性能分析工具,用來實(shí)時(shí)查看每個(gè) CPU 的性能指標(biāo),以及所有CPU的平均指標(biāo)。
3.2.2、pidstat 是一個(gè)常用的進(jìn)程性能分析工具,用來實(shí)時(shí)查看進(jìn)程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)
場景一:CPU 密集型進(jìn)程(需要開三個(gè)終端,登錄到同一臺 Linux 機(jī)器中)
首先,在第一個(gè)終端運(yùn)行 stress 命令,模擬一個(gè) CPU 使用率 100% 的場景
#????stress --cpu 1 --timeout 600

接著,在第二個(gè)終端運(yùn)行uptime查看平均負(fù)載的變化情況
#????watch -d uptime ???????????????????????? ### -d 參數(shù)表示高亮顯示變化的區(qū)域???

最后,在第三個(gè)終端運(yùn)行mpstat查看 CPU 使用率的變化情況
#????mpstat -P ALL 5? ? ? ? ? ? ? ? ? ? ? ? ?### -P ALL 表示監(jiān)控所有CPU,后面數(shù)字5表示間隔5秒后輸出一組數(shù)

那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么高呢?我們還是用 pidstat 來查詢
#????pidstat -u 5 1 ???????????????? ???? ### 間隔5秒后輸出一組數(shù)據(jù),-u表示CPU指標(biāo) ,從這里可以明顯看到,stress進(jìn)程的CPU使用率為100%。

場景二:I/O 密集型進(jìn)程
首先還是運(yùn)行 stress 命令,但這次模擬 I/O 壓力,即不停地執(zhí)行 sync
#????stress -i 1 --timeout 600
還是在第二個(gè)終端運(yùn)行uptime查看平均負(fù)載的變化情況
#????watch -d uptime
然后,第三個(gè)終端運(yùn)行mpstat查看 CPU 使用率的變化情況
#????mpstat -P ALL 5 1 ???????????????????? # 顯示所有CPU的指標(biāo),并在間隔5秒輸出一組數(shù)據(jù)

那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么高呢?我們還是用 pidstat 來查詢
#????pidstat -u 5 1 ???????????????????? ???????? # 間隔5秒后輸出一組數(shù)據(jù),-u表示CPU指標(biāo)?
### ?可以發(fā)現(xiàn),還是 stress 進(jìn)程導(dǎo)致的。??

場景三:大量進(jìn)程的場景
當(dāng)系統(tǒng)中運(yùn)行進(jìn)程超出 CPU 運(yùn)行能力時(shí),就會(huì)出現(xiàn)等待 CPU 的進(jìn)程。比如,我們還是使用 stress,但這次模擬的是 4 個(gè)進(jìn)程
#????stress -c 8 --timeout 600

由于系統(tǒng)只有 1 個(gè)CPU,明顯比 4 個(gè)進(jìn)程要少得多,因而,系統(tǒng)的 CPU 處于嚴(yán)重過載狀態(tài),平均負(fù)載高達(dá)3.71
#????uptime

接著再運(yùn)行pidstat來看一下進(jìn)程的情況
#????pidstat -u 5 1 # 間隔5秒后輸出一組數(shù)據(jù),-u表示CPU指標(biāo)
