美女面试官问我:能说几个常见的Linux性能调优命令吗?
案例關(guān)注“Java后端技術(shù)全棧”
回復(fù)“000”獲取大量電子書
本文主要內(nèi)容:
簡單回答:
top、iostat、pidstat、ps、vmstat、netstat、sar等。
能細(xì)說一下嗎?下面就來好好聊聊這幾這個命令。
top命令
top命令是Linux下常用的性能分享工具,能夠?qū)崟r顯示系統(tǒng)中各個進(jìn)程的資源占用狀況信息。使用top命令輸出:
輸出信息可以分為兩部分:
- 系統(tǒng)統(tǒng)計信息 
- 進(jìn)程信息 
head部分
第一行
- “11:16:53”為系統(tǒng)當(dāng)前時刻; 
- “728 days, ?1:28”為系統(tǒng)啟動后到現(xiàn)在的運作時間; 
- “2 user”為當(dāng)前登錄到系統(tǒng)的用戶,更確切的說是登錄到用戶的終端數(shù) , 同一個用戶同一時間對系統(tǒng)多個終端的連接將被視為多個用戶連接到系統(tǒng),這里的用戶數(shù)也將表現(xiàn)為終端的數(shù)目; 
- “l(fā)oad average”為當(dāng)前系統(tǒng)負(fù)載的平均值,后面的三個值分別為1分鐘前、5分鐘前、15分鐘前進(jìn)程的平均數(shù),一般的可以認(rèn)為這個數(shù)值超過 CPU 數(shù)目時,CPU 將比較吃力的負(fù)載當(dāng)前系統(tǒng)所包含的進(jìn)程; 
第二行
- “78 total”為當(dāng)前系統(tǒng)進(jìn)程總數(shù); 
- “1 running”為當(dāng)前運行中的進(jìn)程數(shù); 
- “77 sleeping”為當(dāng)前處于等待狀態(tài)中的進(jìn)程數(shù); 
- “0 stoped”為被停止的系統(tǒng)進(jìn)程數(shù); 
- “0 zombie”為被復(fù)原的進(jìn)程數(shù); 
第三行
- 分別表示了 CPU 當(dāng)前的使用率; 
第四行
- 分別表示了內(nèi)存總量、當(dāng)前使用量、空閑內(nèi)存量、以及緩沖使用中的內(nèi)存量; 
第五行
表示類別同第四行(Mem),但此處反映著交換分區(qū)(Swap)的使用情況。通常,交換分區(qū)(Swap)被頻繁使用的情況,將被視作物理內(nèi)存不足而造成的。
body部分
參數(shù)說明
在top命令下,按下f鍵。可以進(jìn)行列的選擇,使用o鍵可以更改列的顯示順序。
另外一些常見快捷鍵:
上下箭頭:上下滾動查看進(jìn)程;
- u:顯示指定用戶的進(jìn)程; 
- P:按照進(jìn)程使用的CPU時間百分比排序; 
- M:按照進(jìn)程使用的內(nèi)存百分比排序; 
- T:按照進(jìn)程已連續(xù)運行時間排序; 
注意:使用top命令可以從宏觀上觀察系統(tǒng)各個進(jìn)程對CPU的占用情況以及內(nèi)存使用情況。
使用方式
top [-][d] [p][q] [c][C] [S][s] [n]
參數(shù)說明:
- d:指定每兩次屏幕信息刷新之間的時間間隔。當(dāng)然用戶可以使用s交互命令來改變之。 
- p:通過指定監(jiān)控進(jìn)程ID來僅僅監(jiān)控某個進(jìn)程的狀態(tài)。 
- q:該選項將使top沒有任何延遲的進(jìn)行刷新。如果調(diào)用程序有超級用戶權(quán)限,那么top將以盡可能高的優(yōu)先級運行。 
- S:指定累計模式。 
- s:使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。 
- i:使top不顯示任何閑置或者僵死進(jìn)程。 
- c:顯示整個命令行而不只是顯示命令名 
sar命令
sar命令也是Linux系統(tǒng)中重要的性能監(jiān)測工具之一,特可以周期性地對內(nèi)存和CPU進(jìn)行采樣。
下面使用sar命令統(tǒng)計CPU使用情況,每秒鐘采樣一次,采樣五次。
使用方式
sar [options] []
interval和count分別表示采樣周期和采樣數(shù)量。
options:可以指定sar命令對哪些性能數(shù)據(jù)進(jìn)行采樣,可能每個系統(tǒng)版本會導(dǎo)致其options不一樣,所以建議先試用
sar -h
查看具體參數(shù):
監(jiān)測內(nèi)存使用
我們來做一個內(nèi)存使用進(jìn)行采樣:每秒一次,采樣五次。
監(jiān)測IO信息
每秒一次,采樣五次。
注意:sar命令可以查看I/O信息、內(nèi)存信息以及CPU情況。
vmstat命令
vmstat是一款功能比較齊全的性能監(jiān)測工具,使用它可以統(tǒng)計CPU、內(nèi)存、swap使用情況等信息。可以指定采樣周期和采樣次數(shù)。
小試牛刀
參數(shù)說明
procs
- r:等等運行的進(jìn)程數(shù)。 
- b:處在非終端睡眠狀態(tài)的進(jìn)程數(shù)。 
memory
- swpd:虛擬內(nèi)存使用情況,單位:KB。 
- free :空閑的內(nèi)存,單位:KB。 
- buff:被用來作為緩存的內(nèi)存數(shù),單位:KB。 
swap
- si:每秒從交換區(qū)寫到內(nèi)存的大小 。 
- so:每秒寫入交換區(qū)的內(nèi)存大小 。 
io
- bi: 每秒讀取的塊數(shù) 
- bo: 每秒寫入的塊數(shù) 
system
- in: 每秒中斷數(shù),包括時鐘中斷。 
- cs: 每秒上下文切換數(shù)。 
CPU
- us: 用戶進(jìn)程執(zhí)行時間(user time) 
- sy: 系統(tǒng)進(jìn)程執(zhí)行時間(system time) 
- id: 空閑時間(包括IO等待時間),中央處理器的空閑時間 。以百分比表示。 
- wa: 等待IO時間 
案例詳情
模擬一個線程切換頻繁的案例。
代碼如下:
寫一個controller:
????@RestController@RequestMapping("/thread")public?class?ThreadContextSwitchController?{?@GetMapping("/test")public?String?switchContext(){HoldLockDemo.test();try?{Thread.sleep(200000);}?catch?(InterruptedException?e)?{e.printStackTrace();}return?"ok";}}線程切換部分代碼:
????import?java.util.Random;public?class?HoldLockDemo?{public?static?Object[]?lock?=?new?Object[10];public?static?Random?r?=?new?Random();static?{for?(int?i?=?0;?i?<?lock.length;?i++)?{lock[i]?=?new?Object();}}public?static?class?HoldLockTask?implements?Runnable?{private?int?i;public?HoldLockTask(int?i)?{this.i?=?i;}@Overridepublic?void?run()?{try?{while?(true)?{//獲取鎖synchronized?(lock[i])?{if?(i?%?2?==?0)?{System.out.println("wait");//等待lock[i].wait(r.nextInt(10));}?else?{System.out.println("notifyAll");//喚醒所有等待所lock[i].notifyAll();}}}}?catch?(Exception?e)?{e.printStackTrace();}}}public?static?void?test()?{for?(int?i?=0;i<lock.length;i++){System.out.println("test?method");new?Thread(new?HoldLockTask(i/2)).start();}}}訪問:
使用vmstat命令一秒采樣一次,采樣五次:
可以看到對應(yīng)cs線程切換的值,us用戶CPU的值。
注意:vmstat工具可以查看內(nèi)存、交互分區(qū)、I/O操作、上線文切換、時鐘中斷已經(jīng)CPU的使用情況。
iostat命令
iostat可以提供詳盡的I/O信息。
基本使用如下:每一秒采樣一次,采樣五次。
參數(shù)說明
- %user:CPU處在用戶模式下的時間百分比。 
- %nice:CPU處在帶NICE值的用戶模式下的時間百分比。 
- %system:CPU處在系統(tǒng)模式下的時間百分比。 
- %iowait:CPU等待輸入輸出完成時間的百分比。 
- %steal:管理程序維護(hù)另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。 
- %idle:CPU空閑時間百分比。 
注意
- 如果%iowait的值過高,表示硬盤存在I/O瓶頸。 
- 如果%idle值高,表示CPU較空閑。 
- 如果%idle值高但系統(tǒng)響應(yīng)慢時,可能是CPU等待分配內(nèi)存,應(yīng)加大內(nèi)存容量。 
- 如果%idle值持續(xù)低于10,表明CPU處理能力相對較低,系統(tǒng)中最需要解決的資源是CPU。 
CPU屬性值說明:
- tps:該設(shè)備每秒的傳輸次數(shù)。 
- kB_read/s:每秒從設(shè)備(drive expressed)讀取的數(shù)據(jù)量。 
- kB_wrtn/s:每秒向設(shè)備(drive expressed)寫入的數(shù)據(jù)量。 
- kB_read:?讀取的總數(shù)據(jù)量。 
- kB_wrtn:寫入的總數(shù)量數(shù)據(jù)量。 
pidstat命令
pidstat是一個功能強(qiáng)大的性能檢測工具,特也是Systat的組件之一。
systat組件主要包括
- iostat 工具提供CPU使用率及硬盤吞吐效率的數(shù)據(jù);?#比較核心的工具 
- mpstat 工具提供單個處理器或多個處理器相關(guān)數(shù)據(jù); 
- pidstat: 關(guān)于運行中的進(jìn)程/任務(wù)、CPU、內(nèi)存等的統(tǒng)計信息 
- sar 工具負(fù)責(zé)收集、報告并存儲系統(tǒng)活躍的信息;? ? #統(tǒng)計數(shù)據(jù)的核心工具 
- sa1 工具負(fù)責(zé)收集并存儲每天系統(tǒng)動態(tài)信息到一個二進(jìn)制的文件中。它是通過計劃任務(wù)工具cron來運行,是為sadc所設(shè)計的程序前端程序; 
- sa2工具負(fù)責(zé)把每天的系統(tǒng)活躍性息寫入總結(jié)性的報告中。它是為sar所設(shè)計的前端 ,要通過cron來調(diào)用 
- sadc 是系統(tǒng)動態(tài)數(shù)據(jù)收集工具,收集的數(shù)據(jù)被寫一個二進(jìn)制的文件中,它被用作sar工具的后端; 
- sadf 顯示被sar通過多種格式收集的數(shù)據(jù); 
- nfsiostat: NFS(Network File System)的I/O統(tǒng)計信息。 
- cifsiostat: CIFS(Common Internet File System)的統(tǒng)計信息 
pidstat主要用于監(jiān)控全部或指定進(jìn)程占用系統(tǒng)資源的情況,如CPU,內(nèi)存、設(shè)備IO、任務(wù)切換、線程等。pidstat首次運行時顯示自系統(tǒng)啟動開始的各項統(tǒng)計信息,之后運行pidstat將顯示自上次運行該命令以后的統(tǒng)計信息。用戶可以通過指定統(tǒng)計的次數(shù)和時間來獲得所需的統(tǒng)計信息。
通過pidstat -help命令,可以查看到有以下幾個常用參數(shù)可以監(jiān)測線程的性能:
常用參數(shù)
- -u:默認(rèn)參數(shù),顯示各個進(jìn)程的cpu使用情況; 
- -r:顯示各個進(jìn)程的內(nèi)存使用情況; 
- -d:顯示各個進(jìn)程的I/O使用情況; 
- -w:顯示每個進(jìn)程的上下文切換情況; 
- -p:指定進(jìn)程號; 
- -t:顯示進(jìn)程中線程的統(tǒng)計信息 
監(jiān)測CPU
輸出參數(shù)說明:
PID: 進(jìn)程pid
- %usr: 進(jìn)程在用戶態(tài)運行所占cpu時間比率 
- %system: 進(jìn)程在內(nèi)核態(tài)運行所占cpu時間比率 
- %CPU: 進(jìn)程運行所占cpu時間比率 
- CPU: 指示進(jìn)程在哪個核運行 
- Command: 拉起進(jìn)程對應(yīng)的命令 
監(jiān)測內(nèi)存
使用pidstat命令,還可以監(jiān)測指定進(jìn)程的內(nèi)存使用情況。
下面就使用pidstat工具對進(jìn)程pid=27180的進(jìn)程進(jìn)程內(nèi)存監(jiān)控。
每一秒采樣一次,采樣五次:
輸出參數(shù)說明:
- minflt/s: 每秒次缺頁錯誤次數(shù)(minor page faults),次缺頁錯誤次數(shù)意即虛擬內(nèi)存地址映射成物理內(nèi)存地址產(chǎn)生的page fault次數(shù) 
- majflt/s: 每秒主缺頁錯誤次數(shù)(major page faults),當(dāng)虛擬內(nèi)存地址映射成物理內(nèi)存地址時,相應(yīng)的page在swap中,這樣的page fault為major page fault,一般在內(nèi)存使用緊張時產(chǎn)生 
- VSZ: ? ? ?該進(jìn)程使用的虛擬內(nèi)存(以kB為單位) 
- RSS: ? ? ?該進(jìn)程使用的物理內(nèi)存(以kB為單位) 
- %MEM: ? ? 該進(jìn)程使用內(nèi)存的百分比 
- Command: ?拉起進(jìn)程對應(yīng)的命令 
監(jiān)測I/O
使用-d選項,我們可以查看進(jìn)程IO的統(tǒng)計信息:
輸出參數(shù)說明:
- kB_rd/s: 每秒進(jìn)程從磁盤讀取的數(shù)據(jù)量(以kB為單位) 
- kB_wr/s: 每秒進(jìn)程向磁盤寫的數(shù)據(jù)量(以kB為單位) 
- Command: 拉起進(jìn)程對應(yīng)的命令 
ps命令
ps (Process Status) 。進(jìn)程狀態(tài)。使用該命令可以確定有哪些進(jìn)程正在運行和運行的狀態(tài) 。ps是顯示瞬間進(jìn)程的狀態(tài),并不動態(tài)連續(xù),如果想對進(jìn)程進(jìn)行實時監(jiān)控應(yīng)該用 top 命令。
如果直接使用 ps 命令,會顯示所有進(jìn)程的狀態(tài),通常結(jié)合 grep 命令查看某進(jìn)程的狀態(tài)。(grep 即 global search regular expression(RE) and print out the line,全面搜索正則表達(dá)式并把行打印出來)是一種強(qiáng)大的文本搜索工具,它能使用正則表達(dá)式搜索文本,并把匹配的行打印出來。
ps
結(jié)果默認(rèn)會顯示4列信息。
- PID: 運行著的命令(CMD)的進(jìn)程編號 
- TTY: 命令所運行的位置(終端) 
- TIME: 運行著的該命令所占用的CPU處理時間 
- CMD: 該進(jìn)程所運行的命令 
使用man ps可以查看:
參數(shù):
- -A :所有的進(jìn)程均顯示出來,與 -e 具有同樣的效用; 
- -a :顯示現(xiàn)行終端機(jī)下的所有進(jìn)程,包括其他用戶的進(jìn)程; 
- -u :以用戶為主的進(jìn)程狀態(tài) ; 
- x :通常與 a 這個參數(shù)一起使用,可列出較完整信息。 
輸出格式規(guī)劃:
- l :較長、較詳細(xì)的將該P(yáng)ID 的的信息列出; 
- j :工作的格式 (jobs format) 
- -f :做一個更為完整的輸出。 
使用ps -ef 命令查看Linux系統(tǒng)的進(jìn)程
輸出參數(shù)說明:
- UID:用戶ID,實際輸出的是用戶名,如root 
- PID:當(dāng)前進(jìn)程的ID 
- PPID:當(dāng)前進(jìn)程的父進(jìn)程ID 
- C:當(dāng)前進(jìn)程占用的CPU的百分比 
- STIME:當(dāng)前進(jìn)程啟動到現(xiàn)在的時間 
- TTY:當(dāng)前進(jìn)程在哪個終端上運行,若與進(jìn)程無關(guān),則顯示為?,若為pts/0等,則表示由網(wǎng)絡(luò)連接主機(jī)進(jìn)程。 
- CMD:命令的名稱和參數(shù) 
查找mysql進(jìn)程、java進(jìn)程、Tomcat進(jìn)程等。
還可以使用ps aux查看
常見ps操作
- ps a 顯示現(xiàn)行終端機(jī)下的所有程序,包括其他用戶的程序。 
- ps -A 顯示所有程序。 
- ps c 列出程序時,顯示每個程序真正的指令名稱,而不包含路徑,參數(shù)或常駐服務(wù)的標(biāo)示。 
- ps -e 此參數(shù)的效果和指定”A”參數(shù)相同。 
- ps e 列出程序時,顯示每個程序所使用的環(huán)境變量。 
- ps f 用ASCII字符顯示樹狀結(jié)構(gòu),表達(dá)程序間的相互關(guān)系。 
- ps -H 顯示樹狀結(jié)構(gòu),表示程序間的相互關(guān)系。 
- ps -N 顯示所有的程序,除了執(zhí)行ps指令終端機(jī)下的程序之外。 
- ps s 采用程序信號的格式顯示程序狀況。 
- ps S 列出程序時,包括已中斷的子程序資料。 
- ps -t 指定終端機(jī)編號,并列出屬于該終端機(jī)的程序的狀況。 
- ps u 以用戶為主的格式來顯示程序狀況。 
- ps x 顯示所有程序,不以終端機(jī)來區(qū)分。 
使用PS實時監(jiān)控進(jìn)程狀態(tài)
ps 命令會顯示你系統(tǒng)當(dāng)前的進(jìn)程狀態(tài),但是這個結(jié)果是靜態(tài)的。
當(dāng)有一種情況,我們需要像上面第四點中提到的通過CPU和內(nèi)存的使用率來篩選進(jìn)程,并且我們希望結(jié)果能夠每秒刷新一次。為此,我們可以將ps命令和watch命令結(jié)合起來。
watch -n 1 ‘ps -aux --sort -pmem, -pcpu’如果輸出太長,我們也可以限制它,比如前20條,我們可以使用head命令來做到。
watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’這里的動態(tài)查看并不像top或者h(yuǎn)top命令一樣。但是使用ps的好處是你能夠定義顯示的字段,你能夠選擇你想查看的字段。舉個例子,如果你只需要看名為‘root‘用戶的信息,你可以使用下面的命令:
watch -n 1 ‘ps -aux -U root u --sort -pmem, -pcpu | head 20’netstat命令
netstat命令用于顯示網(wǎng)絡(luò)相關(guān)信息,例如網(wǎng)絡(luò)連接信息,路由表信息,端口占用情況等。建議查看:
https://www.thegeekstuff.com/2010/03/netstat-command-examples/
常見參數(shù)
- -a (all)顯示所有選項,默認(rèn)不顯示LISTEN相關(guān) 
- -t (tcp)僅顯示tcp相關(guān)選項 
- -u (udp)僅顯示udp相關(guān)選項 
- -n 拒絕顯示別名,能顯示數(shù)字的全部轉(zhuǎn)化成數(shù)字。 
- -l 僅列出有在 Listen (監(jiān)聽) 的服務(wù)狀態(tài) 
- -p 顯示建立相關(guān)鏈接的程序名 
- -r 顯示路由信息,路由表 
- -e 顯示擴(kuò)展信息,例如uid等 
- -s 按各個協(xié)議進(jìn)行統(tǒng)計 
- -c 每隔一個固定時間,執(zhí)行該netstat命令。 
顯示所有連接信息
-a 選項用于顯示全部連接信息:
列出所有 tcp 端口
netstat -at
顯示監(jiān)聽狀態(tài)的端口
netstat -l
查看某特定端口被哪個進(jìn)程占用
netstat -an | grep ':8089'
總結(jié)
使用命令可以查看內(nèi)存、CPU和線程切換等信息。還可以通過命令查看進(jìn)程信息,以及進(jìn)程對內(nèi)存的占用和CPU的使用情況。
推薦閱讀
獲取《程序員面試金典.pdf》
快速掌握模板方法模式
線上系統(tǒng)CPU飆高,如何排查?
總結(jié)
以上是生活随笔為你收集整理的美女面试官问我:能说几个常见的Linux性能调优命令吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 唐诗宋词学习·100~105节
- 下一篇: Windows系统封装部署全过程介绍
