一、管理進(jìn)程狀態(tài)
當(dāng)程序運(yùn)行為進(jìn)程后,如果希望停止進(jìn)程,怎么辦呢? 那么此時(shí)我們可以使用linux的kill命令對(duì)進(jìn)程發(fā)送關(guān)閉信號(hào)。當(dāng)然除了kill、還有killall,pkill
- 1.使用kill -l列出當(dāng)前系統(tǒng)所支持的信號(hào)
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
雖然linux支持信號(hào)很多,但是我們只需要知道我們最為常用的3個(gè)信號(hào)即可。
| 數(shù)字編號(hào) | 信號(hào)含義 | 信號(hào)翻譯 |
|---|---|---|
| 1 | SIGHUP | 通常用來(lái)重新加載配置文件 |
| 9 | SIGKILL | 強(qiáng)制殺死進(jìn)程 |
| 15 | SIGTERM | 終止進(jìn)程,默認(rèn)kill使用該信號(hào) |
- 1.我們使用kill命令殺死指定PID的進(jìn)程。
1.給 vsftpd 進(jìn)程發(fā)送信號(hào) 1,15
2.發(fā)送重載信號(hào),例如 vsftpd 的配置文件發(fā)生改變,希望重新加載
3.發(fā)送停止信號(hào),當(dāng)然vsftpd 服務(wù)有停止的腳本 systemctl stop vsftpd
4.發(fā)送強(qiáng)制停止信號(hào),當(dāng)無(wú)法停止服務(wù)時(shí),可強(qiáng)制終止信號(hào)
[root@oldboy ~]# yum install vsftpd -y
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# ps aux |grep vsftpd
root 7874 0.0 0.0 53176 576 ? Ss 15:03 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 7876 0.0 0.0 112708 972 pts/0 S+ 15:03 0:00 grep --color=auto vsftpd
[root@oldboy ~]# kill -l 7874
-bash: kill: 7874: invalid signal specification
[root@oldboy ~]# ps aux |grep vsftpd
root 7874 0.0 0.0 53176 576 ? Ss 15:03 0:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf
root 7879 0.0 0.0 112708 976 pts/0 R+ 15:05 0:00 grep --color=auto vsftpd
[root@oldboy ~]# kill -9 7874
[root@oldboy ~]# ps aux |grep vsftpd
root 7881 0.0 0.0 112708 976 pts/0 S+ 15:05 0:00 grep --color=auto vsftpd
[root@oldboy ~]#
- 2.Linux系統(tǒng)中的killall、pkill命令用于殺死指定名字的進(jìn)程。我們可以使用kill命令殺死指定進(jìn)程PID的進(jìn)程,如果要找到我們需要?dú)⑺赖倪M(jìn)程,我們還需要在之前使用ps等命令再配合grep來(lái)查找進(jìn)程,而killall、pkill把這兩個(gè)過(guò)程合二為一,是一個(gè)很好用的命令。
例1、通過(guò)服務(wù)名稱殺掉進(jìn)程
[root@oldboy ~]# pkill nginx
[root@oldboy ~]# kill nginx
例2、使用pkill踢出從遠(yuǎn)程登錄到本機(jī)的用戶,終止pts/0上所有進(jìn)程,
并且bash也結(jié)束(用戶被強(qiáng)制退出)
[root@oldboy ~]# pkill -9 -t pts/0
-
二、管理后臺(tái)進(jìn)程
1.什么是后臺(tái)進(jìn)程?
通常進(jìn)程都會(huì)在終端前臺(tái)運(yùn)行,一旦關(guān)閉終端,進(jìn)程也會(huì)隨著結(jié)束,那么此時(shí)我們就希望進(jìn)程能在后臺(tái)運(yùn)行,就是將在前臺(tái)運(yùn)行的進(jìn)程放入后臺(tái)運(yùn)行,這樣及時(shí)我們關(guān)閉了終端也不影響進(jìn)程的正常運(yùn)行。
2.我們?yōu)槭裁匆獙⑦M(jìn)程放入后臺(tái)運(yùn)行
比如:我們此前在國(guó)內(nèi)服務(wù)器往國(guó)外服務(wù)器傳輸大文件時(shí),由于網(wǎng)絡(luò)的問(wèn)題需要傳輸很久,如果在傳輸?shù)倪^(guò)程中出現(xiàn)網(wǎng)絡(luò)抖動(dòng)或者不小心關(guān)閉了終端則會(huì)導(dǎo)致傳輸失敗,如果能將傳輸?shù)倪M(jìn)程放入后臺(tái),是不是就能解決此類(lèi)問(wèn)題了。
3.使用什么工具將進(jìn)程放入后臺(tái)
早期的時(shí)候大家都選擇使用&符號(hào)將進(jìn)程放入后臺(tái),然后在使用jobs、bg、fg等方式查看進(jìn)程狀態(tài),但太麻煩了。也不直觀,所以我們推薦使用screen。
(1).jobs、bg、fg的使用(強(qiáng)烈不推薦,了解即可)
[root@oldboy ~]# sleep 3000 &//運(yùn)行程序(時(shí)),讓其在后臺(tái)執(zhí)行
[1] 7901
[root@oldboy ~]# sleep 4000 //^Z,將前臺(tái)的程序掛起(暫停)到后臺(tái)
[2]+ Stopped sleep 4000
[root@oldboy ~]# ps aux |grep sleep
[root@oldboy ~]# jobs //查看后臺(tái)作業(yè)
[root@oldboy ~]# jobs
[1]+ Running sleep 3000 &
(2).screen的使用(強(qiáng)烈推薦,生產(chǎn)必用)
1.安裝
2.開(kāi)啟一個(gè)screen窗口,指定名稱
3.在screen窗口中執(zhí)行任務(wù)即可
4.平滑的退出screen,但不會(huì)終止screen中的任務(wù)。注意: 如果使用exit 才算真的關(guān)閉screen窗口 ctrl +a+d
[root@oldboy ~]# yum install screen -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.aliyun.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Package screen-4.1.0-0.25.20120314git3c2946.el7.x86_64 already installed and latest version
Nothing to do
[root@oldboy ~]# screen -S wget mysql
[screen is terminating]#屏幕正在終止
5.查看當(dāng)前正在運(yùn)行的screen有哪些
[root@oldboy ~]# screen -list
No Sockets found in /var/run/screen/S-root.
#6.進(jìn)入正在運(yùn)行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058
三、進(jìn)程的優(yōu)先級(jí)[進(jìn)階]
1.什么是優(yōu)先級(jí)
優(yōu)先級(jí)指的是優(yōu)先享受資源,比如排隊(duì)買(mǎi)票時(shí),軍人優(yōu)先等
2.為什么要有系統(tǒng)優(yōu)先級(jí)
舉個(gè)例子: 海底撈火鍋正常情況下響應(yīng)就特別快,那么當(dāng)節(jié)假日來(lái)臨時(shí)人員突增則會(huì)導(dǎo)致處理請(qǐng)求特別慢,那么假設(shè)我是海底撈VIP客戶(最高優(yōu)先級(jí)),無(wú)論門(mén)店多么繁忙,vip都不用排隊(duì),海底撈人員會(huì)直接服務(wù)于vip,滿足vip的需求。至于沒(méi)有VIP的人員(較低優(yōu)先級(jí))則進(jìn)入排隊(duì)等待狀態(tài)。
3.系統(tǒng)中如何給進(jìn)程配置優(yōu)先級(jí)
在啟動(dòng)進(jìn)程時(shí),為不同的進(jìn)程使用不同的調(diào)度策略。
nice 值越高: 表示優(yōu)先級(jí)越低,例如+19,該進(jìn)程容易將CPU 使用量讓給其他進(jìn)程。
nice 值越低: 表示優(yōu)先級(jí)越高,例如-20,該進(jìn)程更不傾向于讓出CPU。
- 使用top或ps命令查看進(jìn)程的優(yōu)先級(jí)
1.使用top可以查看nice優(yōu)先級(jí)。
NI: 實(shí)際nice級(jí)別,默認(rèn)是0。 PR: 顯示nice值,-20映射到0,+19映射到39
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7943 root 20 0 161880 2192 1556 R 0.3 0.1 0:00.75 top
1 root 20 0 128432 6972 4136 S 0.0 0.3 0:02.89 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.26 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:00.86 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:00.01 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.
2.使用ps查看進(jìn)程優(yōu)先級(jí)
[root@oldboy ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D 0
sshd: root@pts/0 0
- nice指定程序的優(yōu)先級(jí)。語(yǔ)法格式 nice -n 優(yōu)先級(jí)數(shù)字 進(jìn)程名稱
1.開(kāi)啟vi并且指定程序優(yōu)先級(jí)為-5
[root@oldboy ~]# nice -n -5 vi &
[2] 7950
2.查看該進(jìn)程的優(yōu)先級(jí)情況
[root@oldboy ~]# ps axo pid,command,nice |grep 7950
7950 vi -5
- renice命令修改一個(gè)正在運(yùn)行的進(jìn)程優(yōu)先級(jí)。語(yǔ)法格式 renice -n 優(yōu)先級(jí)數(shù)字 進(jìn)程pid
1.查看sshd進(jìn)程當(dāng)前的優(yōu)先級(jí)狀態(tài)
[root@oldboy ~]# ps axo pid,command,nice |grep sshd
7570 /usr/sbin/sshd -D 0
7831 sshd: root@pts/0 0
7960 grep --color=auto sshd 0
2.調(diào)整sshd主進(jìn)程的優(yōu)先級(jí)
[root@oldboy ~]# renice -n -20 7570
7570 (process ID) old priority 0, new priority -20
3.調(diào)整之后記得退出終端
[root@oldboy ~]# ps axo pid,command,nice |grep sshd
7570 /usr/sbin/sshd -D -20
7831 sshd: root@pts/0 0
4.當(dāng)再次登陸sshd服務(wù),會(huì)由主進(jìn)程fork子進(jìn)程(那么子進(jìn)程會(huì)繼承主進(jìn)程的優(yōu)先級(jí))
[root@oldboy ~]# ps axo pid,command,nice |grep sshd
7570 /usr/sbin/sshd -D -20
7831 sshd: root@pts/0 0
7971 grep --color=auto sshd 0
生產(chǎn)案例、Linux出現(xiàn)假死,怎么辦,又如何通過(guò)nice解決?
請(qǐng)點(diǎn)擊上方藍(lán)色字體查看
-
四、系統(tǒng)平均負(fù)載
每次發(fā)現(xiàn)系統(tǒng)變慢時(shí),我們通常做的第一件事,就是執(zhí)行 top 或者 uptime 命令,來(lái)了解系統(tǒng)的負(fù)載情況。比如像下面這樣,在命令行里輸入uptime 命令,系統(tǒng)也隨即給出了結(jié)果。
[root@oldboy ~]# uptime
15:45:18 up 50 min, 1 user, load average: 0.03, 0.02, 0.05
我們已經(jīng)比較熟悉前面幾列,它們分別是當(dāng)前時(shí)間、系統(tǒng)運(yùn)行時(shí)間以及正在登錄用戶數(shù)。
而最后三個(gè)數(shù)字依次則是過(guò)去 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載(Load Average)
*1.什么是平均負(fù)載
平均負(fù)載不就是單位時(shí)間內(nèi)的 CPU 使用率嗎?上面的 0.70,就代表 CPU 使用率是 70%。其實(shí)上并不是的。
那到底如何理解平均負(fù)載:平均負(fù)載是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù),
PS: 平均負(fù)載與 CPU 使用率并沒(méi)有直接關(guān)系。
2.可運(yùn)行狀態(tài)和不可中斷狀態(tài)是什么
1.可運(yùn)行狀態(tài)進(jìn)程,是指正在使用 CPU 或者正在等待 CPU 的進(jìn)程,也就是我們ps 命令看到處于 R 狀態(tài)的進(jìn)程。
2.不可中斷進(jìn)程,(你做什么事情的時(shí)候是不能打斷的?) 系統(tǒng)中最常見(jiàn)的是等待硬件設(shè)備的 I/O 響應(yīng),也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進(jìn)程。
例如: 當(dāng)一個(gè)進(jìn)程向磁盤(pán)讀寫(xiě)數(shù)據(jù)時(shí),為了保證數(shù)據(jù)的一致性,在得到磁盤(pán)回復(fù)前,它是不能被其他進(jìn)程或者中斷打斷的,這個(gè)時(shí)候的進(jìn)程就處于不可中斷狀態(tài)。如果此時(shí)的進(jìn)程被打斷了,就容易出現(xiàn)磁盤(pán)數(shù)據(jù)與進(jìn)程數(shù)據(jù)不一致的問(wèn)題。
所以,不可中斷狀態(tài)實(shí)際上是系統(tǒng)對(duì)進(jìn)程和硬件設(shè)備的一種保護(hù)機(jī)制。
因此可以簡(jiǎn)單理解為,平均負(fù)載其實(shí)就是單位時(shí)間內(nèi)的活躍進(jìn)程數(shù)。
3.平均負(fù)載為多少時(shí)合理
最理想的狀態(tài)是每個(gè) CPU 上都剛好運(yùn)行著一個(gè)進(jìn)程,這樣每個(gè) CPU 都得到了充分利用。所以在評(píng)判平均負(fù)載時(shí),首先你要知道系統(tǒng)有幾個(gè) CPU,這可以通過(guò) top 命令獲取,或grep 'model name' /proc/cpuinfo
例1、假設(shè)現(xiàn)在在 4、2、1核的CPU上,如果平均負(fù)載為 2 時(shí),意味著什么呢?
Q1.在4 個(gè) CPU 的系統(tǒng)上,意味著 CPU 有 50% 的空閑。
Q2.在2 個(gè) CPU 的系統(tǒng)上,意味著所有的 CPU 都剛好被完全占用。
Q3.而1 個(gè) CPU 的系統(tǒng)上,則意味著有一半的進(jìn)程競(jìng)爭(zhēng)不到 CPU。
PS: 平均負(fù)載有三個(gè)數(shù)值,我們應(yīng)該關(guān)注哪個(gè)呢?
實(shí)際上,我們都需要關(guān)注。就好比上海4月的天氣,如果只看晚上天氣,感覺(jué)在過(guò)冬天呢。但如果你結(jié)合了早上、中午、晚上三個(gè)時(shí)間點(diǎn)的溫度來(lái)看,基本就可以全方位了解這一天的天氣情況了。
1.如果 1 分鐘、5 分鐘、15 分鐘的三個(gè)值基本相同,或者相差不大,那就說(shuō)明系統(tǒng)負(fù)載很平穩(wěn)。
2.但如果 1 分鐘的值遠(yuǎn)小于 15 分鐘的值,就說(shuō)明系統(tǒng)最近 1 分鐘的負(fù)載在減少,而過(guò)去 15 分鐘內(nèi)卻有很大的負(fù)載。
3.反過(guò)來(lái),如果 1 分鐘的值遠(yuǎn)大于 15 分鐘的值,就說(shuō)明最近 1 分鐘的負(fù)載在增加,這種增加有可能只是臨時(shí)性的,也有可能還會(huì)持續(xù)上升,所以就需要持續(xù)觀察。
PS: 一旦 1 分鐘的平均負(fù)載接近或超過(guò)了 CPU 的個(gè)數(shù),就意味著系統(tǒng)正在發(fā)生過(guò)載的問(wèn)題,這時(shí)就得分析問(wèn)題,并要想辦法優(yōu)化了
例3、假設(shè)我們?cè)谟?個(gè) CPU 系統(tǒng)上看到平均負(fù)載為 2.73,6.90,12.98
那么說(shuō)明在過(guò)去1 分鐘內(nèi),系統(tǒng)有 136% 的超載 (2.73/2=136%)
而在過(guò)去 5 分鐘內(nèi),有 345% 的超載 (6.90/2=345%)
而在過(guò)去15 分鐘內(nèi),有 649% 的超載,(12.98/2=649%)
但從整體趨勢(shì)來(lái)看,系統(tǒng)的負(fù)載是在逐步的降低。
4.那么在實(shí)際生產(chǎn)環(huán)境中,平均負(fù)載多高時(shí),需要我們重點(diǎn)關(guān)注呢?
當(dāng)平均負(fù)載高于 CPU 數(shù)量 70% 的時(shí)候,你就應(yīng)該分析排查負(fù)載高的問(wèn)題了。一旦負(fù)載過(guò)高,就可能導(dǎo)致進(jìn)程響應(yīng)變慢,進(jìn)而影響服務(wù)的正常功能。
但 70% 這個(gè)數(shù)字并不是絕對(duì)的,最推薦的方法,還是把系統(tǒng)的平均負(fù)載監(jiān)控起來(lái),然后根據(jù)更多的歷史數(shù)據(jù),判斷負(fù)載的變化趨勢(shì)。當(dāng)發(fā)現(xiàn)負(fù)載有明顯升高趨勢(shì)時(shí),比如說(shuō)負(fù)載翻倍了,你再去做分析和調(diào)查。
5.平均負(fù)載與 CPU 使用率有什么關(guān)系
在實(shí)際工作中,我們經(jīng)常容易把平均負(fù)載和 CPU 使用率混淆,所以在這里,我也做一個(gè)區(qū)分??赡苣銜?huì)疑惑,既然平均負(fù)載代表的是活躍進(jìn)程數(shù),那平均負(fù)載高了,不就意味著 CPU 使用率高嗎?
我們還是要回到平均負(fù)載的含義上來(lái),平均負(fù)載是指單位時(shí)間內(nèi),處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的進(jìn)程數(shù)。所以,它不僅包括了正在使用 CPU 的進(jìn)程,還包括等待 CPU 和等待 I/O 的進(jìn)程。
而 CPU 使用率,是單位時(shí)間內(nèi) CPU 繁忙情況的統(tǒng)計(jì),跟平均負(fù)載并不一定完全對(duì)應(yīng)。比如:
CPU 密集型進(jìn)程,使用大量 CPU 會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)這兩者是一致的;
I/O 密集型進(jìn)程,等待 I/O 也會(huì)導(dǎo)致平均負(fù)載升高,但 CPU 使用率不一定很高;
大量等待 CPU 的進(jìn)程調(diào)度也會(huì)導(dǎo)致平均負(fù)載升高,此時(shí)的 CPU 使用率也會(huì)比較高。
- 6.平均負(fù)載案例分析實(shí)戰(zhàn)
以三個(gè)示例分別來(lái)看這三種情況,并用 stress、mpstat、pidstat 等工具,找出平均負(fù)載升高的根源。
stress 是 Linux 系統(tǒng)壓力測(cè)試工具,這里我們用作異常進(jìn)程模擬平均負(fù)載升高的場(chǎng)景。
mpstat 是多核 CPU 性能分析工具,用來(lái)實(shí)時(shí)查看每個(gè) CPU 的性能指標(biāo),以及所有 CPU 的平均指標(biāo)。
pidstat 是一個(gè)常用的進(jìn)程性能分析工具,用來(lái)實(shí)時(shí)查看進(jìn)程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)。*
#如果出現(xiàn)無(wú)法使用mpstat、pidstat命令查看%wait指標(biāo)建議更新下軟件包
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
場(chǎng)景一:CPU 密集型進(jìn)程
1.首先,我們?cè)诘谝粋€(gè)終端運(yùn)行 stress 命令,模擬一個(gè) CPU 使用率 100% 的場(chǎng)景:*
[root@oldboy ~]# stress --cpu 1 --timeout 600
2.接著,在第二個(gè)終端運(yùn)行 uptime 查看平均負(fù)載的變化情況
使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負(fù)載會(huì)持續(xù)升高)
[root@oldboy ~]# watch -d uptime
16:33 up 2 days, 3:11, 3 users, load average: 1.10, 0.30, 0.17
3.最后,在第三個(gè)終端運(yùn)行 mpstat 查看 CPU 使用率的變化情況
# -P ALL 表示監(jiān)控所有 CPU,后面數(shù)字 5 表示間隔 5 秒后輸出一組數(shù)據(jù)
[root@oldboy ~]# mpstat -P ALL 5
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_ (1 CPU)
17時(shí)32分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
17時(shí)32分08秒 all 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
17時(shí)32分08秒 0 99.80 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 0.00
#單核CPU所以只有一個(gè)all和0
4.從終端二中可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.00,而從終端三中還可以看到,正好有一個(gè) CPU 的使用率為 100%,但它的 iowait 只有 0。這說(shuō)明,平均負(fù)載的升高正是由于 CPU 使用率為 100% 。那么,到底是哪個(gè)進(jìn)程導(dǎo)致了 CPU 使用率為 100% 呢?可以使用 pidstat 來(lái)查詢*
間隔 5 秒后輸出一組數(shù)據(jù)
[root@oldboy ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_(1 CPU)
17時(shí)33分21秒 UID PID %usr %system %guest %CPU CPU Command
17時(shí)33分26秒 0 110019 98.80 0.00 0.00 98.80 0 stress
#從這里可以明顯看到,stress 進(jìn)程的 CPU 使用率為 100%。
場(chǎng)景二:I/O 密集型進(jìn)程
1.首先還是運(yùn)行 stress 命令,但這次模擬 I/O 壓力,即不停地執(zhí)行 sync*
[root@m01 ~]# stress --io 1 --timeout 600s
2.然后在第二個(gè)終端運(yùn)行 uptime 查看平均負(fù)載的變化情況:

3.最后第三個(gè)終端運(yùn)行 mpstat 查看 CPU 使用率的變化情況:
顯示所有 CPU 的指標(biāo),并在間隔 5 秒輸出一組數(shù)據(jù)
[root@oldboy ~]# mpstat -P ALL 5
Linux 3.10.0-693.2.2.el7.x86_64 (bgx.com) 2019年05月07日 _x86_64_ (1 CPU)
14時(shí)20分07秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
14時(shí)20分12秒 all 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00
14時(shí)20分12秒 0 0.20 0.00 82.45 17.35 0.00 0.00 0.00 0.00 0.00 0.00
會(huì)發(fā)現(xiàn)cpu的與內(nèi)核打交道的sys占用非常高
4.那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么高呢?我們還是用 pidstat 來(lái)查詢
間隔 5 秒后輸出一組數(shù)據(jù),-u 表示 CPU 指標(biāo)
[root@oldboy ~]# pidstat -u 5 1
Linux 3.10.0-957.1.3.el7.x86_64 (m01) 2019年04月29日 _x86_64_(1 CPU)
18時(shí)29分37秒 UID PID %usr %system %guest %wait %CPU CPU Command
18時(shí)29分42秒 0 127259 32.60 0.20 0.00 67.20 32.80 0 stress
18時(shí)29分42秒 0 127261 4.60 28.20 0.00 67.20 32.80 0 stress
18時(shí)29分42秒 0 127262 4.20 28.60 0.00 67.20 32.80 0 stress
可以發(fā)現(xiàn),還是 stress 進(jìn)程導(dǎo)致的。
場(chǎng)景三:大量進(jìn)程的場(chǎng)景
當(dāng)系統(tǒng)中運(yùn)行進(jìn)程超出 CPU 運(yùn)行能力時(shí),就會(huì)出現(xiàn)等待 CPU 的進(jìn)程。
1.首先,我們還是使用 stress,但這次模擬的是 4 個(gè)進(jìn)程
[root@oldboy ~]# stress -c 4 --timeout 600
2.由于系統(tǒng)只有 1 個(gè) CPU,明顯比 4 個(gè)進(jìn)程要少得多,因而,系統(tǒng)的 CPU 處于嚴(yán)重過(guò)載狀態(tài)
[root@oldboy ~]# watch -d uptime
19:11:07 up 2 days, 4:45, 3 users, load average: 4.65, 2.65, 4.65
3.然后,再運(yùn)行 pidstat 來(lái)看一下進(jìn)程的情況:
# 間隔 5 秒后輸出一組數(shù)據(jù)
[root@oldboy ~]# pidstat -u 5 1
平均時(shí)間: UID PID %usr %system %guest %wait %CPU CPU Command
平均時(shí)間: 0 130290 24.55 0.00 0.00 75.25 24.55 - stress
平均時(shí)間: 0 130291 24.95 0.00 0.00 75.25 24.95 - stress
平均時(shí)間: 0 130292 24.95 0.00 0.00 75.25 24.95 - stress
平均時(shí)間: 0 130293 24.75 0.00 0.00 74.65 24.75 - stress
可以看出,4 個(gè)進(jìn)程在爭(zhēng)搶 1 個(gè) CPU,每個(gè)進(jìn)程等待 CPU 的時(shí)間(也就是代碼塊中的 %wait 列)高達(dá) 75%。這些超出 CPU 計(jì)算能力的進(jìn)程,最終導(dǎo)致 CPU 過(guò)載。
平均負(fù)載提供了一個(gè)快速查看系統(tǒng)整體性能的手段,反映了整體的負(fù)載情況。但只看平均負(fù)載本身,我們并不能直接發(fā)現(xiàn),到底是哪里出現(xiàn)了瓶頸。所以,在理解平均負(fù)載時(shí),也要注意:
平均負(fù)載高有可能是 CPU 密集型進(jìn)程導(dǎo)致的;
平均負(fù)載高并不一定代表 CPU 使用率高,還有可能是 I/O 更繁忙了;
當(dāng)發(fā)現(xiàn)負(fù)載高的時(shí)候,你可以使用 mpstat、pidstat 等工具,輔助分析負(fù)載的來(lái)源*
stress工具使用參考
點(diǎn)擊上方查看