首頁技術(shù)文章正文

監(jiān)控linux系統(tǒng)運行狀態(tài)技巧[linux云計算+運維開發(fā)]

更新時間:2020-03-20 來源:黑馬程序員 瀏覽量:

學(xué)習(xí)目標(biāo)


1、了解進程和程序的關(guān)系
2、了解進程的特點
3、能夠使用top動態(tài)查看進程信息
4、能夠使用ps靜態(tài)查看進程信息
5、能夠使用kill命令給進程發(fā)送信號
引言

在運維的日常工作中,監(jiān)視系統(tǒng)的運行狀況是每天例行的工作,在 Windows 中我們可以很直觀的使用"任務(wù)管理器"來進行進程管理,了解系統(tǒng)的運行狀態(tài)。

通常,使用"任務(wù)管理器"主要有 3 個目的:
1. 利用"應(yīng)用程序"和"進程"標(biāo)簽來査看系統(tǒng)中到底運行了哪些程序和進程;
2. 利用"性能"和"用戶"標(biāo)簽來判斷服務(wù)器的健康狀態(tài);
3. 在"應(yīng)用程序"和"進程"標(biāo)簽中強制中止任務(wù)和進程;

在工作中,我們很少會用到Linux的圖形化界面,更多時候會使用命令進行進程管理,但是進程管理的主要目的是一樣的,即:

查看系統(tǒng)中運行的程序和進程

判斷服務(wù)器的健康狀態(tài)

停止不需要的進程

一、相關(guān)概念

1、什么是進程和程序?

進程是正在執(zhí)行的一個程序或命令,每個進程都是一個運行的實體,并占用一定的系統(tǒng)資源。程序是人使用計算機語言編寫的可以實現(xiàn)特定目標(biāo)或解決特定問題的代碼集合。

簡單來說,程序是人使用計算機語言編寫的,可以實現(xiàn)一定功能,并且可以執(zhí)行的代碼集合。進程是正在執(zhí)行中的程序。
舉例:谷歌瀏覽器是一個程序,當(dāng)我們打開谷歌瀏覽器,就會在系統(tǒng)中看到一個瀏覽器的進程,當(dāng)程序被執(zhí)行時,程序的代碼都會被加載入內(nèi)存,操作系統(tǒng)給這個進程分配一個 ID,稱為 PID(進程 ID)。我們打開多個谷歌瀏覽器,就有多個瀏覽器子進程,但是這些進程使用的程序,都是chrome。推薦了解linux云計算+運維開發(fā)課程。

進程檢測與控制00

進程檢測與控制1.1

2、進程管理的內(nèi)容
進程查看,通過查看,判斷健康狀態(tài)
進程終止
進程優(yōu)先級控制

二、進程管理命令
工作場景:
小黑入職到一家公司,接到的第一項任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。

1、top查看 CPU使用情況
命令:top
作用:查看服務(wù)器的進程占的資源(100%使用)
語法:# top (動態(tài)顯示)
交換操作快捷鍵:
M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進行降序排列;
P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進行降序排列;
1 :當(dāng)服務(wù)器擁有多個cpu 的時候可以使用“1”快捷鍵來切換是否展示顯示各個cpu 的詳細信息;
q:退出

用法一:top
示例代碼:

#top
含義:查看CPU使用情況

進程檢測與控制2.1.0

1)系統(tǒng)整體信息:
①第一行

進程檢測與控制2.1.1.1

| 內(nèi) 容                         | 說 明                                                        |
| ----------------------------- | ------------------------------------------------------------ |
| 10:12:28                      | 系統(tǒng)當(dāng)前時間                                                 |
| up 13:05                      | 系統(tǒng)的運行時間.本機己經(jīng)運行 13 小時 05 分鐘       |
| 2 users                       | 當(dāng)前登錄了兩個用戶                                           |
| load average: 0.00,0.01,0.05 | 系統(tǒng)在之前 1 分鐘、5 分鐘、15 分鐘的平均負載。如果 CPU 是單核的,則這個數(shù)值超過 1 就是高負載:如果 CPU 是四核的,則這個數(shù)值超過 4 就是高負載 |

②第二行

進程檢測與控制2.1.1.2

