進程
-
開發(fā)寫的代碼我們稱為程序岖赋,那么將開發(fā)的代碼運行起來映挂。我們稱為進程。 總結(jié)一句話就是: 當我們運行一個程序蝶押,那么我們將運行的程序叫進程踱蠢。
PS1: 當程序運行為進程后,系統(tǒng)會為該進程分配內(nèi)存,以及進程運行的身份和權(quán)限茎截。
PS2: 在進程運行的過程中苇侵,系統(tǒng)會有各種指標來表示當前運行的狀態(tài)。
程序和進程的區(qū)別
程序是數(shù)據(jù)和指令的集合企锌,是一個靜態(tài)的概念榆浓。比如/bin/ls、/bin/cp等二進制文件撕攒。同時程序可以長期存在系統(tǒng)中陡鹃。進程是程序運行的過程,是一個動態(tài)的概念抖坪。進程是存在生命周期的概念的萍鲸,也就是說進程會隨著程序的終止而銷毀,不會永久存在系統(tǒng)中擦俐。
- 進程的生命周期
當父進程接收到任務(wù)調(diào)度時脊阴,會通過fock派生子進程來處理,那么子進程會繼承父進程屬性蚯瞧。
1.子進程在處理任務(wù)代碼時嘿期,父進程會進入等待狀態(tài)中...
2.子進程在處理任務(wù)代碼后,會執(zhí)行退出埋合,然后喚醒父進程來回收子進程的資源备徐。
3.如果子進程在處理任務(wù)過程中,父進程退出了甚颂,子進程沒有退出蜜猾,那么這些子進程就沒有父進程來管理了,就變成僵尸進程西设。
PS: 每個進程都父進程的PPID瓣铣,子進程則叫PID。
程序在運行后贷揽,我們需要了解進程的運行狀態(tài)。查看進程的狀態(tài)分為: 靜態(tài)和動態(tài)兩種方式
ps -aux常用組合梦碗,查看進程 用戶禽绪、PID、占用cpu百分比洪规、占用內(nèi)存百分比印屁、狀態(tài)、執(zhí)行的命令等
[root@oldboy ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128012 6648 ? Ss 15:02 0:01 /usr/lib/systemd/syst
root 2 0.0 0.0 0 0 ? S 15:02 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 15:02 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 15:02 0:00 [kworker/0:0H]
案例一斩例、PS命令查看進程狀態(tài)切換
#1.在終端1上運行vim
[root@xuliangwei ~]# vim oldboy
#2.在終端2上運行ps命令查看狀態(tài)
[root@xuliangwei ~]# ps aux|grep oldboy #S表示睡眠模式雄人,+表示前臺運行
root 58118 0.4 0.2 151788 5320 pts/1 S+ 22:11 0:00 oldboy
root 58120 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
#在終端1上掛起vim命令,按下:ctrl+z
#3.回到終端2再次運行ps命令查看狀態(tài)
[root@xuliangwei ~]# ps aux|grep oldboy #T表示停止狀態(tài)
root 58118 0.1 0.2 151788 5320 pts/1 T 22:11 0:00 vim oldboy
root 58125 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
案例二、PS命令查看不可中斷狀態(tài)進程
#1.使用tar打包文件時础钠,可以通過終端不斷查看狀態(tài)恰力,由S+,R+變?yōu)镈+
[root@xuliangwei ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.5 0.2 127924 5456 pts/1 R+ 22:22 0:04 tar -czf etc.tar.gz /etc/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.5 0.2 127088 4708 pts/1 S+ 22:22 0:03 tar -czf etc.tar.gz /etc/
[root@xuliangwei ~]# ps aux|grep tar|grep -v grep
root 58467 5.6 0.2 127232 4708 pts/1 D+ 22:22 0:03 tar -czf etc.tar.gz /etc/
2.使用top命令查看當前的進程狀態(tài)(動態(tài))
3.管理進程狀態(tài)
當程序運行為進程后旗吁,如果希望停止進程踩萎,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發(fā)送關(guān)閉信號。當然除了kill很钓、還有killall香府,pkill
1.使用kill -l列出當前系統(tǒng)所支持的信號
雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號
1.我們使用kill命令殺死指定PID的進程码倦。
#1.給 vsftpd 進程發(fā)送信號 1,15
[root@xuliangwei ~]# yum -y install vsftpd
[root@xuliangwei ~]# systemctl start vsftpd
[root@xuliangwei ~]# ps aux|grep vsftpd
#2.發(fā)送重載信號企孩,例如 vsftpd 的配置文件發(fā)生改變,希望重新加載
[root@xuliangwei ~]# kill -1 9160
#3.發(fā)送停止信號袁稽,當然vsftpd 服務(wù)有停止的腳本 systemctl stop vsftpd
[root@xuliangwei ~]# kill 9160
#4.發(fā)送強制停止信號柠硕,當無法停止服務(wù)時,可強制終止信號
[root@xuliangwei ~]# kill -9 9160
2.Linux系統(tǒng)中的killall运提、pkill命令用于殺死指定名字的進程蝗柔。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程民泵,我們還需要在之前使用ps等命令再配合grep來查找進程癣丧,而killall、pkill把這兩個過程合二為一栈妆,是一個很好用的命令
#例1胁编、通過服務(wù)名稱殺掉進程
[root@xuliangwei ~]# pkill nginx
[root@xuliangwei ~]# killall nginx
#例2、使用pkill踢出從遠程登錄到本機的用戶鳞尔,終止pts/0上所有進程, 并且bash也結(jié)束(用戶被強制退出)
[root@xuliangwei ~]# pkill -9 -t pts/0
4.管理后臺進程
1.什么是后臺進程
通常進程都會在終端前臺運行嬉橙,一旦關(guān)閉終端,進程也會隨著結(jié)束寥假,那么此時我們就希望進程能在后臺運行市框,就是將在前臺運行的進程放入后臺運行,這樣及時我們關(guān)閉了終端也不影響進程的正常運行糕韧。
2.我們?yōu)槭裁匆獙⑦M程放入后臺運行
比如:我們此前在國內(nèi)服務(wù)器往國外服務(wù)器傳輸大文件時枫振,由于網(wǎng)絡(luò)的問題需要傳輸很久,如果在傳輸?shù)倪^程中出現(xiàn)網(wǎng)絡(luò)抖動或者不小心關(guān)閉了終端則會導(dǎo)致傳輸失敗萤彩,如果能將傳輸?shù)倪M程放入后臺粪滤,是不是就能解決此類問題了。
3.使用什么工具將進程放入后臺
早期的時候大家都選擇使用&符號將進程放入后臺雀扶,然后在使用jobs杖小、bg、fg等方式查看進程狀態(tài),但太麻煩了予权。也不直觀昂勉,所以我們推薦使用screen。
1.jobs伟件、bg硼啤、fg的使用(強烈不推薦,了解即可)
[root@xuliangwei ~]# sleep 3000 & //運行程序(時)斧账,讓其在后臺執(zhí)行
[root@xuliangwei ~]# sleep 4000 //^Z,將前臺的程序掛起(暫停)到后臺
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# ps aux |grep sleep
[root@xuliangwei ~]# jobs //查看后臺作業(yè)
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# bg %2 //讓作業(yè) 2 在后臺運行
[root@xuliangwei ~]# fg %1 //將作業(yè) 1 調(diào)回到前臺
[root@xuliangwei ~]# kill %1 //kill 1谴返,終止 PID 為 1 的進程
[root@xuliangwei ~]# (while :; do date; sleep 2; done) & //進程在后臺運行,但輸出依然在當前終端
[root@xuliangwei ~]# (while :; do date; sleep 2; done) &>/dev/null &
2.screen的使用(強烈推薦咧织,生產(chǎn)必用)
#1.安裝
[root@oldboy ~]# yum install screen -y
#2.開啟一個screen窗口,指定名稱
[root@oldboy ~]# screen -S wget_mysql
#3.在screen窗口中執(zhí)行任務(wù)即可
#4.平滑的退出screen,但不會終止screen中的任務(wù)嗓袱。注意: 如果使用exit 才算真的關(guān)閉screen窗口
ctrl+a+d
#5.查看當前正在運行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
22058.wget_mysql (Detached)
1 Socket in /var/run/screen/S-root.
#6.進入正在運行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058
5.進程的優(yōu)先級[進階]
1.什么優(yōu)先級
優(yōu)先級指的是優(yōu)先享受資源,比如排隊買票時习绢,軍人優(yōu)先渠抹、老人優(yōu)先。等等
2.為什么要有系統(tǒng)優(yōu)先級
舉個例子: 海底撈火鍋正常情況下響應(yīng)就特別快闪萄,那么當節(jié)假日來臨時人員突增則會導(dǎo)致處理請求特別慢梧却,那么假設(shè)我是海底撈VIP客戶(最高優(yōu)先級),無論門店多么繁忙败去,我都不用排隊放航,海底撈人員會直接服務(wù)于我,滿足我的需求圆裕。至于沒有VIP的人員(較低優(yōu)先級)則進入排隊等待狀態(tài)广鳍。(PS: 至于等多久,那.....)
3.系統(tǒng)中如何給進程配置優(yōu)先級?
在啟動進程時吓妆,為不同的進程使用不同的調(diào)度策略赊时。 nice 值越高: 表示優(yōu)先級越低,例如+19行拢,該進程容易將CPU 使用量讓給其他進程祖秒。 nice 值越低: 表示優(yōu)先級越高,例如-20剂陡,該進程更不傾向于讓出CPU狈涮。
1) 使用top或ps命令查看進程的優(yōu)先級
#1.使用top可以查看nice優(yōu)先級。 NI: 實際nice級別鸭栖,默認是0。 PR: 顯示nice值握巢,-20映射到0晕鹊,+19映射到39
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1083 root 20 0 298628 2808 1544 S 0.3 0.1 2:49.28 vmtoolsd
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
#2.使用ps查看進程優(yōu)先級
[root@m01 ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D 0
sshd: root@pts/2 0
*2) nice指定程序的優(yōu)先級。語法格式 nice -n 優(yōu)先級數(shù)字 進程名稱
#1.開啟vim并且指定程序優(yōu)先級為-5
[root@m01 ~]# nice -n -5 vim &
[1] 98417
#2.查看該進程的優(yōu)先級情況
[root@m01 ~]# ps axo pid,command,nice |grep 98417
98417 vim
3) renice命令修改一個正在運行的進程優(yōu)先級。語法格式 renice -n 優(yōu)先級數(shù)字 進程pid
#1.查看sshd進程當前的優(yōu)先級狀態(tài)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D 0
#2.調(diào)整sshd主進程的優(yōu)先級
[root@m01 ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
#3.調(diào)整之后記得退出終端
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
[root@m01 ~]# exit
#4.當再次登陸sshd服務(wù)溅话,會由主進程fork子進程(那么子進程會繼承主進程的優(yōu)先級)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
6.系統(tǒng)平均負載[進階]
*每次發(fā)現(xiàn)系統(tǒng)變慢時晓锻,我們通常做的第一件事,就是執(zhí)行 top 或者 uptime 命令飞几,來了解系統(tǒng)的負載情況砚哆。比如像下面這樣,我在命令行里輸入了 uptime 命令屑墨,系統(tǒng)也隨即給出了結(jié)果
[root@m01 ~]# uptime
04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 0.05
#我們已經(jīng)比較熟悉前面幾列躁锁,它們分別是當前時間、系統(tǒng)運行時間以及正在登錄用戶數(shù)卵史。
# 而最后三個數(shù)字呢战转,依次則是過去 1 分鐘、5 分鐘以躯、15 分鐘的平均負載(Load Average)槐秧。
1.什么是平均負載**
平均負載不就是單位時間內(nèi)的 CPU 使用率嗎?上面的 0.70忧设,就代表 CPU 使用率是 70%刁标。其實上并..... 那到底如何理解平均負載: 平均負載是指單位時間內(nèi),系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)址晕,也就是平均活躍進程數(shù)膀懈, PS: 平均負載與 CPU 使用率并沒有直接關(guān)系。
2.可運行狀態(tài)和不可中斷狀態(tài)是什么
1.可運行狀態(tài)進程斩箫,是指正在使用 CPU 或者正在等待 CPU 的進程吏砂,也就是我們ps 命令看到處于 R 狀態(tài)的進程。 2.不可中斷進程乘客,(你做什么事情的時候是不能打斷的?) 系統(tǒng)中最常見的是等待硬件設(shè)備的 I/O 響應(yīng)狐血,也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進程。 例如: 當一個進程向磁盤讀寫數(shù)據(jù)時易核,為了保證數(shù)據(jù)的一致性匈织,在得到磁盤回復(fù)前,它是不能被其他進程或者中斷打斷的牡直,這個時候的進程就處于不可中斷狀態(tài)缀匕。如果此時的進程被打斷了,就容易出現(xiàn)磁盤數(shù)據(jù)與進程數(shù)據(jù)不一致的問題碰逸。所以乡小,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設(shè)備的一種保護機制。
劃重點饵史,因此你可以簡單理解為满钟,平均負載其實就是單位時間內(nèi)的活躍進程數(shù)胜榔。
3.那平均負載為多少時合理
最理想的狀態(tài)是每個 CPU 上都剛好運行著一個進程,這樣每個 CPU 都得到了充分利用湃番。所以在評判平均負載時夭织,首先你要知道系統(tǒng)有幾個 CPU,這可以通過 top 命令獲取吠撮,或grep 'model name' /proc/cpuinfo
例1尊惰、假設(shè)現(xiàn)在在 4、2泥兰、1核的CPU上弄屡,如果平均負載為 2 時,意味著什么呢逾条? Q1.在4 個 CPU 的系統(tǒng)上琢岩,意味著 CPU 有 50% 的空閑。 Q2.在2 個 CPU 的系統(tǒng)上师脂,意味著所有的 CPU 都剛好被完全占用担孔。 Q3.而1 個 CPU 的系統(tǒng)上,則意味著有一半的進程競爭不到 CPU吃警。
PS: 平均負載有三個數(shù)值糕篇,我們應(yīng)該關(guān)注哪個呢?
實際上,我們都需要關(guān)注酌心。就好比上海4月的天氣拌消,如果只看晚上天氣,感覺在過冬天呢安券。但如果你結(jié)合了早上墩崩、中午、晚上三個時間點的溫度來看侯勉,基本就可以全方位了解這一天的天氣情況了鹦筹。
1.如果 1 分鐘、5 分鐘址貌、15 分鐘的三個值基本相同铐拐,或者相差不大,那就說明系統(tǒng)負載很平穩(wěn)练对。 2.但如果 1 分鐘的值遠小于 15 分鐘的值遍蟋,就說明系統(tǒng)最近 1 分鐘的負載在減少,而過去 15 分鐘內(nèi)卻有很大的負載螟凭。 3.反過來虚青,如果 1 分鐘的值遠大于 15 分鐘的值,就說明最近 1 分鐘的負載在增加螺男,這種增加有可能只是臨時性的挟憔,也有可能還會持續(xù)上升钟些,所以就需要持續(xù)觀察烟号。 PS: 一旦 1 分鐘的平均負載接近或超過了 CPU 的個數(shù)绊谭,就意味著系統(tǒng)正在發(fā)生過載的問題,這時就得分析問題汪拥,并要想辦法優(yōu)化了
在來看個例子3达传、假設(shè)我們在有2個 CPU 系統(tǒng)上看到平均負載為 2.73,6.90迫筑,12.98 那么說明在過去1 分鐘內(nèi)宪赶,系統(tǒng)有 136% 的超載 (2.73/2=136%) 而在過去 5 分鐘內(nèi),有 345% 的超載 (6.90/2=345%) 而在過去15 分鐘內(nèi)脯燃,有 649% 的超載搂妻,(12.98/2=649%) 但從整體趨勢來看,系統(tǒng)的負載是在逐步的降低辕棚。
4.那么在實際生產(chǎn)環(huán)境中欲主,平均負載多高時,需要我們重點關(guān)注呢逝嚎?
當平均負載高于 CPU 數(shù)量 70% 的時候扁瓢,你就應(yīng)該分析排查負載高的問題了。一旦負載過高补君,就可能導(dǎo)致進程響應(yīng)變慢引几,進而影響服務(wù)的正常功能。 但 70% 這個數(shù)字并不是絕對的挽铁,最推薦的方法伟桅,還是把系統(tǒng)的平均負載監(jiān)控起來,然后根據(jù)更多的歷史數(shù)據(jù)叽掘,判斷負載的變化趨勢楣铁。當發(fā)現(xiàn)負載有明顯升高趨勢時,比如說負載翻倍了够掠,你再去做分析和調(diào)查民褂。
5.平均負載與 CPU 使用率有什么關(guān)系
在實際工作中,我們經(jīng)常容易把平均負載和 CPU 使用率混淆疯潭,所以在這里赊堪,我也做一個區(qū)分∈ǎ可能你會疑惑哭廉,既然平均負載代表的是活躍進程數(shù),那平均負載高了相叁,不就意味著 CPU 使用率高嗎遵绰? 我們還是要回到平均負載的含義上來辽幌,平均負載是指單位時間內(nèi),處于可運行狀態(tài)和不可中斷狀態(tài)的進程數(shù)椿访。所以乌企,它不僅包括了正在使用 CPU 的進程,還包括等待 CPU 和等待 I/O 的進程成玫。
而 CPU 使用率加酵,是單位時間內(nèi) CPU 繁忙情況的統(tǒng)計,跟平均負載并不一定完全對應(yīng)哭当。比如: CPU 密集型進程猪腕,使用大量 CPU 會導(dǎo)致平均負載升高,此時這兩者是一致的钦勘; I/O 密集型進程陋葡,等待 I/O 也會導(dǎo)致平均負載升高,但 CPU 使用率不一定很高彻采; 大量等待 CPU 的進程調(diào)度也會導(dǎo)致平均負載升高腐缤,此時的 CPU 使用率也會比較高。
6.平均負載案例分析實戰(zhàn)
下面颊亮,我們以三個示例分別來看這三種情況柴梆,并用 stress、mpstat终惑、pidstat 等工具绍在,找出平均負載升高的根源。 stress 是 Linux 系統(tǒng)壓力測試工具雹有,這里我們用作異常進程模擬平均負載升高的場景偿渡。 mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標霸奕,以及所有 CPU 的平均指標。 pidstat 是一個常用的進程性能分析工具质帅,用來實時查看進程的 CPU适揉、內(nèi)存、I/O 以及上下文切換等性能指標煤惩。
#如果出現(xiàn)無法使用mpstat剪侮、pidstat命令查看%wait指標建議更新下軟件包
wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
場景一:CPU 密集型進程**
*1.首先桶蝎,我們在第一個終端運行 stress 命令,模擬一個 CPU 使用率 100% 的場景
[root@m01 ~]# stress --cpu 1 --timeout 600
*2.接著谅畅,在第二個終端運行 uptime 查看平均負載的變化情況
# 使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負載會持續(xù)升高)
[root@m01 ~]# watch -d uptime
17:27:44 up 2 days, 3:11, 3 users, load average: 1.10, 0.30, 0.17
3.最后,在第三個終端運行 mpstat 查看 CPU 使用率的變化情況
# -P ALL 表示監(jiān)控所有 CPU噪服,后面數(shù)字 5 表示間隔 5 秒后輸出一組數(shù)據(jù)
[root@m01 ~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_ (1 CPU)
17時32分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
17時32分08秒 all 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17時32分08秒 0 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#單核CPU所以只有一個all和0
*4.從終端二中可以看到毡泻,1 分鐘的平均負載會慢慢增加到 1.00,而從終端三中還可以看到粘优,正好有一個 CPU 的使用率為 100%仇味,但它的 iowait 只有 0。這說明雹顺,平均負載的升高正是由于 CPU 使用率為 100% 丹墨。那么,到底是哪個進程導(dǎo)致了 CPU 使用率為 100% 呢嬉愧?可以使用 pidstat 來查詢*
間隔 5 秒后輸出一組數(shù)據(jù)
[root@m01 ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 x86_64(1 CPU)
17時33分21秒 UID PID %usr %system %guest %CPU CPU Command
17時33分26秒 0 110019 98.80 0.00 0.00 98.80 0 stress
從這里可以明顯看到贩挣,stress 進程的 CPU 使用率為 100%。
場景二:I/O 密集型進程**
*1.首先還是運行 stress 命令没酣,但這次模擬 I/O 壓力王财,即不停地執(zhí)行 sync*
[root@m01 ~]# stress --io 1 --timeout 600s
2.然后在第二個終端運行 uptime 查看平均負載的變化情況
[root@m01 ~]# watch -d uptime
18:43:51 up 2 days, 4:27, 3 users, load average: 1.12, 0.65, 0.00
*3.最后第三個終端運行 mpstat 查看 CPU 使用率的變化情況
# 顯示所有 CPU 的指標,并在間隔 5 秒輸出一組數(shù)據(jù)
[root@m01 ~]# mpstat -P ALL 5
Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com) 2019年05月07日 _x86_64_ (1 CPU)
14時20分07秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
14時20分12秒 all 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00
14時20分12秒 0 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00
#會發(fā)現(xiàn)cpu的與內(nèi)核打交道的sys占用非常高
4.那么到底是哪個進程裕便,導(dǎo)致 iowait 這么高呢绒净?我們還是用 pidstat 來查詢
# 間隔 5 秒后輸出一組數(shù)據(jù),-u 表示 CPU 指標
[root@m01 ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_(1 CPU)
18時29分37秒 UID PID %usr %system %guest %wait %CPU CPU Command
18時29分42秒 0 127259 32.60 0.20 0.00 67.20 32.80 0 stress
18時29分42秒 0 127261 4.60 28.20 0.00 67.20 32.80 0 stress
18時29分42秒 0 127262 4.20 28.60 0.00 67.20 32.80 0 stress
#可以發(fā)現(xiàn)偿衰,還是 stress 進程導(dǎo)致的挂疆。
場景三:大量進程的場景
當系統(tǒng)中運行進程超出 CPU 運行能力時,就會出現(xiàn)等待 CPU 的進程下翎。
1.首先缤言,我們還是使用 stress,但這次模擬的是 4 個進程
[root@m01 ~]# stress -c 4 --timeout 600
*2.由于系統(tǒng)只有 1 個 CPU漏设,明顯比 4 個進程要少得多墨闲,因而,系統(tǒng)的 CPU 處于嚴重過載狀態(tài)
[root@m01 ~]# watch -d uptime
19:11:07 up 2 days, 4:45, 3 users, load average: 4.65, 2.65, 4.65
*3.然后,再運行 pidstat 來看一下進程的情況:
# 間隔 5 秒后輸出一組數(shù)據(jù)
[root@m01 ~]# pidstat -u 5 1
平均時間: UID PID %usr %system %guest %wait %CPU CPU Command
平均時間: 0 130290 24.55 0.00 0.00 75.25 24.55 - stress
平均時間: 0 130291 24.95 0.00 0.00 75.25 24.95 - stress
平均時間: 0 130292 24.95 0.00 0.00 75.25 24.95 - stress
平均時間: 0 130293 24.75 0.00 0.00 74.65 24.75 - stress
可以看出婴噩,4 個進程在爭搶 1 個 CPU,每個進程等待 CPU 的時間(也就是代碼塊中的 %wait 列)高達 75%诡挂。這些超出 CPU 計算能力的進程瞻离,最終導(dǎo)致 CPU 過載腾仅。*
分析完這三個案例,我再來歸納一下平均負載與CPU
平均負載提供了一個快速查看系統(tǒng)整體性能的手段套利,反映了整體的負載情況推励。但只看平均負載本身,我們并不能直接發(fā)現(xiàn)肉迫,到底是哪里出現(xiàn)了瓶頸验辞。所以,在理解平均負載時喊衫,也要注意: 平均負載高有可能是 CPU 密集型進程導(dǎo)致的跌造; 平均負載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了族购; 當發(fā)現(xiàn)負載高的時候壳贪,你可以使用 mpstat、pidstat 等工具寝杖,輔助分析負載的來源