1仪或、進程簡介
linux上進程有5種狀態(tài)
- 運行(正在運行或在運行隊列中等待)
- 中斷(休眠中宗侦,受阻,在等待某個條件的形成或接收到信號)
- 不可中斷(收到信號不喚醒和不可運行嗅剖,進程必須等待直到有中斷發(fā)生)
- 僵死(進程已終止蛋逾,但進程描述符存在,知道父進程調(diào)用wait4()系統(tǒng)調(diào)用后釋放)
- 停止(進程收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信號后停止運行運行)
ps工具標(biāo)識進程的5種狀態(tài)碼:
- D 不可中斷 uninterruptible sleep (usually IO)
- R 運行 runnable (on run queue)
- S 中斷 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
平時在查看linus進程狀態(tài)是窗悯,查看最多的三個狀態(tài)是R区匣、S、D
S 即 sleep進程蒋院,休眠進程亏钩。其又分為兩種:
-
Interruptible Sleep
(可中斷睡眠,在ps命令中顯示“S”)欺旧。處在這種睡眠狀態(tài)的進程是可以通過給它發(fā)送signal來喚醒的姑丑,比如發(fā)HUP信號給nginx的master進程可以讓nginx重新加載配置文件而不需要重新啟動nginx進程; -
Uninterruptible Sleep
(不可中斷睡眠辞友,在ps命令中顯示“D”)栅哀。處在這種狀態(tài)的進程不接受外來的任何signal,這也是為什么之前我無法用kill殺掉這些處于D狀態(tài)的進程称龙,無論是“kill”, “kill -9”還是“kill -15”留拾,因為它們壓根兒就不受這些信號的支配。
D 即上面提到的Uninterruptible Sleep 鲫尊,如果從廣義上來分痴柔,D狀態(tài)算是一種特殊的S狀態(tài)進程。進程為什么會被置于D狀態(tài)呢疫向?
D狀態(tài)的進程通常是在等待IO咳蔚,比如磁盤IO,網(wǎng)絡(luò)IO搔驼,其他外設(shè)IO谈火,如果進程正在等待的IO在較長的時間內(nèi)都沒有響應(yīng),那么就很會不幸地被ps看到了舌涨,同時也就意味著很有可能有IO出了問題糯耍,可能是外設(shè)本身出了故障,也可能是比如NFS掛載的遠程文件系統(tǒng)已經(jīng)不可訪問了泼菌。
正是因為得不到IO的響應(yīng)谍肤,進程才進入了uninterruptible sleep狀態(tài)啦租,所以要想使進程從uninterruptible sleep狀態(tài)恢復(fù)哗伯,就得使進程等待的IO恢復(fù),比如如果是因為從遠程掛載的NFS卷不可訪問導(dǎo)致進程進入uninterruptible sleep狀態(tài)的篷角,那么可以通過恢復(fù)該NFS卷的連接來使進程的IO請求得到滿足焊刹,除此之外,要想干掉處在D狀態(tài)進程就只能重啟整個Linux系統(tǒng)(D進程并不能通過kill 和kill -9 殺掉) 。
2虐块、ps命令
2.1 簡介
ps命令是linux最常用的進程查看命令俩滥,它會列出系統(tǒng)中當(dāng)前運行的那些進程。ps命令列出的是當(dāng)前那些進程的快照贺奠,就是執(zhí)行ps命令的那個時刻的那些進程霜旧,如果想要動態(tài)的顯示進程信息,可以使用top命令儡率。
2.2 命令參數(shù)
-
a
顯示所有進程 -
-a
顯示同一終端下的所有程序 -
-A
顯示所有進程 -
c
顯示進程的真實名稱 -
-N
反向選擇 -
-e
等于“-A” -
e
顯示環(huán)境變量 -
f
顯示程序間的關(guān)系 -
-H
顯示樹狀結(jié)構(gòu) -
r
顯示當(dāng)前終端的進程 -
T
顯示當(dāng)前終端的所有程序 -
u
指定用戶的所有進程 -
-au
顯示較詳細的資訊 -
-aux
顯示所有包含其他使用者的行程挂据,顯示內(nèi)存信息 -
-C
<命令> 列出指定命令的狀況 -
–lines
<行數(shù)> 每頁顯示的行數(shù) -
–width
<字符數(shù)> 每頁顯示的字符數(shù) -
–help
顯示幫助信息 -
–version
顯示版本顯示
常用的命令參數(shù)有“-ef ”、“-u” "aux"儿普,再接和grep使用
2.3 輸出列的含義
-
F
代表這個程序的旗標(biāo) (flag)崎逃, 4 代表使用者為 super user -
S
代表這個程序的狀態(tài) (STAT),關(guān)于各 STAT 的意義將在內(nèi)文介紹 -
UID
程序被該 UID 所擁有 -
PID
進程的ID -
PPID
則是其上級父程序的ID -
%CPU
:該 process 使用掉的 CPU 資源百分比 -
%MEM
:該 process 所占用的物理內(nèi)存百分比 -
VSZ
:該 process 使用掉的虛擬內(nèi)存量 (Kbytes) -
SZ
使用掉的內(nèi)存大小 -
RSS
:該 process 占用的固定的內(nèi)存量 (Kbytes) -
PRI
這個是 Priority (優(yōu)先執(zhí)行序) 的縮寫眉孩,詳細后面介紹 -
ADDR
這個是 kernel function个绍,指出該程序在內(nèi)存的那個部分。如果是個 running的程序浪汪,一般就是 “-“ -
WCHAN
目前這個程序是否正在運作當(dāng)中巴柿,若為 - 表示正在運作 -
TTY
登入者的終端機位置 -
TIME
使用掉的 CPU 時間。 -
CMD
所下達的指令為何
3死遭、jps命令
3.1 簡介
jps命令是linux下java進程查看命令篮洁,jps僅查看當(dāng)前用戶的java進程,而不是當(dāng)前進程中的所有進程殃姓。
3.2 原理
java程序在啟動以后袁波,會在java.io.tmpdir指定的目錄下,就是臨時文件夾里蜗侈,生成一個類似于hsperfdata_User的文件夾篷牌,這個文件夾里(在Linux中為/tmp/hsperfdata_{userName}/),有幾個文件踏幻,名字就是java進程的pid枷颊,因此列出當(dāng)前運行的java進程,只是把這個目錄里的文件名列一下而已该面。 至于系統(tǒng)的參數(shù)什么夭苗,就可以解析這幾個文件獲得。
3.3 命令參數(shù)
-
-q
僅輸出VM標(biāo)識符隔缀,不包括class name,jar name,arguments in main method -
-m
輸出main method的參數(shù) -
-l
輸出完全的包名题造,應(yīng)用主類名,jar的完全路徑名 -
-v
輸出jvm參數(shù) -
-V
輸出通過flag文件傳遞到JVM中的參數(shù)(.hotspotrc文件或-XX:Flags=所指定的文件 -
-Joption
傳遞參數(shù)到vm,例如:-J-Xms48m
4猾瘸、top命令
4.1 簡介
top命令是Linux下最常用的性能分析工具界赔,能夠 實時 顯示系統(tǒng)中各個進程的資源占用狀況丢习,類似于Windows的任務(wù)管理器。top命令有兩種模式淮悼,一種是常見的交互式(實時)方式咐低,另一種是批處理模式,用于觀看歷史記錄(調(diào)試專用)袜腥。
4.2 命令參數(shù):
-
-b
批處理 -
-c
顯示完整的命令 -
-I
忽略失效過程 -
-s
保密模式 -
-S
累積模式 -
-d
設(shè)置更新時間见擦,默認(rèn)是每3s刷新一次系統(tǒng)性能情況 -
-i
<時間> 設(shè)置間隔時間 -
-u
<用戶名> 指定用戶名 -
-p
<進程號> 指定進程 -
-n
<次數(shù)> 循環(huán)顯示的次數(shù)
4.3 批處理模式
批處理模式是指批處理,這意味著自動處理羹令,無需人工干預(yù)锡宋。 批處理與交互相對。
在批處理模式下特恬,top產(chǎn)生的輸出對于收集到日志文件或解析更為明智(盡管top甚至在批處理模式下也不能很好地生成可解析的輸出)执俩。 輸出行數(shù)沒有限制,輸出中不包含任何格式化的轉(zhuǎn)義序列癌刽。
在交互模式下役首,top產(chǎn)生用于人類觀看的輸出。 特別是显拜,它只顯示一個屏幕數(shù)據(jù)衡奥。 輸出包含一些用于格式化的轉(zhuǎn)義序列。 Top即使將其輸出重定向到文件远荠,也以交互模式運行; 只有-b選項的存在才有意義矮固。
top-批處理模式在-SHELL下通過選項b來控制。
eg:常用的命令:top -b -n 5 > top.txt
4.4 交互模式
在交互模式下譬淳,只顯示一個屏幕的數(shù)據(jù)档址,是一個實時數(shù)據(jù)。顯示的信息如:4.4.1 統(tǒng)計信息區(qū)
統(tǒng)計信息區(qū):
前五行是當(dāng)前系統(tǒng)情況整體的統(tǒng)計信息區(qū)邻梆。下面我們看每一行信息的具體意義守伸。
第一行,任務(wù)隊列信息浦妄,同 uptime 命令的執(zhí)行結(jié)果尼摹,具體參數(shù)說明情況如下:
14:06:23 — 當(dāng)前系統(tǒng)時間
up 70 days, 16:44 — 系統(tǒng)已經(jīng)運行了70天16小時44分鐘(在這期間系統(tǒng)沒有重啟過的吆!)
2 users — 當(dāng)前有2個用戶登錄系統(tǒng)
load average: 1.15, 1.42, 1.44 — load average后面的三個數(shù)分別是1分鐘剂娄、5分鐘蠢涝、15分鐘的負(fù)載情況。
load average數(shù)據(jù)是每隔5秒鐘檢查一次活躍的進程數(shù)阅懦,然后按特定算法計算出的數(shù)值和二。如果這個數(shù)除以邏輯CPU的數(shù)量,結(jié)果高于5的時候就表明系統(tǒng)在超負(fù)荷運轉(zhuǎn)了故黑。
第二行儿咱,Tasks — 任務(wù)(進程)庭砍,具體信息說明如下:
系統(tǒng)現(xiàn)在共有206個進程场晶,其中處于運行中的有1個混埠,205個在休眠(sleep),stoped狀態(tài)的有0個诗轻,zombie狀態(tài)(僵尸)的有0個钳宪。
第三行,cpu狀態(tài)信息扳炬,具體屬性說明如下:
5.9%us — 用戶空間占用CPU的百分比吏颖。
3.4% sy — 內(nèi)核空間占用CPU的百分比。
0.0% ni — 改變過優(yōu)先級的進程占用CPU的百分比
90.4% id — 空閑CPU百分比
0.0% wa — IO等待占用CPU的百分比
0.0% hi — 硬中斷(Hardware IRQ)占用CPU的百分比
0.2% si — 軟中斷(Software Interrupts)占用CPU的百分比
備注:在這里CPU的使用比率和windows概念不同恨樟,需要理解linux系統(tǒng)用戶空間和內(nèi)核空間的相關(guān)知識半醉!
第四行,內(nèi)存狀態(tài),具體信息如下:
32949016k total — 物理內(nèi)存總量(32GB)
14411180k used — 使用中的內(nèi)存總量(14GB)
18537836k free — 空閑內(nèi)存總量(18GB)
169884k buffers — 緩存的內(nèi)存量 (169M)
第五行劝术,swap交換分區(qū)信息缩多,具體信息說明如下:
32764556k total — 交換區(qū)總量(32GB)
0k used — 使用的交換區(qū)總量(0K)
32764556k free — 空閑交換區(qū)總量(32GB)
3612636k cached — 緩沖的交換區(qū)總量(3.6GB)
備注:
第四行中使用中的內(nèi)存總量(used)指的是現(xiàn)在系統(tǒng)內(nèi)核控制的內(nèi)存數(shù),空閑內(nèi)存總量(free)是內(nèi)核還未納入其管控范圍的數(shù)量养晋。納入內(nèi)核管理的內(nèi)存不見得都在使用中衬吆,還包括過去使用過的現(xiàn)在可以被重復(fù)利用的內(nèi)存,內(nèi)核并不把這些可被重新使用的內(nèi)存交還到free中去绳泉,因此在linux上free內(nèi)存會越來越少逊抡,但不用為此擔(dān)心。
如果出于習(xí)慣去計算可用內(nèi)存數(shù)零酪,這里有個近似的計算公式:第四行的free + 第四行的buffers + 第五行的cached冒嫡,按這個公式此臺服務(wù)器的可用內(nèi)存:18537836k +169884k +3612636k = 22GB左右。
對于內(nèi)存監(jiān)控四苇,在top里我們要時刻監(jiān)控第五行swap交換分區(qū)的used灯谣,如果這個數(shù)值在不斷的變化,說明內(nèi)核在不斷進行內(nèi)存和swap的數(shù)據(jù)交換蛔琅,這是真正的內(nèi)存不夠用了胎许。
4.4.2 狀態(tài)監(jiān)控區(qū)
項目列信息說明如下:
PID
— 進程id
USER
— 進程所有者
PR
— 進程優(yōu)先級
NI
— nice值。負(fù)值表示高優(yōu)先級罗售,正值表示低優(yōu)先級
VIRT
— 進程使用的虛擬內(nèi)存總量辜窑,單位kb。VIRT=SWAP+RES
RES
— 進程使用的寨躁、未被換出的物理內(nèi)存大小穆碎,單位kb。RES=CODE+DATA
SHR
— 共享內(nèi)存大小职恳,單位kb
S
— 進程狀態(tài)所禀。D=不可中斷的睡眠狀態(tài) R=運行 S=睡眠 T=跟蹤/停止 Z=僵尸進程
%CPU
— 上次更新到現(xiàn)在的CPU時間占用百分比
%MEM
— 進程使用的物理內(nèi)存百分比
TIME+
— 進程使用的CPU時間總計方面,單位1/100秒
COMMAND
— 進程名稱(命令名/命令行)
4.5 使用技巧
1. 多U多核CPU監(jiān)控
在top基本視圖中,按鍵盤數(shù)字“1”色徘,可監(jiān)控每個邏輯CPU的狀況:
2. 高亮顯示顯示當(dāng)前進程
敲擊鍵盤“b”(打開/關(guān)閉加亮效果)斤寂,top的視圖變化如下:
我們發(fā)現(xiàn)進程id為2570的“top”進程被加亮了耿焊,top進程就是視圖第二行顯示的唯一的運行態(tài)(runing)的那個進程,可以通過敲擊“y”鍵關(guān)閉或打開運行態(tài)進程的加亮效果遍搞。
3.進程字段排序
默認(rèn)進入top時罗侯,各進程是按照CPU的占用量來排序的,在下圖中進程ID為28894的java進程排在第一(cpu占用142%)溪猿,進程ID為574的java進程排在第二(cpu占用16%)钩杰。
可以看到再愈,top默認(rèn)的排序列是“%CPU”榜苫。
4. 通過”shift + >”或”shift + <”可以向右或左改變排序列
下圖是按一次”shift + >”的效果圖,視圖現(xiàn)在已經(jīng)按照%MEM來排序。