學(xué)習(xí)目標(biāo)
1、了解進(jìn)程和程序的關(guān)系
2、了解進(jìn)程的特點(diǎn)
3、能夠使用top動(dòng)態(tài)查看進(jìn)程信息
4、能夠使用ps靜態(tài)查看進(jìn)程信息
5、能夠使用kill命令給進(jìn)程發(fā)送信號(hào)
在運(yùn)維的日常工作中,監(jiān)視系統(tǒng)的運(yùn)行狀況是每天例行的工作,在 Windows 中我們可以很直觀的使用"任務(wù)管理器"來進(jìn)行進(jìn)程管理,了解系統(tǒng)的運(yùn)行狀態(tài)。
通常,使用"任務(wù)管理器"主要有 3 個(gè)目的:
1. 利用"應(yīng)用程序"和"進(jìn)程"標(biāo)簽來査看系統(tǒng)中到底運(yùn)行了哪些程序和進(jìn)程;
2. 利用"性能"和"用戶"標(biāo)簽來判斷服務(wù)器的健康狀態(tài);
3. 在"應(yīng)用程序"和"進(jìn)程"標(biāo)簽中強(qiáng)制中止任務(wù)和進(jìn)程;
在工作中,我們很少會(huì)用到Linux的圖形化界面,更多時(shí)候會(huì)使用命令進(jìn)行進(jìn)程管理,但是進(jìn)程管理的主要目的是一樣的,即:
查看系統(tǒng)中運(yùn)行的程序和進(jìn)程
判斷服務(wù)器的健康狀態(tài)
停止不需要的進(jìn)程
進(jìn)程是正在執(zhí)行的一個(gè)程序或命令,每個(gè)進(jìn)程都是一個(gè)運(yùn)行的實(shí)體,并占用一定的系統(tǒng)資源。程序是人使用計(jì)算機(jī)語(yǔ)言編寫的可以實(shí)現(xiàn)特定目標(biāo)或解決特定問題的代碼集合。
簡(jiǎn)單來說,程序是人使用計(jì)算機(jī)語(yǔ)言編寫的,可以實(shí)現(xiàn)一定功能,并且可以執(zhí)行的代碼集合。進(jìn)程是正在執(zhí)行中的程序。
舉例:谷歌瀏覽器是一個(gè)程序,當(dāng)我們打開谷歌瀏覽器,就會(huì)在系統(tǒng)中看到一個(gè)瀏覽器的進(jìn)程,當(dāng)程序被執(zhí)行時(shí),程序的代碼都會(huì)被加載入內(nèi)存,操作系統(tǒng)給這個(gè)進(jìn)程分配一個(gè) ID,稱為 PID(進(jìn)程 ID)。我們打開多個(gè)谷歌瀏覽器,就有多個(gè)瀏覽器子進(jìn)程,但是這些進(jìn)程使用的程序,都是chrome。推薦了解linux云計(jì)算+運(yùn)維開發(fā)課程。
進(jìn)程查看,通過查看,判斷健康狀態(tài)
進(jìn)程終止
進(jìn)程優(yōu)先級(jí)控制
工作場(chǎng)景:
小黑入職到一家公司,接到的第一項(xiàng)任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。
命令:top
作用:查看服務(wù)器的進(jìn)程占的資源(100%使用)
語(yǔ)法:# top (動(dòng)態(tài)顯示)
交換操作快捷鍵:
M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進(jìn)行降序排列;
P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進(jìn)行降序排列;
1 :當(dāng)服務(wù)器擁有多個(gè)cpu 的時(shí)候可以使用“1”快捷鍵來切換是否展示顯示各個(gè)cpu 的詳細(xì)信息;
q:退出
用法一:top
示例代碼:
含義:查看CPU使用情況
①第一行
| 內(nèi) 容 | 說 明 |
| ----------------------------- | ------------------------------------------------------------ |
| 10:12:28 | 系統(tǒng)當(dāng)前時(shí)間 |
| up 13:05 | 系統(tǒng)的運(yùn)行時(shí)間.本機(jī)己經(jīng)運(yùn)行 13 小時(shí) 05 分鐘 |
| 2 users | 當(dāng)前登錄了兩個(gè)用戶 |
| load average: 0.00,0.01,0.05 | 系統(tǒng)在之前 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載。如果 CPU 是單核的,則這個(gè)數(shù)值超過 1 就是高負(fù)載:如果 CPU 是四核的,則這個(gè)數(shù)值超過 4 就是高負(fù)載 |
②第二行
| Tasks: 230 total | 系統(tǒng)中的進(jìn)程總數(shù) |
| ------------------ | ------------------------------------------------ |
| 1 running | 正在運(yùn)行的進(jìn)程數(shù) |
| 229 sleeping | 睡眠的進(jìn)程數(shù) |
| 0 stopped | 正在停止的進(jìn)程數(shù) |
| 0 zombie | 僵尸進(jìn)程數(shù)。如果不是 0,則需要手工檢查僵尸進(jìn)程 |
③第三行
| 內(nèi) 容 | 說 明 |
| --------------- | ------------------------------------------------------------ |
| Cpu(s): 0.1 %us | 用戶模式占用的 CPU 百分比 |
| 0.1%sy | 系統(tǒng)模式占用的 CPU 百分比 |
| 0.0%ni | 改變過優(yōu)先級(jí)的用戶進(jìn)程占用的 CPU 百分比 |
| 99.7%id | 空閑 CPU 占用的 CPU 百分比 |
| 0.1%wa | 等待輸入/輸出的進(jìn)程占用的 CPU 百分比 |
| 0.0%hi | 硬中斷請(qǐng)求服務(wù)占用的 CPU 百分比 |
| 0.1%si | 軟中斷請(qǐng)求服務(wù)占用的 CPU 百分比 |
| 0.0%st | st(steal time)意為虛擬時(shí)間百分比,就是當(dāng)有虛擬機(jī)時(shí),虛擬 CPU 等待實(shí)際 CPU 的時(shí)間百分比 |
問題:如果我的機(jī)器有4核CPU,我想查看每一核心分別的負(fù)載情況怎能辦?
答:交換快捷鍵 “1”
④第四行
| ------------------ | ------------------------------------------------------------ |
| Mem: 1863252 total | 物理內(nèi)存的總量,單位為KB |
| 829960 used | 己經(jīng)使用的物理內(nèi)存數(shù)量 |
| 68352 free | 空閑的物理內(nèi)存數(shù)量。我們使用的是虛擬機(jī),共分配了 628MB內(nèi)存,所以只有53MB的空閑內(nèi)存 |
| 96490 buff/cache | 作為緩沖的內(nèi)存數(shù)量 |
⑤第五行
| ------------------- | ---------------------------- |
| Swap: 2097148 total | 交換分區(qū)(虛擬內(nèi)存)的總大小 |
| 3336 used | 已經(jīng)使用的交換分區(qū)的大小 |
| 2093812 free | 空閑交換分區(qū)的大小 |
| 622420 avail Mem | 可用內(nèi)存 |
我們通過 top 命令的整體信息部分,就可以判斷服務(wù)器的健康狀態(tài)。如果 1 分鐘、5 分鐘、15 分鐘的平均負(fù)載高于CPU核數(shù),說明系統(tǒng)壓力較大。如果物理內(nèi)存的空閑內(nèi)存過小,則也證明系統(tǒng)壓力較大。
問題:根據(jù)以上信息,目前我們的系統(tǒng)壓力如何?
問題:如果我們發(fā)現(xiàn)CPU負(fù)載過大,接下來怎么辦?
2)進(jìn)程信息:
| PID | 進(jìn)程的 ID。 |
| ------- | ------------------------------------------------------------ |
| USER | 該進(jìn)程所屬的用戶。 |
| PR | 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。 |
| NI | 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。 |
| VIRT | 該進(jìn)程使用的虛擬內(nèi)存的大小,單位為 KB。 |
| RES | 該進(jìn)程使用的物理內(nèi)存的大小,單位為 KB。 |
| SHR | 共享內(nèi)存大小,單位為 KB。計(jì)算一個(gè)進(jìn)程實(shí)際使用的內(nèi)存 = 常駐內(nèi)存(RES)- 共享內(nèi)存(SHR) |
| S | 進(jìn)程狀態(tài)。其中S 表示睡眠,R 表示運(yùn)行 |
| %CPU | 該進(jìn)程占用 CPU 的百分比。 |
| %MEM | 該進(jìn)程占用內(nèi)存的百分比。 |
| TIME+ | 該進(jìn)程共占用的 CPU 時(shí)間。 |
| COMMAND | 進(jìn)程名 |
問題:如果我們發(fā)現(xiàn)CPU負(fù)載過大,接下來怎么辦?
答:查看占用CPU最多的進(jìn)程
問題:如何查看占用CPU最多的進(jìn)程?
答:交互操作快捷鍵P,P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進(jìn)行降序排列
問題:如果我們發(fā)現(xiàn)內(nèi)存可用量很小,接下來怎么辦?
答:查看占用內(nèi)存最多的進(jìn)程,使用交互快捷鍵M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進(jìn)行降序排列
問題:當(dāng)我們查看完系統(tǒng)狀態(tài),需要做什么?
答:退出,使用q,按鍵盤上的q,就會(huì)回到#提示符的狀態(tài)。
命令:free
作用:查看內(nèi)存使用情況
語(yǔ)法:#free -m
選項(xiàng):-m 表示以mb為單位查看(1g = 1024mb,1mb = 1024kb)
用法一:free -m
示例代碼:
#free -m
含義:查看內(nèi)存使用情況
和Centos6相比,buffer和cached被合成一組,加入了一個(gè)available。
關(guān)于此available,即系統(tǒng)可用內(nèi)存,用戶不需要去計(jì)算buffer/cache,即可以看到還有多少內(nèi)存可用,更加簡(jiǎn)單直觀。
第1行Mem數(shù)據(jù):
total 內(nèi)存總數(shù): 1819
used 已經(jīng)使用的內(nèi)存數(shù): 774
free 空閑的內(nèi)存數(shù): 152
shared 共享內(nèi)存數(shù): 77
buff/Cache塊設(shè)備緩存區(qū)內(nèi)存數(shù): 892
available可用內(nèi)存: 746
第2行數(shù)據(jù)是Swap交換分區(qū),也就是我們通常所說的虛擬內(nèi)存??梢栽趦?nèi)存不夠使用的情況下當(dāng)臨時(shí)內(nèi)存來使用,交換分區(qū)并不是越大越好,一般話它就等同于實(shí)際內(nèi)存的大小。
命令:df
作用:查看磁盤的空間(disk free)
語(yǔ)法:# df [-h]
選項(xiàng):-h表示可讀性較高的形式展示大小
這幾列依次是:
| Filesystem | 磁盤名稱 |
| ---------- | ---------------------------------- |
| Size | 總大小 |
| Used | 被使用的大小 |
| Avail | 剩余大小 |
| Use% | 使用百分比 |
| Mounted on | 掛載路徑(相當(dāng)于Windows 的磁盤符) |
回到開始的工作場(chǎng)景:
小黑入職到一家公司,接到的第一項(xiàng)任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。
問題:小黑具體應(yīng)該如何監(jiān)控CPU,內(nèi)存和磁盤?
命令:ps(process show進(jìn)程顯示)
語(yǔ)法:ps [參數(shù)選項(xiàng)]
作用:主要是查看服務(wù)器的進(jìn)程信息
選項(xiàng)含義:
-e:等價(jià)于“-A”,表示列出全部(all)的進(jìn)程
-f : 表示full,顯示全部的列(顯示全字段)
| UID | 該進(jìn)程執(zhí)行的用戶ID |
| ----- | ------------------------------------------------------------ |
| PID | 進(jìn)程ID |
| PPID | 該進(jìn)程的父級(jí)進(jìn)程ID,如果找不到,則該進(jìn)程就被稱之為僵尸進(jìn)程(Parent Process ID) |
| C | Cpu的占用率,其形式是百分?jǐn)?shù) |
| STIME | 進(jìn)程的啟動(dòng)時(shí)間 |
| TTY | 終端設(shè)備,發(fā)起該進(jìn)程的設(shè)備識(shí)別符號(hào),如果顯示“?”則表示該進(jìn)程并不是由終端設(shè)備發(fā)起 |
| TIME | 進(jìn)程實(shí)際使用CPU的時(shí)間 |
| CMD | 該進(jìn)程的名稱或者對(duì)應(yīng)的路徑 |
工作場(chǎng)景
小黑用學(xué)到的命令,發(fā)現(xiàn)某個(gè)進(jìn)程占用CPU很高,希望進(jìn)一步查看這個(gè)簡(jiǎn)稱的信息。
ps -ef 會(huì)列出全部進(jìn)程,但是我們發(fā)現(xiàn)進(jìn)程非常多,我們很難找到自己想要看的進(jìn)程。這里需要使用過濾命令grep,來過濾掉我們不需要的信息。
用法:ps -ef |grep 想要看到的進(jìn)程名
示例代碼:
#ps -ef |grep crond
含義:查看crond進(jìn)程的詳細(xì)情況
注意:查詢結(jié)果中,如果只有一條則表示沒查到對(duì)應(yīng)的進(jìn)程(這1 條表示剛才ps 指令的自身)。只有查到的結(jié)果多余1 條,才表示有對(duì)應(yīng)的進(jìn)程。
補(bǔ)充:針對(duì)上述情況的優(yōu)化:如果沒有對(duì)應(yīng)的進(jìn)程,則什么都不顯示。
思路:在現(xiàn)有的基礎(chǔ)之上再次使用管道去處理下(-v 選項(xiàng)表示“排除”)。
擴(kuò)展:ps auxBSD格式命令,注意沒有橫杠"-"
Unix有很多分支,目前主流的顯示風(fēng)格分為System V和BSD,我們之前使用的ps -ef屬于system V風(fēng)格,ps aux是BSD風(fēng)格,大家可以理解為兩種風(fēng)格只是顯示不同。
USER:該 process 屬于哪個(gè)使用者賬號(hào)
PID :該 process 的ID
%CPU:該 process 使用掉的 CPU 資源百分比
%MEM:該 process 所占用的物理內(nèi)存百分比
VSZ :該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
RSS :該 process 占用的固定的內(nèi)存量 (Kbytes)
TTY :該 process 是在那個(gè)終端機(jī)上面運(yùn)作,若與終端機(jī)無(wú)關(guān),則顯示 ?,另外, tty1-tty6 是本機(jī)上面的登入者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進(jìn)主機(jī)的程序。
STAT:該程序目前的狀態(tài),主要的狀態(tài)有
R :該程序目前正在運(yùn)作,或者是可被運(yùn)作
S :該程序目前正在睡眠當(dāng)中 (可說是 idle 狀態(tài)),但可被某些訊號(hào) (signal) 喚醒。
T :該程序目前正在偵測(cè)或者是停止了
Z :該程序應(yīng)該已經(jīng)終止,但是其父程序卻無(wú)法正常的終止他,造成 zombie (疆尸) 程序的狀態(tài)
START:該 process 被觸發(fā)啟動(dòng)的時(shí)間
TIME :該 process 實(shí)際使用 CPU 運(yùn)作的時(shí)間
COMMAND:該程序的實(shí)際指令
5、netstat查看進(jìn)程網(wǎng)絡(luò)訪問
命令:netstat
作用:查看網(wǎng)絡(luò)連接狀態(tài)
語(yǔ)法:netstat -tnlp
選項(xiàng):
-t:表示只列出tcp 協(xié)議的連接;
-n:表示將地址從字母組合轉(zhuǎn)化成ip 地址,將協(xié)議轉(zhuǎn)化成端口號(hào)來顯示;
-l :表示過濾出"state(狀態(tài))"列中其值為L(zhǎng)ISTEN(監(jiān)聽)的連接;
-p:表示顯示發(fā)起連接的進(jìn)程pid 和進(jìn)程名稱;
Protocol:協(xié)議(tcp、upd、http、https、icmp、ssh…)
Receive:接收
Send:發(fā)送
Local Address:本地地址
Foreign:遠(yuǎn)程地址
State:狀態(tài),LISTEN表示偵聽來自遠(yuǎn)方的TCP端口的連接請(qǐng)求
PID/Program name:進(jìn)程ID和程序名
命令:kill
語(yǔ)法:kill [信號(hào)] PID
作用:kill 命令會(huì)向操作系統(tǒng)內(nèi)核發(fā)送一個(gè)信號(hào)(多是終止信號(hào))和目標(biāo)進(jìn)程的 PID,然后系統(tǒng)內(nèi)核根據(jù)收到的信號(hào)類型,對(duì)指定進(jìn)程進(jìn)行相應(yīng)的操作
信號(hào)種類:
| 信號(hào)編號(hào) | 含義 |
| -------- | ---------------------------------------- |
| 9 | 殺死進(jìn)程,即強(qiáng)制結(jié)束進(jìn)程。 |
| 15 | 正常結(jié)束進(jìn)程,是 kill 命令的默認(rèn)信號(hào)。 |
用法一:kill [信號(hào)編號(hào)] PID
示例代碼:
#ps -ef |grep crond
查詢crond進(jìn)程信息,想知道它的PID,以便使用kill終止進(jìn)程
#kill 6925
結(jié)束6925的進(jìn)程,這里使用默認(rèn)信號(hào),正常結(jié)束,如果強(qiáng)制結(jié)束,就是kill -9 6925
#ps -ef |grep crond
查詢crond進(jìn)程信息,這次查詢是為了確認(rèn)crond進(jìn)程是否被終止了,我們發(fā)現(xiàn)6925進(jìn)程已經(jīng)沒有了
#systemctl start crond
使用前面學(xué)過的systemctl命令,重啟crond服務(wù)
#ps -ef |grep crond
查詢crond進(jìn)程信息,這次查詢是為了確認(rèn)crond進(jìn)程已經(jīng)重新啟動(dòng)了,我們看到多了一個(gè)32934的進(jìn)程,表明crond已經(jīng)啟動(dòng),并且進(jìn)程ID變化了,這是一個(gè)新的進(jìn)程
備注:在互聯(lián)網(wǎng)中,經(jīng)??吹絢ill -9 進(jìn)程PID,強(qiáng)制殺死某個(gè)進(jìn)程,kill -l
命令:killall
作用:通過程序的==進(jìn)程名==來殺死==一類==進(jìn)程
語(yǔ)法:# killall [信號(hào)] 進(jìn)程名稱
信號(hào)種類:和kill相同,這里不再重復(fù)
用法一:killall [信號(hào)編號(hào)] 進(jìn)程名
示例代碼:
#ps -ef |grep crond
查詢crond進(jìn)程信息,想知道它的進(jìn)程名,以便使用killall終止進(jìn)程
#kill 6925
結(jié)束6925的進(jìn)程,這里使用默認(rèn)信號(hào),正常結(jié)束,如果強(qiáng)制結(jié)束,就是kill -9 6925
1、什么是進(jìn)程優(yōu)先級(jí)?
Linux是一個(gè)多用戶、多任務(wù)的操作系統(tǒng),系統(tǒng)中通常運(yùn)行著非常多的進(jìn)程。哪些進(jìn)程先運(yùn)行,哪些進(jìn)程后運(yùn)行,就由進(jìn)程優(yōu)先級(jí)來控制
PR 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。
NI 優(yōu)先級(jí),數(shù)值越小優(yōu)先級(jí)越高。
問題:這兩個(gè)數(shù)值是在哪里看到的?
答:
3、調(diào)整進(jìn)程優(yōu)先級(jí)
① 調(diào)整==正在運(yùn)行==進(jìn)程的優(yōu)先級(jí)(renice)
1)使用top按"r"來調(diào)整
如果要改變某個(gè)進(jìn)程的優(yōu)先級(jí),就要利用 "r" 交互命令。
改變NICE--->PR
優(yōu)先級(jí)的范圍:
-20——19 數(shù)字越低,優(yōu)先級(jí)越高,系統(tǒng)會(huì)按照更多的cpu時(shí)間給該進(jìn)程
注意:我們能夠修改的只有 Ni 的優(yōu)先級(jí),而不能修改 Pr 的優(yōu)先級(jí)。
步驟1:運(yùn)行top命令,按r,會(huì)提示輸入希望修改優(yōu)先級(jí)的進(jìn)程的PID,這里輸入6451,表示想修改firewalld進(jìn)程的優(yōu)先級(jí)
步驟2:輸入6451后回車,提示希望修改的具體數(shù)字,這個(gè)數(shù)字是從-20到19,這里輸入5,數(shù)字越大,優(yōu)先級(jí)別越低,所以,這里是降低了firewalld的優(yōu)先級(jí)
步驟3:輸入5后,按回車,會(huì)發(fā)現(xiàn)6451進(jìn)程的NI, 從0變成了5,PR從20變成了25
2)命令行使用renice調(diào)整
命令:renice
語(yǔ)法:renice [NI優(yōu)先級(jí)設(shè)置的數(shù)字] 想調(diào)整的進(jìn)程ID
[root@localhost ~]# renice -5 6451
含義:將6451進(jìn)程的NI優(yōu)先級(jí)設(shè)置為-5,實(shí)際效果是提高了6451進(jìn)程的優(yōu)先級(jí)
注意:這里的-5代表設(shè)置成-5,不是所謂加減的關(guān)系,如果當(dāng)前NI的值是10,當(dāng)設(shè)置成-5后,NI的值會(huì)變?yōu)?5.
② 程序啟動(dòng)時(shí)指定優(yōu)先級(jí)(nice),只能調(diào)整不在運(yùn)行的程序。
步驟1:將程序停止
步驟2:?jiǎn)?dòng)并制定優(yōu)先級(jí)
步驟3:確認(rèn)優(yōu)先級(jí)(查看優(yōu)先級(jí))
命令:nice
語(yǔ)法:nice [NI優(yōu)先級(jí)設(shè)置的數(shù)字] 想調(diào)整的進(jìn)程名
啟動(dòng)進(jìn)程時(shí),通常會(huì)繼承父進(jìn)程的 nice級(jí)別,默認(rèn)為0
#ps -ef |grep crond
含義:查看crond的進(jìn)程信息
目的:找出crond的PID,用于結(jié)束進(jìn)程
#kill -9 crond的進(jìn)程ID
含義:結(jié)束crond的進(jìn)程
目的:nice只能修改不在運(yùn)行的進(jìn)程的優(yōu)先級(jí)
#ps -ef |grep crond
含義:查看crond的進(jìn)程信息
目的:確認(rèn)crond進(jìn)程是不是已經(jīng)停止了
#nice -n -5 crond
含義:?jiǎn)?dòng)crond進(jìn)程,將NI設(shè)置成-5
#ps -ef |grep crond
含義:查看crond的進(jìn)程信息
目的:找出crond的PID,用于查看此進(jìn)程的優(yōu)先級(jí)
#top -p crond的進(jìn)程ID