| Tasks:   230 total | 系統(tǒng)中的進程總數(shù)                                 |
| ------------------ | ------------------------------------------------ |
| 1 running          | 正在運行的進程數(shù)                                 |
| 229 sleeping       | 睡眠的進程數(shù)                                     |
| 0 stopped          | 正在停止的進程數(shù)                                 |
| 0 zombie           | 僵尸進程數(shù)。如果不是   0,則需要手工檢查僵尸進程 |

③第三行

進程檢測與控制2.1.1.3

| 內(nèi) 容           | 說 明                                                        |
| --------------- | ------------------------------------------------------------ |
| Cpu(s): 0.1 %us | 用戶模式占用的   CPU 百分比                                  |
| 0.1%sy          | 系統(tǒng)模式占用的   CPU 百分比                                  |
| 0.0%ni          | 改變過優(yōu)先級的用戶進程占用的   CPU 百分比                    |
| 99.7%id         | 空閑   CPU 占用的 CPU 百分比                                 |
| 0.1%wa          | 等待輸入/輸出的進程占用的   CPU 百分比                       |
| 0.0%hi          | 硬中斷請求服務(wù)占用的   CPU 百分比                            |
| 0.1%si          | 軟中斷請求服務(wù)占用的   CPU 百分比                            |
| 0.0%st          | st(steal   time)意為虛擬時間百分比,就是當(dāng)有虛擬機時,虛擬 CPU 等待實際 CPU 的時間百分比 |

問題:如果我的機器有4核CPU,我想查看每一核心分別的負載情況怎能辦?
答:交換快捷鍵 “1”

進程檢測與控制2.1.1.4

④第四行

進程檢測與控制2.1.1.4.0

| 內(nèi) 容              | 說 明                                                        |
| ------------------ | ------------------------------------------------------------ |
| Mem: 1863252 total | 物理內(nèi)存的總量,單位為KB                                     |
| 829960 used        | 己經(jīng)使用的物理內(nèi)存數(shù)量                                       |
| 68352 free         | 空閑的物理內(nèi)存數(shù)量。我們使用的是虛擬機,共分配了 628MB內(nèi)存,所以只有53MB的空閑內(nèi)存 |
| 96490 buff/cache   | 作為緩沖的內(nèi)存數(shù)量                                           |

⑤第五行

進程檢測與控制2.1.1.5

| 內(nèi) 容               | 說 明                        |
| ------------------- | ---------------------------- |
| 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 分鐘的平均負載高于CPU核數(shù),說明系統(tǒng)壓力較大。如果物理內(nèi)存的空閑內(nèi)存過小,則也證明系統(tǒng)壓力較大。

問題:根據(jù)以上信息,目前我們的系統(tǒng)壓力如何?
問題:如果我們發(fā)現(xiàn)CPU負載過大,接下來怎么辦?

2)進程信息:

進程檢測與控制2.1.2.1

| PID     | 進程的 ID。                                                  |
| ------- | ------------------------------------------------------------ |
| USER    | 該進程所屬的用戶。                                           |
| PR      | 優(yōu)先級,數(shù)值越小優(yōu)先級越高。                                 |
| NI      | 優(yōu)先級,數(shù)值越小優(yōu)先級越高。                                 |
| VIRT    | 該進程使用的虛擬內(nèi)存的大小,單位為 KB。                      |
| RES     | 該進程使用的物理內(nèi)存的大小,單位為 KB。                      |
| SHR     | 共享內(nèi)存大小,單位為 KB。計算一個進程實際使用的內(nèi)存 = 常駐內(nèi)存(RES)- 共享內(nèi)存(SHR) |
| S       | 進程狀態(tài)。其中S 表示睡眠,R 表示運行                         |
| %CPU    | 該進程占用 CPU 的百分比。                                    |
| %MEM    | 該進程占用內(nèi)存的百分比。                                     |
| TIME+   | 該進程共占用的 CPU 時間。                                    |
| COMMAND | 進程名                                                       |

問題:如果我們發(fā)現(xiàn)CPU負載過大,接下來怎么辦?
答:查看占用CPU最多的進程

問題:如何查看占用CPU最多的進程?
答:交互操作快捷鍵P,P(大寫):,表示將結(jié)果按照CPU 使用率從高到低進行降序排列

進程檢測與控制2.1.2.2

