學習目標
1、瞭解進程和程序的關係
2、瞭解進程的特點
3、能夠使用top動態查看進程信息
4、能夠使用ps靜態查看進程信息
5、能夠使用kill命令給進程發送信號
6、能夠調整進程的優先級(擴展)
引言
在運維的日常工作中,監視系統的運行狀況是每天例行的工作,在 Windows 中我們可以很直觀的使用"任務管理器"來進行進程管理,瞭解系統的運行狀態
通常,使用"任務管理器"主要有 3 個目的:
- 利用"應用程序"和"進程"標籤來査看系統中到底運行了哪些程序和進程;
- 利用"性能"和"用戶"標籤來判斷服務器的健康狀態;
- 在"應用程序"和"進程"標籤中強制中止任務和進程;
在工作中,我們很少會用到Linux的圖形化界面,更多時候會使用命令進行進程管理,但是進程管理的主要目的是一樣的,即:
查看系統中運行的程序和進程
判斷服務器的健康狀態
停止不需要的進程。
一、相關概念
1、什麼是進程和程序?
進程是正在執行的一個程序或命令,每個進程都是一個運行的實體,並佔用一定的系統資源。程序是人使用計算機語言編寫的可以實現特定目標或解決特定問題的代碼集合。
簡單來說,程序是人使用計算機語言編寫的,可以實現一定功能,並且可以執行的代碼集合。進程是正在執行中的程序。
舉例:谷歌瀏覽器是一個程序,當我們打開谷歌瀏覽器,就會在系統中看到一個瀏覽器的進程,當程序被執行時,程序的代碼都會被加載入內存,操作系統給這個進程分配一個 ID,稱爲 PID(進程 ID)。我們打開多個谷歌瀏覽器,就有多個瀏覽器子進程,但是這些進程使用的程序,都是chrome
2、進程管理的內容
進程查看,通過查看,判斷健康狀態
進程終止
進程優先級控制
二、進程管理命令
工作場景:
小黑入職到一家公司,接到的第一項任務,就是監控生產服務器的性能,提到服務器性能,我們首先想到的就是CPU,內存和磁盤。
1、top查看 CPU使用情況
命令:top
作用:查看服務器的進程佔的資源(100%使用)
語法:# top (動態顯示)
交換操作快捷鍵:
M(大寫):表示將結果按照內存(MEM)從高到低進行降序排列;
P(大寫):,表示將結果按照CPU 使用率從高到低進行降序排列;
1 :當服務器擁有多個cpu 的時候可以使用“1”快捷鍵來切換是否展示顯示各個cpu 的詳細信息;
q:退出
用法一:top
示例代碼:
#top
含義:查看CPU使用情況
1)系統整體信息:
①第一行
②第二行
③第三行
問題:如果我的機器有4核CPU,我想查看每一核心分別的負載情況怎麼辦?
答:交換快捷鍵 “1”
④第四行
⑤第五行
我們通過 top 命令的整體信息部分,就可以判斷服務器的健康狀態。如果 1 分鐘、5 分鐘、15 分鐘的平均負載高於CPU核數,說明系統壓力較大。如果物理內存的空閒內存過小,則也證明系統壓力較大。
問題:根據以上信息,目前我們的系統壓力如何?
問題:如果我們發現CPU負載過大,接下來怎麼辦?
2)進程信息:
問題:如果我們發現CPU負載過大,接下來怎麼辦?
答:查看佔用CPU最多的進程
問題:如何查看佔用CPU最多的進程?
答:交互操作快捷鍵P,P(大寫):,表示將結果按照CPU 使用率從高到低進行降序排列
問題:如果我們發現內存可用量很小,接下來怎麼辦?
答:查看佔用內存最多的進程,使用交互快捷鍵M(大寫):表示將結果按照內存(MEM)從高到低進行降序排列
問題:當我們查看完系統狀態,需要做什麼?
答:退出,使用q,按鍵盤上的q,就會回到#提示符的狀態。
2、free查看內存使用情況
命令: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交換分區,也就是我們通常所說的虛擬內存。可以在內存不夠使用的情況下當臨時內存來使用,交換分區並不是越大越好,一般話它就等同於實際內存的大小。
3、df查看磁盤
命令:df
作用:查看磁盤的空間(disk free)
語法:# df [-h]
選項:-h表示可讀性較高的形式展示大小
這幾列依次是:
回到開始的工作場景:
小黑入職到一家公司,接到的第一項任務,就是監控生產服務器的性能,提到服務器性能,我們首先想到的就是CPU,內存和磁盤。
問題:小黑具體應該如何監控CPU,內存和磁盤?
總結:CPU:
內存:
磁盤:
作業1:課下將總結的部分落實到筆記
4、ps查看進程命令
命令:ps(process show進程顯示)
語法:ps [參數選項]
作用:主要是查看服務器的進程信息
選項含義:
-e:等價於“-A”,表示列出全部(all)的進程
-f : 表示full,顯示全部的列(顯示全字段)
工作場景
小黑用學到的命令,發現某個進程佔用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:該程序的實際指令
5、netstat查看進程網絡訪問
命令:netstat
作用:查看網絡連接狀態
語法:netstat -tnlp
選項:-t:表示只列出tcp 協議的連接;
-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和程序名
6、kill關閉進程
命令:kill
語法:kill [信號] PID
作用:kill 命令會向操作系統內核發送一個信號(多是終止信號)和目標進程的 PID,然後系統內核根據收到的信號類型,對指定進程進行相應的操作
信號種類:
用法一: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
7、killall關閉進程
命令:killall
作用:通過程序的==進程名==來殺死==一類==進程
語法:# killall [信號] 進程名稱
信號種類:和kill相同,這裏不再重複
用法一:killall [信號編號] 進程名
示例代碼:
#ps -ef |grep crond
查詢crond進程信息,想知道它的進程名,以便使用killall終止進程
#kill 6925
結束6925的進程,這裏使用默認信號,正常結束,如果強制結束,就是kill -9 6925
三、進程優先級
1、什麼是進程優先級?
Linux是一個多用戶、多任務的操作系統,系統中通常運行着非常多的進程。哪些進程先運行,哪些進程後運行,就由進程優先級來控制
2、查看進程優先級
PR 優先級,數值越小優先級越高。NI 優先級,數值越小優先級越高。
問題:這兩個數值是在哪裏看到的?
答:
3、調整進程優先級
① 調整==正在運行==進程的優先級(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
含義:使用TOP命令,只查看和crond進程相關的信息