Linux 平均負(fù)載

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?

當(dāng)前時(shí)間、系統(tǒng)運(yùn)行時(shí)間以及正在登錄用戶數(shù)? ? #######? ?14:53:06 //當(dāng)前時(shí)間? ? #######? ?up 1:42 //系統(tǒng)運(yùn)行時(shí)間? ? #######? ?3 users //正在登錄用戶數(shù)? ? #######? ?而最后三個(gè)數(shù)字呢,依次則是過去1分鐘、5分鐘、15分鐘的平均負(fù)載(Load Average)??

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ù)

eg:從終端二中可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.00,而從終端三中還可以看到,正好有一個(gè) CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負(fù)載的升高正是由于 CPU 使用率為 100%

那么到底是哪個(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ù)

eg:從這里可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.06,其中一個(gè) CPU 的系統(tǒng)CPU使用率升高到了 23.87,而 iowait 高達(dá) 67.53%。這說明,平均負(fù)載的升高是由于 iowait 的升高。

那么到底是哪個(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)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容