問題:如果我們發(fā)現(xiàn)內(nèi)存可用量很小,接下來怎么辦?
答:查看占用內(nèi)存最多的進程,使用交互快捷鍵M(大寫):表示將結(jié)果按照內(nèi)存(MEM)從高到低進行降序排列

進程檢測與控制2.1.2.3

問題:當(dāng)我們查看完系統(tǒng)狀態(tài),需要做什么?
答:退出,使用q,按鍵盤上的q,就會回到#提示符的狀態(tài)。

2、free查看內(nèi)存使用情況
命令:free
作用:查看內(nèi)存使用情況
語法:#free  -m 
選項:-m 表示以mb為單位查看(1g = 1024mb,1mb = 1024kb)

用法一:free -m
示例代碼:
#free -m
含義:查看內(nèi)存使用情況

進程檢測與控制2.1.2.4

和Centos6相比,buffer和cached被合成一組,加入了一個available。
關(guān)于此available,即系統(tǒng)可用內(nèi)存,用戶不需要去計算buffer/cache,即可以看到還有多少內(nèi)存可用,更加簡單直觀。

第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)臨時內(nèi)存來使用,交換分區(qū)并不是越大越好,一般話它就等同于實際內(nèi)存的大小。

3、df查看磁盤

命令:df
作用:查看磁盤的空間(disk  free)
語法:# df   [-h]
選項:-h表示可讀性較高的形式展示大小

進程檢測與控制2.1.2.5

這幾列依次是:

| Filesystem | 磁盤名稱                           |
| ---------- | ---------------------------------- |
| Size       | 總大小                             |
| Used       | 被使用的大小                       |
| Avail      | 剩余大小                           |
| Use%       | 使用百分比                         |
| Mounted on | 掛載路徑(相當(dāng)于Windows 的磁盤符) |

回到開始的工作場景:
小黑入職到一家公司,接到的第一項任務(wù),就是監(jiān)控生產(chǎn)服務(wù)器的性能,提到服務(wù)器性能,我們首先想到的就是CPU,內(nèi)存和磁盤。

問題:小黑具體應(yīng)該如何監(jiān)控CPU,內(nèi)存和磁盤?

4、ps查看進程命令
命令:ps(process show進程顯示)
語法:ps [參數(shù)選項]
作用:主要是查看服務(wù)器的進程信息
選項含義:
-e:等價于“-A”,表示列出全部(all)的進程
-f :   表示full,顯示全部的列(顯示全字段)

進程檢測與控制2.4.1

| UID   | 該進程執(zhí)行的用戶ID                                           |
| ----- | ------------------------------------------------------------ |
| PID   | 進程ID                                                       |
| PPID  | 該進程的父級進程ID,如果找不到,則該進程就被稱之為僵尸進程(Parent Process ID) |
| C     | Cpu的占用率,其形式是百分?jǐn)?shù)                                  |
| STIME | 進程的啟動時間                                               |
| TTY   | 終端設(shè)備,發(fā)起該進程的設(shè)備識別符號,如果顯示“?”則表示該進程并不是由終端設(shè)備發(fā)起 |
| TIME  | 進程實際使用CPU的時間                                        |
| CMD   | 該進程的名稱或者對應(yīng)的路徑                                   |

工作場景
小黑用學(xué)到的命令,發(fā)現(xiàn)某個進程占用CPU很高,希望進一步查看這個簡稱的信息。
ps -ef 會列出全部進程,但是我們發(fā)現(xiàn)進程非常多,我們很難找到自己想要看的進程。這里需要使用過濾命令grep,來過濾掉我們不需要的信息。

用法:ps -ef |grep 想要看到的進程名
示例代碼:
#ps -ef |grep crond
含義:查看crond進程的詳細情況
注意:查詢結(jié)果中,如果只有一條則表示沒查到對應(yīng)的進程(這1 條表示剛才ps 指令的自身)。只有查到的結(jié)果多余1 條,才表示有對應(yīng)的進程。

進程檢測與控制2.4.2

