如何管理進(jìn)程kill、killall、pkill
1.kill 正常停止 平滑重啟 強(qiáng)制停止
kill PID 正常停止一個(gè)程序
發(fā)送停止信號(hào),當(dāng)然nginx 服務(wù)有停止的腳本 systemctl stop
nginx

kill -1 PID 平滑重載配置文件
發(fā)送重載信號(hào),例如 nginx 的配置文件發(fā)生改變,希望重新加載
相當(dāng)于systemctl reload nginx
平滑重啟服務(wù) PID 不變 已連接的客戶不需要重新連接

kill -9 PID 強(qiáng)制殺死進(jìn)程 (對(duì)于mysql這類有狀態(tài)的慎用)
發(fā)送強(qiáng)制停止信號(hào),當(dāng)無法停止服務(wù)時(shí),可強(qiáng)制終止信號(hào)
強(qiáng)制停止某個(gè)進(jìn)程 ,慎用 ,服務(wù)強(qiáng)行停止可能同步不完整,后開啟失敗

killall Name 批量干掉程序
Linux系統(tǒng)中的killall、pkill命令用于殺死指定名字的進(jìn)程。我們可以使用kill命令殺死指定進(jìn)程PID的進(jìn)程,如果要找到我們需要?dú)⑺赖倪M(jìn)程,我們還需要在之前使用ps等命令再配合grep來查找進(jìn)程,而killall、pkill把這兩個(gè)過程合二為一,是一個(gè)很好用的命令。
使用pkill踢出從遠(yuǎn)程登錄到本機(jī)的用戶,終止pts/0上所有進(jìn)程, 并且bash也結(jié)束(用戶被強(qiáng)制退出)

pkill name 批量干掉程序
通過服務(wù)名稱殺掉進(jìn)程

管理后臺(tái)進(jìn)程
什么是后臺(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)行。
我們?yōu)槭裁匆獙⑦M(jìn)程放入后臺(tái)運(yùn)行
比如:我們此前在國(guó)內(nèi)服務(wù)器往國(guó)外服務(wù)器傳輸大文件時(shí),由于網(wǎng)絡(luò)的問題需要傳輸很久,如果在傳輸?shù)倪^程中出現(xiàn)網(wǎng)絡(luò)抖動(dòng)或者不小心關(guān)閉了終端則會(huì)導(dǎo)致傳輸失敗,如果能將傳輸?shù)倪M(jìn)程放入后臺(tái),是不是就能解決此類問題了
使用什么工具將進(jìn)程放入后臺(tái)
早期的時(shí)候大家都選擇使用&符號(hào)將進(jìn)程放入后臺(tái),然后在使用jobs、bg、fg等方式查看進(jìn)程狀態(tài),但太麻煩了。也不直觀,所以我們推薦使用screen
screen shi使用方法
-S 創(chuàng)建一個(gè)后臺(tái)窗口
ctul +a+d 退出 保持后臺(tái) 運(yùn)行
-list 查看后臺(tái)窗口有幾個(gè)
-r 進(jìn)入后臺(tái)窗口
exit 退出
安裝

開啟一個(gè)screen窗口,指定名稱

在screen窗口中執(zhí)行任務(wù)即可

平滑的退出screen,但不會(huì)終止screen中的任務(wù)。注意: 如果使用exit 才算真的關(guān)閉screen窗口

查看當(dāng)前正在運(yùn)行的screen有哪些

進(jìn)入正在運(yùn)行的screen

停止退出

進(jìn)程的優(yōu)先級(jí)
什么是優(yōu)先級(jí)
優(yōu)先級(jí)指的是優(yōu)先享受資源,比如排隊(duì)買票時(shí),軍人優(yōu)先、老人優(yōu)先。等等
為什么要有系統(tǒng)優(yōu)先級(jí)
舉個(gè)例子: 海底撈火鍋正常情況下響應(yīng)就特別快,那么當(dāng)節(jié)假日來臨時(shí)人員突增則會(huì)導(dǎo)致處理請(qǐng)求特別慢,那么假設(shè)我是海底撈VIP客戶(最高優(yōu)先級(jí)),無論門店多么繁忙,我都不用排隊(duì),海底撈人員會(huì)直接服務(wù)于我,滿足我的需求。至于沒有VIP的人員(較低優(yōu)先級(jí))則進(jìn)入排隊(duì)等待狀態(tài)。(PS: 至于等多久,那.....)
系統(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í)
使用top可以查看nice優(yōu)先級(jí)。
NI: 實(shí)際nice級(jí)別,默認(rèn)是0。
PR: 顯示nice值,-20映射到0,+19映射到39

使用ps查看進(jìn)程優(yōu)先級(jí)

nice指定程序的優(yōu)先級(jí)。語(yǔ)法格式 nice -n 優(yōu)先級(jí)數(shù)字 進(jìn)程名稱
-n 指定優(yōu)先級(jí)

renice命令修改一個(gè)正在運(yùn)行的進(jìn)程優(yōu)先級(jí)
語(yǔ)法格式 renice -n 優(yōu)先級(jí)數(shù)字 進(jìn)程pid
查看sshd進(jìn)程當(dāng)前的優(yōu)先級(jí)狀態(tài)

調(diào)整sshd主進(jìn)程的優(yōu)先級(jí)

