一、管理進(jìn)程狀態(tài)
1宦焦、列出當(dāng)前系統(tǒng)所支持的信號(hào)
使用kill -l列出當(dāng)前系統(tǒng)所支持的信號(hào)
[root@oldboy ~]# kill -l
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
#最常用的3個(gè)信號(hào)
#kill -1 通常用來(lái)重新加載配置文件
#kill -9 強(qiáng)制殺死進(jìn)程
#kill -15 終止進(jìn)程发钝,默認(rèn)kill使用該信號(hào)
2、殺死指定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、殺死指定名字的進(jìn)程
killall锄码、pkill可以批量殺死進(jìn)程。
#例1晌涕、通過服務(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@oldboy ~]# pkill -9 -t pts/0
二余黎、管理后臺(tái)進(jìn)程
早期的時(shí)候大家都選擇使用&符號(hào)將進(jìn)程放入后臺(tái)重窟,然后在使用jobs、bg惧财、fg等方式查看進(jìn)程狀態(tài)巡扇,不太好用∨と剩現(xiàn)在可以使用screen,非常好用厅翔。
1乖坠、jobs、bg刀闷、fg的使用
[root@oldboy ~]# sleep 3000 & //運(yùn)行程序(時(shí))熊泵,讓其在后臺(tái)執(zhí)行
[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è)
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
[root@oldboy ~]# bg %2 //讓作業(yè) 2 在后臺(tái)運(yùn)行
[root@oldboy ~]# fg %1 //將作業(yè) 1 調(diào)回到前臺(tái)
[root@oldboy ~]# kill %1 //kill 1,終止 PID 為 1 的進(jìn)程
[root@oldboy ~]# (while :; do date; sleep 2; done) & //進(jìn)程在后臺(tái)運(yùn)行甸昏,但輸出依然在當(dāng)前終端
[root@oldboy ~]# (while :; do date; sleep 2; done) &>/dev/null &
2顽分、screen的使用
#1.安裝
[root@oldboy ~]# yum install screen -y
#2.開啟一個(gè)screen窗口,指定名稱
[root@oldboy ~]# screen -S wget_mysql
#3.在screen窗口中執(zhí)行任務(wù)即可
[root@oldboy ~]# wget https://mirrors.aliyun.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso
#4.平滑的退出screen,但不會(huì)終止screen中的任務(wù)。
ctrl+a+d
#注意: 如果使用 exit或ctrl+d 才算真的關(guān)閉screen窗口
#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
三施蜜、進(jìn)程的優(yōu)先級(jí)[進(jìn)階]
1卒蘸、什么優(yōu)先級(jí)
優(yōu)先級(jí)指的是優(yōu)先享受資源,比如排隊(duì)買票時(shí)翻默,軍人優(yōu)先悬秉、老人優(yōu)先等等。
2冰蘑、系統(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)查看進(jìn)程的優(yōu)先級(jí)
使用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)指定程序的優(yōu)先級(jí)
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)修改進(jìn)程的優(yōu)先級(jí)
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 折疊shd
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 折疊shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
[root@oldboy ~]# 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 折疊shd
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
四师坎、系統(tǒng)平均負(fù)載[進(jìn)階]
[root@oldboy ~]# uptime
04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 0.05
#前面幾列,分別是當(dāng)前時(shí)間堪滨、系統(tǒng)運(yùn)行時(shí)間以及正在登錄用戶數(shù)胯陋。
# 而最后三個(gè)數(shù)字呢,依次則是過去 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ù)铺罢。
平均負(fù)載與 CPU 使用率并沒有直接關(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)程泉瞻,系統(tǒng)中最常見的是等待硬件設(shè)備的 I/O 響應(yīng)脉漏,也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進(jìn)程。
劃重點(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坦仍,這可以通過 top 命令獲取,或grep ‘model name’ /proc/cpuinfo叨襟。
假設(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。
平均負(fù)載有三個(gè)數(shù)值钓账,我們應(yīng)該關(guān)注哪個(gè)呢?
(1)如果 1 分鐘碴犬、5 分鐘、15 分鐘的三個(gè)值基本相同梆暮,或者相差不大服协,那就說(shuō)明系統(tǒng)負(fù)載很平穩(wěn)。
(2)但如果 1 分鐘的值遠(yuǎn)小于 15 分鐘的值啦粹,就說(shuō)明系統(tǒng)最近 1 分鐘的負(fù)載在減少偿荷,而過去 15 分鐘內(nèi)卻有很大的負(fù)載。
(3)反過來(lái)唠椭,如果 1 分鐘的值遠(yuǎn)大于 15 分鐘的值跳纳,就說(shuō)明最近 1 分鐘的負(fù)載在增加,這種增加有可能只是臨時(shí)性的贪嫂,也有可能還會(huì)持續(xù)上升寺庄,所以就需要持續(xù)觀察。
一旦 1 分鐘的平均負(fù)載接近或超過了 CPU 的個(gè)數(shù)力崇,就意味著系統(tǒng)正在發(fā)生過載的問題斗塘,這時(shí)就得分析問題,并要想辦法優(yōu)化了亮靴。
4馍盟、實(shí)際生產(chǎn)中的平均負(fù)載
那么在實(shí)際生產(chǎn)環(huán)境中,平均負(fù)載多高時(shí)茧吊,需要我們重點(diǎn)關(guān)注呢贞岭?
- 當(dāng)平均負(fù)載高于 CPU 數(shù)量 70% 的時(shí)候,你就應(yīng)該分析排查負(fù)載高的問題了饱狂。
- 一旦負(fù)載過高曹步,就可能導(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)系
- 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)
使用 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
(1)場(chǎng)景一:CPU 密集型進(jìn)程
1)首先,在第一個(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
#單核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%。
(2)場(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)致的像屋。
(3)場(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)重過載狀態(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 過載。
平均負(fù)載與CPU的歸納
平均負(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)源宵蛀。