補充:針對上述情況的優(yōu)化:如果沒有對應(yīng)的進程,則什么都不顯示。
思路:在現(xiàn)有的基礎(chǔ)之上再次使用管道去處理下(-v 選項表示“排除”)。
擴展:ps  auxBSD格式命令,注意沒有橫杠"-"
Unix有很多分支,目前主流的顯示風(fēng)格分為System V和BSD,我們之前使用的ps -ef屬于system V風(fēng)格,ps aux是BSD風(fēng)格,大家可以理解為兩種風(fēng)格只是顯示不同。

進程檢測與控制2.4.3

USER:該 process 屬于哪個使用者賬號
PID :該 process 的ID
%CPU:該 process 使用掉的 CPU 資源百分比
%MEM:該 process 所占用的物理內(nèi)存百分比
VSZ :該 process 使用掉的虛擬內(nèi)存量 (Kbytes)
RSS :該 process 占用的固定的內(nèi)存量 (Kbytes)
TTY :該 process 是在那個終端機上面運作,若與終端機無關(guān),則顯示 ?,另外, tty1-tty6 是本機上面的登入者程序,若為 pts/0 等等的,則表示為由網(wǎng)絡(luò)連接進主機的程序。
STAT:該程序目前的狀態(tài),主要的狀態(tài)有
R :該程序目前正在運作,或者是可被運作
S :該程序目前正在睡眠當(dāng)中 (可說是 idle 狀態(tài)),但可被某些訊號 (signal) 喚醒。
T :該程序目前正在偵測或者是停止了
Z :該程序應(yīng)該已經(jīng)終止,但是其父程序卻無法正常的終止他,造成 zombie (疆尸) 程序的狀態(tài)
START:該 process 被觸發(fā)啟動的時間
TIME :該 process 實際使用 CPU 運作的時間
COMMAND:該程序的實際指令

5、netstat查看進程網(wǎng)絡(luò)訪問

命令:netstat
作用:查看網(wǎng)絡(luò)連接狀態(tài)
語法:netstat   -tnlp
選項:

-t:表示只列出tcp 協(xié)議的連接;
-n:表示將地址從字母組合轉(zhuǎn)化成ip 地址,將協(xié)議轉(zhuǎn)化成端口號來顯示;
-l :表示過濾出"state(狀態(tài))"列中其值為LISTEN(監(jiān)聽)的連接;
-p:表示顯示發(fā)起連接的進程pid 和進程名稱;

進程檢測與控制2.5.1

Protocol:協(xié)議(tcp、upd、http、https、icmp、ssh…)
Receive:接收
Send:發(fā)送
Local Address:本地地址
Foreign:遠程地址
State:狀態(tài),LISTEN表示偵聽來自遠方的TCP端口的連接請求
PID/Program name:進程ID和程序名

6、kill關(guān)閉進程

命令:kill
語法:kill [信號] PID
作用:kill 命令會向操作系統(tǒng)內(nèi)核發(fā)送一個信號(多是終止信號)和目標(biāo)進程的 PID,然后系統(tǒng)內(nèi)核根據(jù)收到的信號類型,對指定進程進行相應(yīng)的操作
信號種類:

| 信號編號 | 含義                                     |
| -------- | ---------------------------------------- |
| 9        | 殺死進程,即強制結(jié)束進程。               |
| 15       | 正常結(jié)束進程,是 kill   命令的默認(rèn)信號。 |

用法一:kill [信號編號] PID
示例代碼:
#ps -ef |grep crond
查詢crond進程信息,想知道它的PID,以便使用kill終止進程
#kill 6925
結(jié)束6925的進程,這里使用默認(rèn)信號,正常結(jié)束,如果強制結(jié)束,就是kill -9 6925
#ps -ef |grep crond
查詢crond進程信息,這次查詢是為了確認(rèn)crond進程是否被終止了,我們發(fā)現(xiàn)6925進程已經(jīng)沒有了
#systemctl start crond
使用前面學(xué)過的systemctl命令,重啟crond服務(wù)
#ps -ef |grep crond
查詢crond進程信息,這次查詢是為了確認(rèn)crond進程已經(jīng)重新啟動了,我們看到多了一個32934的進程,表明crond已經(jīng)啟動,并且進程ID變化了,這是一個新的進程

進程檢測與控制2.6.1

備注:在互聯(lián)網(wǎng)中,經(jīng)??吹絢ill  -9  進程PID,強制殺死某個進程,kill -l

