咱們能夠經過 top
實時得查看進程的狀態,以及系統的一些信息(如 CPU、內存信息等),咱們還能夠經過 ps
來靜態查看當前的進程信息,同時咱們還可使用 pstree
來查看當前活躍進程的樹形結構。nginx
top
工具是咱們經常使用的一個查看工具,能實時的查看咱們系統的一些關鍵信息的變化:正則表達式
top 是一個在前臺執行的程序,因此執行後便進入到這樣的一個交互界面,正是由於交互界面咱們才能夠實時的獲取到系統與進程的信息。在交互界面中咱們能夠經過一些指令來操做和篩選。vim
top 顯示的第一排,緩存
內容 | 解釋 |
---|---|
top | 表示當前程序的名稱 |
11:05:18 | 表示當前的系統的時間 |
up 8 days,17:12 | 表示該機器已經啓動了多長時間 |
1 user | 表示當前系統中只有一個用戶 |
load average: 0.29,0.20,0.25 | 分別對應一、五、15分鐘內cpu的平均負載 |
load average 在 wikipedia 中的解釋是 the system load is a measure of the amount of work that a computer system is doing 也就是對當前 CPU 工做量的度量,具體來講也就是指運行隊列的平均長度,也就是等待 CPU 的平均進程數相關的一個計算值。安全
假設咱們的系統是單 CPU、單內核的,把它比喻成是一條單向的橋,把CPU任務比做汽車。bash
這是單個 CPU 單核的狀況,而實際生活中咱們須要將獲得的這個值除以咱們的核數來看。咱們能夠經過一下的命令來查看 CPU 的個數與核心數session
#查看物理CPU的個數 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l #每一個cpu的核心數 cat /proc/cpuinfo |grep "physical id"|grep "0"|wc -l
一般咱們都會先看 15 分鐘的值來看這個大致的趨勢,而後再看 5 分鐘的值對比來看是否有降低的趨勢多線程
top 的第二行數據,基本上第二行是進程的一個狀況統計工具
內容 | 解釋 |
---|---|
Tasks: 26 total | 進程總數 |
1 running | 1個正在運行的進程數 |
25 sleeping | 25個睡眠的進程數 |
0 stopped | 沒有中止的進程數 |
0 zombie | 沒有殭屍進程數 |
來看 top 的第三行數據,這一行基本上是 CPU 的一個使用狀況的統計了ui
內容 | 解釋 |
---|---|
Cpu(s): 1.0%us | 用戶空間進程佔用CPU百分比 |
1.0% sy | 內核空間運行佔用CPU百分比 |
0.0%ni | 用戶進程空間內改變過優先級的進程佔用CPU百分比 |
97.9%id | 空閒CPU百分比 |
0.0%wa | 等待輸入輸出的CPU時間百分比 |
0.1%hi | 硬中斷(Hardware IRQ)佔用CPU的百分比 |
0.0%si | 軟中斷(Software IRQ)佔用CPU的百分比 |
0.0%st | (Steal time) 是 hypervisor 等虛擬服務中,虛擬 CPU 等待實際 CPU 的時間的百分比 |
CPU 利用率是對一個時間段內 CPU 使用情況的統計,經過這個指標能夠看出在某一個時間段內 CPU 被佔用的狀況,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率情況,而是在一段時間內 CPU 正在處理以及等待 CPU 處理的進程數狀況統計信息,這兩個指標並不同。
來看 top 的第四行數據,這一行基本上是內存的一個使用狀況的統計了:
內容 | 解釋 |
---|---|
8176740 total | 物理內存總量 |
8032104 used | 使用的物理內存總量 |
144636 free | 空閒內存總量 |
313088 buffers | 用做內核緩存的內存量 |
注意
系統的中可用的物理內存最大值並非 free 這個單一的值,而是 free + buffers + swap 中的 cached 的和
來看 top 的第五行數據,這一行基本上是交換區的一個使用狀況的統計了
內容 | 解釋 |
---|---|
total | 交換區總量 |
used | 使用的交換區總量 |
free | 空閒交換區總量 |
cached | 緩衝的交換區總量,內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋 |
在下面就是進程的一個狀況了
列名 | 解釋 |
---|---|
PID | 進程id |
USER | 該進程的所屬用戶 |
PR | 該進程執行的優先級 priority 值 |
NI | 該進程的 nice 值 |
VIRT | 該進程任務所使用的虛擬內存的總數 |
RES | 該進程所使用的物理內存數,也稱之爲駐留內存數 |
SHR | 該進程共享內存的大小 |
S | 該進程進程的狀態: S=sleep R=running Z=zombie |
%CPU | 該進程CPU的利用率 |
%MEM | 該進程內存的利用率 |
TIME+ | 該進程活躍的總時間 |
COMMAND | 該進程運行的名字 |
注意
NICE 值叫作靜態優先級,是用戶空間的一個優先級值,其取值範圍是-20至19。這個值越小,表示進程」優先級」越高,而值越大「優先級」越低。nice值中的 -20 到 19,中 -20 優先級最高, 0 是默認的值,而 19 優先級最低
PR 值表示 Priority 值叫動態優先級,是進程在內核中實際的優先級值,進程優先級的取值範圍是經過一個宏定義的,這個宏的名稱是 MAX_PRIO,它的值爲 140。Linux 實際上實現了 140 個優先級範圍,取值範圍是從 0-139,這個值越小,優先級越高。而這其中的 0 - 99 是實時進程的值,而 100 - 139 是給用戶的。
其中 PR 中的 100 to 139 值部分有這麼一個對應
PR = 20 + (-20 to +19)
,這裏的 -20 to +19 即是nice值,因此說兩個雖然都是優先級,並且有千絲萬縷的關係,可是他們的值,他們的做用範圍並不相同VIRT 任務所使用的虛擬內存的總數,其中包含全部的代碼,數據,共享庫和被換出 swap空間的頁面等所佔據空間的總數
在上文咱們曾經說過 top 是一個前臺程序,因此是一個能夠交互的
經常使用交互命令 | 解釋 |
---|---|
q | 退出程序 |
I | 切換顯示平均負載和啓動時間的信息 |
P | 根據CPU使用百分比大小進行排序 |
M | 根據駐留內存大小進行排序 |
i | 忽略閒置和僵死的進程,這是一個開關式命令 |
k | 終止一個進程,系統提示輸入 PID 及發送的信號值。通常終止進程用 15 信號,不能正常結束則使用 9 信號。安全模式下該命令被屏蔽。 |
使用 -l
參數能夠顯示本身此次登錄的 bash 相關的進程信息羅列出來
ps -l
羅列出全部的進程信息
ps aux
如果查找其中的某個進程的話,咱們還能夠配合着 grep 和正則表達式一塊兒使用
ps aux | grep zsh
以查看時將連同部分的進程呈樹狀顯示出來
ps axjf
自定義咱們所須要的參數顯示
ps -afxo user,ppid,pid,pgid,command
內容 | 解釋 |
---|---|
F | 進程的標誌(process flags),當 flags 值爲 1 則表示此子程序只是 fork 但沒有執行 exec,爲 4 表示此程序使用超級管理員 root 權限 |
USER | 進程的擁有用戶 |
PID | 進程的 ID |
PPID | 其父進程的 PID |
SID | session 的 ID |
TPGID | 前臺進程組的 ID |
%CPU | 進程佔用的 CPU 百分比 |
%MEM | 佔用內存的百分比 |
NI | 進程的 NICE 值 |
VSZ | 進程使用虛擬內存大小 |
RSS | 駐留內存中頁的大小 |
TTY | 終端 ID |
S or STAT | 進程狀態 |
WCHAN | 正在等待的進程資源 |
START | 啓動進程的時間 |
TIME | 進程消耗CPU的時間 |
COMMAND | 命令的名稱和參數 |
TPGID欄寫着-1的都是沒有控制終端的進程,也就是守護進程
STAT表示進程的狀態,而進程的狀態有不少,以下表所示
狀態 | 解釋 |
---|---|
R | Running.運行中 |
S | Interruptible Sleep.等待調用 |
D | Uninterruptible Sleep.不可中斷睡眠 |
T | Stoped.暫停或者跟蹤狀態 |
X | Dead.即將被撤銷 |
Z | Zombie.殭屍進程 |
W | Paging.內存交換 |
N | 優先級低的進程 |
< | 優先級高的進程 |
s | 進程的領導者 |
L | 鎖定狀態 |
l | 多線程狀態 |
+ | 前臺進程 |
其中的 D 是不能被中斷睡眠的狀態,處在這種狀態的進程不接受外來的任何 signal,因此沒法使用 kill 命令殺掉處於D狀態的進程,不管是
kill
,kill -9
仍是kill -15
,通常處於這種狀態多是進程 I/O 的時候出問題了。
經過 pstree 能夠很直接的看到相同的進程數量,最主要的仍是咱們能夠看到全部進程的之間的相關性。
#參數選擇: #-A :各程序樹之間以 ASCII 字元來連接; #-p :同時列出每一個 process 的 PID; #-u :同時列出每一個 process 的所屬帳戶名稱。
直接對 pid 下手
#首先咱們使用圖形界面打開了 gedit、gvim,用 ps 能夠查看到 ps aux #使用9這個信號強制結束 gedit 進程 kill -9 1608 #咱們在查找這個進程的時候就找不到了 ps aux | grep gedit
nice 的值咱們是能夠經過 nice 命令來修改的,而須要注意的是 nice 值能夠調整的範圍是 -20 ~ 19,其中 root 有着至高無上的權力,既能夠調整本身的進程也能夠調整其餘用戶的程序,而且是全部的值均可以用,而普通用戶只能夠調製屬於本身的進程,而且其使用的範圍只能是 0 ~ 19,由於系統爲了不通常用戶搶佔系統資源而設置的一個限制
nice -n -5 vim &
咱們還能夠用 renice 來修改已經存在的進程的優先級,一樣由於權限的緣由在實驗環境中沒法嘗試
renice -5 pid