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