7、killall關(guān)閉進程
命令:killall
作用:通過程序的==進程名==來殺死==一類==進程
語法:# killall  [信號] 進程名稱
信號種類:和kill相同,這里不再重復(fù)

用法一:killall [信號編號] 進程名
示例代碼:
#ps -ef |grep crond
查詢crond進程信息,想知道它的進程名,以便使用killall終止進程
#kill 6925
結(jié)束6925的進程,這里使用默認(rèn)信號,正常結(jié)束,如果強制結(jié)束,就是kill -9 6925

進程檢測與控制2.7.1

三、進程優(yōu)先級

1、什么是進程優(yōu)先級?
Linux是一個多用戶、多任務(wù)的操作系統(tǒng),系統(tǒng)中通常運行著非常多的進程。哪些進程先運行,哪些進程后運行,就由進程優(yōu)先級來控制

2、查看進程優(yōu)先級

PR  優(yōu)先級,數(shù)值越小優(yōu)先級越高。  
NI  優(yōu)先級,數(shù)值越小優(yōu)先級越高。
問題:這兩個數(shù)值是在哪里看到的?
答:

3、調(diào)整進程優(yōu)先級
① 調(diào)整==正在運行==進程的優(yōu)先級(renice)

1)使用top按"r"來調(diào)整

如果要改變某個進程的優(yōu)先級,就要利用 "r" 交互命令。
改變NICE--->PR
優(yōu)先級的范圍:
-20——19  數(shù)字越低,優(yōu)先級越高,系統(tǒng)會按照更多的cpu時間給該進程
注意:我們能夠修改的只有 Ni 的優(yōu)先級,而不能修改 Pr 的優(yōu)先級。

步驟1:運行top命令,按r,會提示輸入希望修改優(yōu)先級的進程的PID,這里輸入6451,表示想修改firewalld進程的優(yōu)先級

進程檢測與控制3.3.1.1

步驟2:輸入6451后回車,提示希望修改的具體數(shù)字,這個數(shù)字是從-20到19,這里輸入5,數(shù)字越大,優(yōu)先級別越低,所以,這里是降低了firewalld的優(yōu)先級

進程檢測與控制3.3.1.2

步驟3:輸入5后,按回車,會發(fā)現(xiàn)6451進程的NI, 從0變成了5,PR從20變成了25

進程檢測與控制3.3.1.3

2)命令行使用renice調(diào)整
命令:renice
語法:renice [NI優(yōu)先級設(shè)置的數(shù)字] 想調(diào)整的進程ID
[root@localhost ~]# renice -5 6451
含義:將6451進程的NI優(yōu)先級設(shè)置為-5,實際效果是提高了6451進程的優(yōu)先級
注意:這里的-5代表設(shè)置成-5,不是所謂加減的關(guān)系,如果當(dāng)前NI的值是10,當(dāng)設(shè)置成-5后,NI的值會變?yōu)?5.

進程檢測與控制3.3.1.1

② 程序啟動時指定優(yōu)先級(nice),只能調(diào)整不在運行的程序。
步驟1:將程序停止
步驟2:啟動并制定優(yōu)先級
步驟3:確認(rèn)優(yōu)先級(查看優(yōu)先級)
命令:nice
語法:nice [NI優(yōu)先級設(shè)置的數(shù)字] 想調(diào)整的進程名
啟動進程時,通常會繼承父進程的 nice級別,默認(rèn)為0
#ps -ef |grep crond
含義:查看crond的進程信息
目的:找出crond的PID,用于結(jié)束進程
#kill -9 crond的進程ID
含義:結(jié)束crond的進程
目的:nice只能修改不在運行的進程的優(yōu)先級
#ps -ef |grep crond
含義:查看crond的進程信息
目的:確認(rèn)crond進程是不是已經(jīng)停止了
#nice -n -5 crond
含義:啟動crond進程,將NI設(shè)置成-5
#ps -ef |grep crond
含義:查看crond的進程信息
目的:找出crond的PID,用于查看此進程的優(yōu)先級
#top -p crond的進程ID
含義:使用TOP命令,只查看和crond進程相關(guān)的信息

猜你喜歡

linux文件管理圖文教程:linux文件管理命令詳解

分享到:
在線咨詢 我要報名
和我們在線交談!