進程

進程

  • 開發(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]
image.png

image.png

案例一斩例、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))


image.png

image.png

3.管理進程狀態(tài)

當程序運行為進程后旗吁,如果希望停止進程踩萎,怎么辦呢? 那么此時我們可以使用linux的kill命令對進程發(fā)送關(guān)閉信號。當然除了kill很钓、還有killall香府,pkill

1.使用kill -l列出當前系統(tǒng)所支持的信號

雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號

image.png

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 等工具寝杖,輔助分析負載的來源

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末违施,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瑟幕,更是在濱河造成了極大的恐慌磕蒲,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件收苏,死亡現(xiàn)場離奇詭異亿卤,居然都是意外死亡,警方通過查閱死者的電腦和手機鹿霸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門排吴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懦鼠,你說我怎么就攤上這事钻哩。” “怎么了肛冶?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵街氢,是天一觀的道長。 經(jīng)常有香客問我睦袖,道長珊肃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮伦乔,結(jié)果婚禮上厉亏,老公的妹妹穿的比我還像新娘。我一直安慰自己烈和,他們只是感情好爱只,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著招刹,像睡著了一般恬试。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疯暑,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天训柴,我揣著相機與錄音,去河邊找鬼缰儿。 笑死畦粮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的乖阵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼预麸,長吁一口氣:“原來是場噩夢啊……” “哼瞪浸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吏祸,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤对蒲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后贡翘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蹈矮,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年鸣驱,在試婚紗的時候發(fā)現(xiàn)自己被綠了泛鸟。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡踊东,死狀恐怖北滥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闸翅,我是刑警寧澤再芋,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站坚冀,受9級特大地震影響济赎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一司训、第九天 我趴在偏房一處隱蔽的房頂上張望构捡。 院中可真熱鬧,春花似錦豁遭、人聲如沸叭喜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捂蕴。三九已至,卻和暖如春闪幽,著一層夾襖步出監(jiān)牢的瞬間啥辨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工盯腌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留溉知,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓腕够,卻偏偏與公主長得像级乍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帚湘,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容