1.管理進程的狀態(tài)
當(dāng)程序運行為進程后掘托,如果希望進程停止,怎么辦呢?那么此時我們可以使用Linux的kill命令對進程發(fā)送關(guān)閉信號忆植。當(dāng)然除了kill之外小渊,還有killall法褥,pkill
1.使用kill -l 列出當(dāng)前系統(tǒng)所支持的信號
雖然linux支持信號很多,但是我們僅列出我們最為常用的3個信號
- 1.我們使用kill命令殺死指定PID的進程酬屉。
1.給 vsftpd 進程發(fā)送信號 1,15
[root@xuliangwei ~]# yum -y install vsftpd
[root@xuliangwei ~]# systemctl start vsftpd
[root@xuliangwei ~]# ps aux|grep vsftpd
2.發(fā)送重載信號半等,例如 vsftpd 的配置文件發(fā)生改變,希望重新加載
[root@xuliangwei ~]# kill -1 9160
3.發(fā)送停止信號呐萨,當(dāng)然vsftpd 服務(wù)有停止的腳本 systemctl stop vsftpd
[root@xuliangwei ~]# kill 9160
4.發(fā)送強制停止信號杀饵,當(dāng)無法停止服務(wù)時,可強制終止信號
[root@xuliangwei ~]# kill -9 9160
- 2.Linux系統(tǒng)中的killall谬擦、pkill命令用于殺死指定名字的進程切距。我們可以使用kill命令殺死指定進程PID的進程,如果要找到我們需要殺死的進程惨远,我們還需要在之前使用ps等命令再配合grep來查找進程谜悟,而killall话肖、pkill把這兩個過程合二為一,是一個很好用的命令葡幸。
例1最筒、通過服務(wù)名稱殺掉進程
[root@xuliangwei ~]# pkill nginx
[root@xuliangwei ~]# killall nginx
例2、使用pkill踢出從遠(yuǎn)程登錄到本機的用戶蔚叨,終止pts/0上所有進程, 并且bash也結(jié)束(用戶被強制退出)
[root@xuliangwei ~]# pkill -9 -t pts/0
2.管理后臺進程
1.什么是后臺進程
通常進程都會在終端前臺運行床蜘,一旦關(guān)閉終端,進程也會隨著結(jié)束蔑水,那么此時我們就希望進程能在后臺運行邢锯,就是將在前臺運行的進程放入后臺運行,這樣及時我們關(guān)閉了終端也不影響進程的正常運行肤粱。
2.為什么我i們要將程序放入后臺
比如:我們此前在國內(nèi)服務(wù)器往國外服務(wù)器傳輸大文件時弹囚,由于網(wǎng)絡(luò)的問題需要傳輸很久,如果在傳輸?shù)倪^程中出現(xiàn)網(wǎng)絡(luò)抖動或者不小心關(guān)閉了終端則會導(dǎo)致傳輸失敗领曼,如果能將傳輸?shù)倪M程放入后臺鸥鹉,是不是就能解決此類問題了。
3.使用什么工具將進程放入后臺
早期的時候大家都選擇使用&符號將進程放入后臺庶骄,然后在使用jobs毁渗、bg、fg等方式查看進程狀態(tài)单刁,但太麻煩了灸异。也不直觀,所以我們推薦使用screen羔飞。
- 1.jobs肺樟、bg、fg的使用(強烈不推薦逻淌,了解即可)
[root@xuliangwei ~]# sleep 3000 & //運行程序(時)么伯,讓其在后臺執(zhí)行
[root@xuliangwei ~]# sleep 4000 //^Z,將前臺的程序掛起(暫停)到后臺
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# ps aux |grep sleep
[root@xuliangwei ~]# jobs //查看后臺作業(yè)
[1]- Running sleep 3000 &
[2]+ Stopped sleep 4000
[root@xuliangwei ~]# bg %2 //讓作業(yè) 2 在后臺運行
[root@xuliangwei ~]# fg %1 //將作業(yè) 1 調(diào)回到前臺
[root@xuliangwei ~]# kill %1 //kill 1,終止 PID 為 1 的進程
[root@xuliangwei ~]# (while :; do date; sleep 2; done) & //進程在后臺運行卡儒,但輸出依然在當(dāng)前終端
[root@xuliangwei ~]# (while :; do date; sleep 2; done) &>/dev/null & - 2.screen的使用(強烈推薦田柔,生產(chǎn)必用)
1.安裝
[root@oldboy ~]# yum install screen -y
2.開啟一個screen窗口,指定名稱
[root@oldboy ~]# screen -S wget_mysql
3.在screen窗口中執(zhí)行任務(wù)即可
4.平滑的退出screen,但不會終止screen中的任務(wù)。注意: 如果使用exit 才算真的關(guān)閉screen窗口
ctrl+a+d
5.查看當(dāng)前正在運行的screen有哪些
[root@oldboy ~]# screen -list
There is a screen on:
22058.wget_mysql (Detached)
1 Socket in /var/run/screen/S-root.
6.進入正在運行的screen
[root@oldboy ~]# screen -r wget_mysql
[root@oldboy ~]# screen -r 22058
3.進程的優(yōu)先級
1.什么是優(yōu)先級
優(yōu)先級指的是優(yōu)先享受資源骨望。
2.為什么要有系統(tǒng)優(yōu)先級
舉個例子: 海底撈火鍋正常情況下響應(yīng)就特別快硬爆,那么當(dāng)節(jié)假日來臨時人員突增則會導(dǎo)致處理請求特別慢,那么假設(shè)我是海底撈VIP客戶(最高優(yōu)先級)擎鸠,無論門店多么繁忙缀磕,我都不用排隊,海底撈人員會直接服務(wù)于我,滿足我的需求虐骑。至于沒有VIP的人員(較低優(yōu)先級)則進入排隊等待狀態(tài)准验。(PS: 至于等多久,那.....)
3.系統(tǒng)中如何給進程配置優(yōu)先級?
在啟動進程時廷没,為不同的進程使用不同的調(diào)度策略。
nice 值越高: 表示優(yōu)先級越低垂寥,例如+19颠黎,該進程容易將CPU 使用量讓給其他進程。
nice 值越低: 表示優(yōu)先級越高滞项,例如-20狭归,該進程更不傾向于讓出CPU。
- 使用top或ps命令查看進程的優(yōu)先級
1.使用top可以查看nice優(yōu)先級文判。 NI: 實際nice級別过椎,默認(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查看進程優(yōu)先級
[root@m01 ~]# ps axo command,nice |grep sshd|grep -v grep
/usr/sbin/sshd -D 0
sshd: root@pts/2 0
- nice指定程序的優(yōu)先級。語法格式 nice -n 優(yōu)先級數(shù)字 進程名稱
1.開啟vim并且指定程序優(yōu)先級為-5
[root@m01 ~]# nice -n -5 vim &
[1] 98417
2.查看該進程的優(yōu)先級情況
[root@m01 ~]# ps axo pid,command,nice |grep 98417
98417 vim -5
- renice命令修改一個正在運行的進程優(yōu)先級赏殃。語法格式 renice -n 優(yōu)先級數(shù)字 進程pid
1.查看sshd進程當(dāng)前的優(yōu)先級狀態(tài)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D 0
2.調(diào)整sshd主進程的優(yōu)先級
[root@m01 ~]# renice -n -20 98002
98002 (process ID) old priority 0, new priority -20
3.調(diào)整之后記得退出終端
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
70840 sshd: root@pts/2 0
98002 /usr/sbin/sshd -D -20
[root@m01 ~]# exit
4.當(dāng)再次登陸sshd服務(wù)敷待,會由主進程fork子進程(那么子進程會繼承主進程的優(yōu)先級)
[root@m01 ~]# ps axo pid,command,nice |grep 折疊shd
98002 /usr/sbin/sshd -D -20
98122 sshd: root@pts/0 -20
4.系統(tǒng)平均的負(fù)載
每次發(fā)現(xiàn)系統(tǒng)變慢時,我們通常做的第一件事仁热,就是執(zhí)行 top 或者 uptime 命令榜揖,來了解系統(tǒng)的負(fù)載情況。比如像下面這樣抗蠢,我在命令行里輸入了 uptime 命令举哟,系統(tǒng)也隨即給出了結(jié)果
[root@m01 ~]# uptime
04:49:26 up 2 days, 2:33, 2 users, load average: 0.70, 0.04, 0.05
我們已經(jīng)比較熟悉前面幾列,它們分別是當(dāng)前時間迅矛、系統(tǒng)運行時間以及正在登錄用戶數(shù)妨猩。
而最后三個數(shù)字呢,依次則是過去 1 分鐘诬乞、5 分鐘册赛、15 分鐘的平均負(fù)載(Load Average)。
1.什么是平均負(fù)載
平均負(fù)載不就是單位時間內(nèi)的 CPU 使用率嗎震嫉?上面的 0.70森瘪,就代表 CPU 使用率是 70%。其實上并.....
那到底如何理解平均負(fù)載: 平均負(fù)載是指單位時間內(nèi)票堵,系統(tǒng)處于可運行狀態(tài)和不可中斷狀態(tài)的平均進程數(shù)扼睬,也就是平均活躍進程數(shù), PS: 平均負(fù)載與 CPU 使用率并沒有直接關(guān)系。
2.可運行狀態(tài)和不可中斷狀態(tài)是什么
1.可運行狀態(tài)進程窗宇,是指正在使用 CPU 或者正在等待 CPU 的進程措伐,也就是我們ps 命令看到處于 R 狀態(tài)的進程。
2.不可中斷進程军俊,(你做什么事情的時候是不能打斷的?) 系統(tǒng)中最常見的是等待硬件設(shè)備的 I/O 響應(yīng)侥加,也就是我們 ps 命令中看到的 D 狀態(tài)(也稱為 Disk Sleep)的進程。
例如: 當(dāng)一個進程向磁盤讀寫數(shù)據(jù)時粪躬,為了保證數(shù)據(jù)的一致性担败,在得到磁盤回復(fù)前,它是不能被其他進程或者中斷打斷的镰官,這個時候的進程就處于不可中斷狀態(tài)提前。如果此時的進程被打斷了,就容易出現(xiàn)磁盤數(shù)據(jù)與進程數(shù)據(jù)不一致的問題泳唠。所以狈网,不可中斷狀態(tài)實際上是系統(tǒng)對進程和硬件設(shè)備的一種保護機制。
劃重點笨腥,因此你可以簡單理解為拓哺,平均負(fù)載其實就是單位時間內(nèi)的活躍進程數(shù)。
3.那平均負(fù)載為多少時合理
最理想的狀態(tài)是每個 CPU 上都剛好運行著一個進程扇雕,這樣每個 CPU 都得到了充分利用拓售。所以在評判平均負(fù)載時,首先你要知道系統(tǒng)有幾個 CPU镶奉,這可以通過 top 命令獲取础淤,或grep 'model name' /proc/cpuinfo
例1、假設(shè)現(xiàn)在在 4哨苛、2鸽凶、1核的CPU上,如果平均負(fù)載為 2 時建峭,意味著什么呢玻侥?
Q1.在4 個 CPU 的系統(tǒng)上,意味著 CPU 有 50% 的空閑亿蒸。
Q2.在2 個 CPU 的系統(tǒng)上凑兰,意味著所有的 CPU 都剛好被完全占用。
Q3.而1 個 CPU 的系統(tǒng)上边锁,則意味著有一半的進程競爭不到 CPU姑食。
PS: 平均負(fù)載有三個數(shù)值,我們應(yīng)該關(guān)注哪個呢?
實際上茅坛,我們都需要關(guān)注音半。就好比上海4月的天氣,如果只看晚上天氣,感覺在過冬天呢曹鸠。但如果你結(jié)合了早上煌茬、中午、晚上三個時間點的溫度來看彻桃,基本就可以全方位了解這一天的天氣情況了坛善。
- 1.如果 1 分鐘、5 分鐘叛薯、15 分鐘的三個值基本相同浑吟,或者相差不大,那就說明系統(tǒng)負(fù)載很平穩(wěn)耗溜。
- 2.但如果 1 分鐘的值遠(yuǎn)小于 15 分鐘的值,就說明系統(tǒng)最近 1 分鐘的負(fù)載在減少省容,而過去 15 分鐘內(nèi)卻有很大的負(fù)載抖拴。
- 3.反過來,如果 1 分鐘的值遠(yuǎn)大于 15 分鐘的值腥椒,就說明最近 1 分鐘的負(fù)載在增加阿宅,這種增加有可能只是臨時性的,也有可能還會持續(xù)上升笼蛛,所以就需要持續(xù)觀察洒放。
PS: 一旦 1 分鐘的平均負(fù)載接近或超過了 CPU 的個數(shù),就意味著系統(tǒng)正在發(fā)生過載的問題滨砍,這時就得分析問題往湿,并要想辦法優(yōu)化了
在來看個例子3、假設(shè)我們在有2個 CPU 系統(tǒng)上看到平均負(fù)載為 2.73惋戏,6.90领追,12.98
那么說明在過去1 分鐘內(nèi),系統(tǒng)有 136% 的超載 (2.73/2=136%)
而在過去 5 分鐘內(nèi)响逢,有 345% 的超載 (6.90/2=345%)
而在過去15 分鐘內(nèi)绒窑,有 649% 的超載,(12.98/2=649%)
但從整體趨勢來看舔亭,系統(tǒng)的負(fù)載是在逐步的降低些膨。
4.那么在實際生產(chǎn)環(huán)境中,平均負(fù)載多高時钦铺,需要我們重點關(guān)注呢订雾?
當(dāng)平均負(fù)載高于 CPU 數(shù)量 70% 的時候,你就應(yīng)該分析排查負(fù)載高的問題了职抡。一旦負(fù)載過高葬燎,就可能導(dǎo)致進程響應(yīng)變慢,進而影響服務(wù)的正常功能。
但 70% 這個數(shù)字并不是絕對的谱净,最推薦的方法窑邦,還是把系統(tǒng)的平均負(fù)載監(jiān)控起來,然后根據(jù)更多的歷史數(shù)據(jù)壕探,判斷負(fù)載的變化趨勢冈钦。當(dāng)發(fā)現(xiàn)負(fù)載有明顯升高趨勢時,比如說負(fù)載翻倍了李请,你再去做分析和調(diào)查瞧筛。5.平均負(fù)載與 CPU 使用率有什么關(guān)系
在實際工作中,我們經(jīng)常容易把平均負(fù)載和 CPU 使用率混淆导盅,所以在這里较幌,我也做一個區(qū)分“追可能你會疑惑乍炉,既然平均負(fù)載代表的是活躍進程數(shù),那平均負(fù)載高了滤馍,不就意味著 CPU 使用率高嗎岛琼?
我們還是要回到平均負(fù)載的含義上來,平均負(fù)載是指單位時間內(nèi)巢株,處于可運行狀態(tài)和不可中斷狀態(tài)的進程數(shù)槐瑞。所以,它不僅包括了正在使用 CPU 的進程阁苞,還包括等待 CPU 和等待 I/O 的進程困檩。
而 CPU 使用率,是單位時間內(nèi) CPU 繁忙情況的統(tǒng)計猬错,跟平均負(fù)載并不一定完全對應(yīng)窗看。比如:
CPU 密集型進程,使用大量 CPU 會導(dǎo)致平均負(fù)載升高倦炒,此時這兩者是一致的显沈;
I/O 密集型進程,等待 I/O 也會導(dǎo)致平均負(fù)載升高逢唤,但 CPU 使用率不一定很高拉讯;
大量等待 CPU 的進程調(diào)度也會導(dǎo)致平均負(fù)載升高,此時的 CPU 使用率也會比較高鳖藕。
- 6.平均負(fù)載案例分析實戰(zhàn)
下面魔慷,我們以三個示例分別來看這三種情況,并用 stress著恩、mpstat院尔、pidstat 等工具蜻展,找出平均負(fù)載升高的根源。
stress 是 Linux 系統(tǒng)壓力測試工具邀摆,這里我們用作異常進程模擬平均負(fù)載升高的場景纵顾。
mpstat 是多核 CPU 性能分析工具,用來實時查看每個 CPU 的性能指標(biāo)栋盹,以及所有 CPU 的平均指標(biāo)施逾。
pidstat 是一個常用的進程性能分析工具,用來實時查看進程的 CPU例获、內(nèi)存汉额、I/O 以及上下文切換等性能指標(biāo)。