1.管理進(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)

87.png
雖然linux支持信號(hào)很多,但是我們僅列出我們最為常用的三個(gè)信號(hào)

88.png
2.我們使用kill命令殺死指定的PID進(jìn)程。
#1.給 vsftpd 進(jìn)程發(fā)送信號(hào) 1,15
[root@oldboy ~]# yum -y install vsftpd
[root@oldboy ~]# systemctl start vsftpd
[root@oldboy ~]# ps aux|grep vsftpd
#2.發(fā)送重載信號(hào),例如 vsftpd 的配置文件發(fā)生改變,希望重新加載
[root@oldboy ~]# kill -1 9160
#3.發(fā)送停止信號(hào),當(dāng)然vsftpd 服務(wù)有停止的腳本 systemctl stop vsftpd
[root@oldboy ~]# kill 9160
#4.發(fā)送強(qiáng)制停止信號(hào),當(dāng)無(wú)法停止服務(wù)時(shí),可強(qiáng)制終止信號(hào)
[root@oldboy ~]# kill -9 9160
3.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 ~]# killall nginx
#例2、使用pkill踢出從遠(yuǎn)程登錄到本機(jī)的用戶,終止pts/0上所有進(jìn)程, 并且bash也結(jié)束(用戶被強(qiáng)制退出)
[root@xuliangwei ~]# pkill -9 -t pts/0
2.管理后臺(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),是不是就能解決此類問(wèn)題了。
3.使用什么工具將進(jìn)程放入后臺(tái)
早期的時(shí)候大家都選擇使用&符號(hào)將進(jìn)程放入后臺(tái),然后在使用jobs、bg、fg等方式查看進(jìn)程狀態(tài),但太麻煩了。也不直觀,所以我們推薦使用screen。
screen的使用(生產(chǎn)必用)
#1.安裝
[root@oldboy ~]# yum install screen -y
#2.開啟一個(gè)screen窗口,指定名稱
[root@oldboy ~]# screen -S wget_mysql
#3.在screen窗口中執(zhí)行任務(wù)即可
#4.平滑的退出screen,但不會(huì)終止screen中的任務(wù)。注意: 如果使用exit 才算真的關(guān)閉screen窗口
ctrl+a+d
#5.查看當(dāng)前正在運(yùn)行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
22058.wget_mysql (Detached)
1 Socket in /var/run/screen/S-root.
#6.進(jìn)入正在運(yùn)行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058
3.進(jìn)程的優(yōu)先級(jí)
1.什么是優(yōu)先級(jí)
優(yōu)先級(jí)指的是優(yōu)先享受資源,比如排隊(duì)買票時(shí),軍人優(yōu)先,老人優(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ú)論門店多么繁忙,我都不用排隊(duì),海底撈人員會(huì)直接服務(wù)于我,滿足我的需求。至于沒(méi)有VIP的人員(較低優(yōu)先級(jí))則進(jìn)入排隊(duì)等待狀態(tài)。(PS: 至于等多久,那.....)
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。
1)使用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
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查看進(jìn)程優(yōu)先級(jí)
[root@oldboy ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D 0
sshd: root@pts/2 0
2)nice指定程序的優(yōu)先級(jí)。語(yǔ)法格式 nice -n 優(yōu)先級(jí)數(shù)字 進(jìn)程名稱
#1.開啟vim并且指定程序優(yōu)先級(jí)為-5
[root@oldboy ~]# nice -n -5 vim
[1] 98417
#2.查看該進(jìn)程的優(yōu)先級(jí)情況
[root@oldboy ~]# ps axo pid,command,nice |grep 98417
98417 vim -5
3)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
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D 0
#2.調(diào)整sshd主進(jìn)程的優(yōu)先級(jí)
[root@oldboy ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
#3.調(diào)整之后記得退出終端
[root@oldboy ~]# ps axo pid,command,nice |grep sshd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
[root@m01 ~]# exit
#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
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
4.系統(tǒng)平均負(fù)載
每次發(fā)現(xiàn)系統(tǒng)變慢時(shí),我們通常做的第一件事,就是執(zhí)行 top 或者 uptime 命令,來(lái)了解系統(tǒng)的負(fù)載情況。比如像下面這樣,我在命令行里輸入了 uptime 命令,系統(tǒng)也隨即給出了結(jié)果。
[root@oldboy ~]# uptime
04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 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)程向磁盤讀寫數(shù)據(jù)時(shí),為了保證數(shù)據(jù)的一致性,在得到磁盤回復(fù)前,它是不能被其他進(jìn)程或者中斷打斷的,這個(gè)時(shí)候的進(jìn)程就處于不可中斷狀態(tài)。如果此時(shí)的進(jìn)程被打斷了,就容易出現(xiàn)磁盤數(shù)據(jù)與進(jìn)程數(shù)據(jù)不一致的問(wèn)題。所以,不可中斷狀態(tài)實(shí)際上是系統(tǒng)對(duì)進(jìn)程和硬件設(shè)備的一種保護(hù)機(jī)制。
劃重點(diǎn),因此可以簡(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)化了
在來(lái)看個(gè)例子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
17:27:44 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
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@oldboy ~]# stress --io 1 --timeout 600s
2.然后在第二個(gè)終端運(yùn)行 uptime 查看平均負(fù)載的變化情況:
[root@oldboy ~]# watch -d uptime
18:43:51 up 2 days, 4:27, 3 users, load average: 1.12, 0.65, 0.00
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