Day21 筆記總結(jié)

如何管理進(jìn)程kill、killall、pkill

1.kill 正常停止 平滑重啟 強(qiáng)制停止

kill PID 正常停止一個(gè)程序
發(fā)送停止信號(hào),當(dāng)然nginx 服務(wù)有停止的腳本 systemctl stop
nginx

image.png

kill -1 PID 平滑重載配置文件

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

image.png

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)行停止可能同步不完整,后開啟失敗

image.png

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)制退出)

image.png

pkill name 批量干掉程序

通過服務(wù)名稱殺掉進(jìn)程

image.png

管理后臺(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 退出
安裝


image.png

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


image.png

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


image.png

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


image.png

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


image.png

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


image.png

停止退出


image.png

進(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

image.png

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

image.png

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

-n 指定優(yōu)先級(jí)


image.png

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)


image.png

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


image.png

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


image.png

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


image.png

系統(tǒng)平均負(fù)載[進(jìn)階]

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

image.png

什么是平均負(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)景:


image.png

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

使用watch -d 參數(shù)表示高亮顯示變化的區(qū)域(注意負(fù)載會(huì)持續(xù)升高)

image.png

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

image.png

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

間隔 5 秒后輸出一組數(shù)據(jù)

image.png

場(chǎng)景二:I/O 密集型進(jìn)程

首先還是運(yùn)行 stress 命令,但這次模擬 I/O 壓力,即不停地執(zhí)行 sync

image.png

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

image.png

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

image.png

那么到底是哪個(gè)進(jìn)程,導(dǎo)致 iowait 這么高呢?我們還是用 pidstat 來查詢

間隔 5 秒后輸出一組數(shù)據(jù),-u 表示 CPU 指標(biāo)

image.png

場(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)程

image.png

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

image.png

然后,再運(yùn)行 pidstat 來看一下進(jìn)程的情況:

間隔 5 秒后輸出一組數(shù)據(jù)

image.png

可以看出,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ù)載的來源

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.管理進(jìn)程狀態(tài) 當(dāng)程序運(yùn)行為進(jìn)程后,如果希望停止進(jìn)程, 那么此時(shí)我們可以使用linux的kill命令對(duì)進(jìn)程發(fā)送關(guān)...
    但若歸去若已晚閱讀 560評(píng)論 0 0
  • 1.管理進(jìn)程狀態(tài) 當(dāng)程序運(yùn)行為進(jìn)程后,如果希望停止進(jìn)程, 那么此時(shí)我們可以使用linux的 kill 命令對(duì)進(jìn)程發(fā)...
    記不住的悔閱讀 494評(píng)論 0 0
  • 1.管理進(jìn)程狀態(tài) 當(dāng)程序運(yùn)行為進(jìn)程后,如果希望停止進(jìn)程,那么此時(shí)我們可以使用linux的kill命令對(duì)進(jìn)程發(fā)送關(guān)閉...
    zander815閱讀 351評(píng)論 0 0
  • 管理進(jìn)程狀態(tài) 當(dāng)程序運(yùn)行為進(jìn)程后,如果希望停止進(jìn)程,怎么辦呢? 那么此時(shí)我們可以使用linux的kill命令對(duì)進(jìn)程...
    wiapr閱讀 203評(píng)論 0 1
  • 如果管理進(jìn)程kill、killall、pkill kill 正常停止 平滑重啟 強(qiáng)制停止 kill PID 正常停...
    智銳閱讀 121評(píng)論 0 1

友情鏈接更多精彩內(nèi)容