調(diào)整之后記得退出終端

當(dāng)再次登陸sshd服務(wù),會(huì)由主進(jìn)程fork子進(jìn)程(那么子進(jìn)程會(huì)繼承主進(jìn)程的優(yōu)先級(jí))

系統(tǒng)平均負(fù)載[進(jìn)階]
每次發(fā)現(xiàn)系統(tǒng)變慢時(shí),我們通常做的第一件事,就是執(zhí)行 top 或者 uptime 命令,來了解系統(tǒng)的負(fù)載情況。比如像下面這樣,我在命令行里輸入了 uptime 命令,系統(tǒng)也隨即給出了結(jié)果。

什么是平均負(fù)載
平均負(fù)載是指單位時(shí)間內(nèi),系統(tǒng)處于可運(yùn)行狀態(tài)和不可中斷狀態(tài)的平均進(jìn)程數(shù),也就是平均活躍進(jìn)程數(shù), PS: 平均負(fù)載與 CPU 使用率并沒有直接關(guān)系。
可運(yùn)行狀態(tài)和不可中斷狀態(tài)是什么
可運(yùn)行狀態(tài)進(jìn)程,是指正在使用 CPU 或者正在等待 CPU 的進(jìn)程,也就是我們ps 命令看到處于 R 狀態(tài)的進(jìn)程
不可中斷進(jìn)程,(你做什么事情的時(shí)候是不能打斷的?) 系統(tǒng)中最常見的是等待硬件設(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ù)不一致的問題。所以,不可中斷狀態(tài)實(shí)際上是系統(tǒng)對(duì)進(jìn)程和硬件設(shè)備的一種保護(hù)機(jī)制。
劃重點(diǎn),因此你可以簡(jiǎn)單理解為,平均負(fù)載其實(shí)就是單位時(shí)間內(nèi)的活躍進(jìn)程數(shù)
那平均負(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
平均負(fù)載案例分析實(shí)戰(zhàn)
下面,我們以三個(gè)示例分別來看這三種情況,并用 stress、mpstat、pidstat 等工具,找出平均負(fù)載升高的根源。
stress 是 Linux 系統(tǒng)壓力測(cè)試工具,這里我們用作異常進(jìn)程模擬平均負(fù)載升高的場(chǎng)景。
mpstat 是多核 CPU 性能分析工具,用來實(shí)時(shí)查看每個(gè) CPU 的性能指標(biāo),以及所有 CPU 的平均指標(biāo)。
pidstat 是一個(gè)常用的進(jìn)程性能分析工具,用來實(shí)時(shí)查看進(jìn)程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)
場(chǎng)景一:CPU 密集型進(jìn)程
首先,我們?cè)诘谝粋€(gè)終端運(yùn)行 stress 命令,模擬一個(gè) CPU 使用率 100% 的場(chǎng)景:

接著,在第二個(gè)終端運(yùn)行 uptime 查看平均負(fù)載的變化情況
使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負(fù)載會(huì)持續(xù)升高)

最后,在第三個(gè)終端運(yùn)行 mpstat 查看 CPU 使用率的變化情況
-P ALL 表示監(jiān)控所有 CPU,后面數(shù)字 5 表示間隔 5 秒后輸出一組數(shù)據(jù)

從終端二中可以看到,1 分鐘的平均負(fù)載會(huì)慢慢增加到 1.00,而從終端三中還可以看到,正好有一個(gè) CPU 的使用率為 100%,但它的 iowait 只有 0。這說明,平均負(fù)載的升高正是由于 CPU 使用率為 100% 。那么,到底是哪個(gè)進(jìn)程導(dǎo)致了 CPU 使用率為 100% 呢?可以使用 pidstat 來查詢
間隔 5 秒后輸出一組數(shù)據(jù)

場(chǎng)景二:I/O 密集型進(jìn)程
首先還是運(yùn)行 stress 命令,但這次模擬 I/O 壓力,即不停地執(zhí)行 sync

然后在第二個(gè)終端運(yùn)行 uptime 查看平均負(fù)載的變化情況:

最后第三個(gè)終端運(yùn)行 mpstat 查看 CPU 使用率的變化情況:
顯示所有 CPU 的指標(biāo),并在間隔 5 秒輸出一組數(shù)據(jù)

那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么高呢?我們還是用 pidstat 來查詢
間隔 5 秒后輸出一組數(shù)據(jù),-u 表示 CPU 指標(biā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)程。
首先,我們還是使用 stress,但這次模擬的是 4 個(gè)進(jìn)程

由于系統(tǒng)只有 1 個(gè) CPU,明顯比 4 個(gè)進(jìn)程要少得多,因而,系統(tǒng)的 CPU 處于嚴(yán)重過載狀態(tài)

然后,再運(yùn)行 pidstat 來看一下進(jìn)程的情況:
間隔 5 秒后輸出一組數(shù)據(jù)

可以看出,4 個(gè)進(jìn)程在爭(zhēng)搶 1 個(gè) CPU,每個(gè)進(jìn)程等待 CPU 的時(shí)間(也就是代碼塊中的 %wait 列)高達(dá) 75%。這些超出 CPU 計(jì)算能力的進(jìn)程,最終導(dǎo)致 CPU 過載。
分析完這三個(gè)案例,我再來歸納一下平均負(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ù)載的來源