博文說明【前言】:
html
本文將經過我的口吻介紹Linux下的free命令及top命令的相關知識,在目前時間點【2017年6月19號】下,所掌握的技術水平有限,可能會存在很多知識理解不夠深刻或全面,望你們指出問題共同交流,在後續工做及學習中如發現本文內容與實際狀況有所誤差,將會完善該博文內容。java
本文參考文獻引用連接:web
一、http://www.cnblogs.com/imapla/archive/2013/02/15/2912752.html 【好文】
二、http://www.cnblogs.com/coldplayerest/archive/2010/02/20/1669949.html【必看,博主創新的使用數組方式講解,至關不錯】
三、http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316438.html
四、http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages【講解top命令的系統負載,必看必看】
五、https://www.oschina.net/question/234345_42647【CPU部分講解很是詳細】
六、http://blog.csdn.net/dxl342/article/details/53507673
七、http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316399.html 算法
正文:
數組
一:free命令緩存
free命令是顯示的當前內存的使用,-m的意思是M字節來顯示內容,應該是你們使用最頻繁的命令之一,很少說,咱們來一塊兒看看
weblogic@YDCK-APP11:~> free -m
total used free shared buffers cached
Mem: 15953 15168 785 0 668 8000
-/+ buffers/cache: 6499 9453
Swap: 8189 58 8131
weblogic@YDCK-APP11:~> 安全
參數講解:
服務器
第一部分(Mem):app
total 物理內存總量: 15953M
used 已用物理內存量: 15168M
free 空閒物理內存量: 785M
shared 當前已經廢棄不用,老是0
buffers Buffer 讀寫緩衝內存區總量:668M
cached Page 緩存內存區總量:8000M
講解:
第一部分的輸出是從操做系統(OS)層面來看的。
也就是說,從OS的角度來看,計算機上一共有:15953M(缺省時free的單位爲KB)物理內存;
在這些物理內存中有15168M被使用了;還用785M是可用的;
數學關係:total(15953M) = used(15168M) + free(785M)
dom
第二部分(-/+ buffers/cache):
(-buffers/cache) used內存數:6499M (指第一部分Mem行中的used – buffers – cached)
(+buffers/cache) free內存數: 9453M (指第一部分Mem行中的free + buffers + cached)
講解:
free輸出的第二部分是從應用程序的角度看系統內存的使用狀況。
-buffers/cache:也就是used-buffers-cache,表示當前系統中實際被程序吃掉的內存;
+buffers/cache:也就是free+buffers+cache,表示當前系統中還能夠挪用分配給程序的實際內存總數;
關於這部份內容,相信應該會有很多人和我以前同樣存在疑惑,但願你們如今能看明白。第一部分是OS角度,第二部分是應用程序角度,實際應用中,咱們主要看這一部分。
第三部分(Swap):
交換分區,這塊就不說了,你們都很清楚
補充:buffers與cached的區別
A buffer is something that has yet to be 「written」 to disk.
A cache is something that has been 「read」 from the disk and stored for later use
對於應用程序來講,buffers/cached 是等於可用的,由於buffer/cached是爲了提升文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。
因此從應用程序的角度來講 可用內存=系統free memory+buffers+cached.
buffers是指用來給塊設備作緩衝,存放即將要被處理的數據
cached是用來給文件作緩存(速度優於內存),存放已經被處理完畢的數據,若是有請求再次請求這些數據,就不用從新生成,能直接返回這些數據。
也就是說:buffers是用來存儲接受的數據,而cached是用來保存咱們處理完畢的數據
示例:
一個程序一次只能處理10KB數據,爲了提高程序的處理效率,系統在內存中劃分出緩衝區,大小爲10KB,存放下一次要處理的輸入數據,那麼這也就意味着,程序不須要等待客戶端的數據輸入,處理完以後再拿數據接着處理,這裏也就是緩衝的概念。
10KB的數據處理完了以後,咱們把結果返回給客戶端以後,系統同時在內存中劃分出緩存區,把結果保存內存中,後續有相同的數據請求時(也就意味着會產生相同的結果),咱們直接把在內存中的這個結果返回給客戶端,而不須要再從新計算生成結果。
二:top命令
TOP是一個動態顯示過程,便可以經過用戶按鍵來不斷刷新當前狀態.若是在前臺執行該命令,它將獨佔前臺,直到用戶終止該程序爲止.比較準確的說,top命令提供了實時的對系統處理器的狀態監視.它將顯示系統中CPU最「敏感」的任務列表.該命令能夠按CPU使用.內存使用和執行時間對任務進行排序;並且該命令的不少特性均可以經過交互式命令或者在我的定製文件中進行設定.
top - 18:41:57 up 631 days, 5:52, 2 users, load average: 0.40, 0.40, 0.43
Tasks: 161 total, 1 running, 160 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.2%us, 0.2%sy, 0.0%ni, 97.5%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 15953M total, 15259M used, 694M free, 669M buffers
Swap: 8189M total, 58M used, 8131M free, 8090M cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3720 weblogic 20 0 6158m 4.7g 32m S 18 30.3 1414:00 java
3657 weblogic 20 0 4004 528 436 S 1 0.0 48:07.16 cronolog
13241 weblogic 20 0 8920 1168 828 R 0 0.0 0:00.45 top
1 root 20 0 10540 736 700 S 0 0.0 5:13.87 init
2 root 20 0 0 0 0 S 0 0.0 0:19.24 kthreadd
3 root 20 0 0 0 0 S 0 0.0 7:19.45 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:39.72 migration/0
7 root RT 0 0 0 0 S 0 0.0 2:12.06 watchdog/0
8 root RT 0 0 0 0 S 0 0.0 0:52.89 migration/1
10 root 20 0 0 0 0 S 0 0.0 1:54.42 ksoftirqd/1
...省略下方輸出...
參數講解:
第一部分(top,全局信息):
18:41:57 #當前系統時間
up 631 days, 5:52 #系統開機運行時間爲631天5小時52分
2 users #當前登陸用戶數
load average: 0.40, 0.40, 0.43 #系統負載,即任務隊列的平均長度。 三個數值分別對應爲1分鐘、5分鐘、15分鐘前到如今的平均值。
load average數據是每隔5秒鐘檢查一次活躍的進程數,而後按特定算法計算出的數值。
這個參數跟服務器的虛擬CPU(也就是處理器的核心)數量有關,一個虛擬CPU對應的一個值範圍是0-1,多個虛擬CPU是累加的關係。也就是說,好比我如今就一個虛擬CPU,當前的系統負載的值爲1,那就意味着,個人系統處於徹底開工狀態,也就是使用了所有的容量,咱們能夠把系統負載比做一條道路,再跑的活躍的程序就至關於在這條路上奔跑的汽車,當值位1的時候,就意味着我這條路上已經跑滿了車,若是值爲2的數,那麼剩下的一倍容量(汽車)就須要等待當前的進程都處理完了以後,才能進入這條道路。
多處理器(CPU)系統中,和處理器的總核心數量掛鉤,1表示單核(單車道)的滿負載,2表示雙核(雙車道)的滿負載,3表示3核心(三車道)的滿負載。
注意:處理器數量和核心數量是兩個不一樣的概念東西。一個處理器中能夠包含多個處理器核心,而咱們在這裏使用的參數的處理器核心,而不是處理器個數,必定要注意。
第二部分(Tasks,進程信息):
161 total #系統已經加載的進程總數(161個)
1 running #處於運行狀態的進程數量(1個)
160 sleeping #處理休眠狀態的進程數量(160個)
0 stopped #處理中止狀態的進程數量(0個)
0 zombie #處理殭屍狀態的進程數量(0個)
第三部分(Cpu(s),cpu信息)
Cpu(s): 2.2%us, 0.2%sy, 0.0%ni, 97.5%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
這裏各個參數值顯示的都是百分比。
點數字鍵1能夠展開或合上多個CPU, 以下:
Cpu0 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.3%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
us -- User CPU time-【用戶空間佔用CPU百分比】
CPU花在未調整優先級的(not niced)用戶進程的時間。
The time the CPU has spent running users’ processes that are not niced.
注: nice 命令: 調整程序運行的優先級(範圍 -20 到 19,越大,優先級越高)
sy -- System CPU time-【內核空間佔用CPU百分比】
CPU花在內核及其進程上的時間。
The time the CPU has spent running the kernel and its processes.
ni -- Nice CPU time CPU花在調整過優先級的(niced)用戶進程的時間。
The time the CPU has spent running users’ proccess that have been niced.
id -- ? time CPU花在空閒等待的時間,也就是空閒CPU百分比
wa -- iowait-【等待輸入輸出的CPU時間百分比】
等待I/O結束的CPU時間。
Amount of time the CPU has been waiting for I/O to complete.
hi -- Hardware IRQ-【硬件CPU中斷佔用百分比】
CPU花在硬件中斷的時間。
The amount of time the CPU has been servicing hardware interrupts.
si -- Software Interrupts-【軟中斷佔用百分比】
CPU花在軟件中斷的時間。
The amount of time the CPU has been servicing software interrupts.
st -- Steal Time-【虛擬機佔用百分比】
The amount of CPU ’stolen’ from this virtual machine by the hypervisor for other tasks (such
as running another virtual machine).
第四部分(MEM-內存信息)
15953M total #物理內存總量
15259M used #已使用的物理內存總量
694M free #空閒的物理內存總量(不包括緩存和緩衝區)
669M buffers #buffer緩存區使用的內存總量
第五部分(Swap,交換分區信息)
8189M total #交換分區的總量
58M used #已使用的交換分區總量
8131M free #空閒的交換分區總量
8090M cached #cached緩存區的交換區總量,這個值按道理用該放在第四部分,實際佔用的空間是物理內存,意義請參考前面的free命令,放在第五行是爲了美觀。
第六部分(進程信息)
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3720 weblogic 20 0 6158m 4.7g 32m S 18 30.3 1414:00 java
3657 weblogic 20 0 4004 528 436 S 1 0.0 48:07.16 cronolog
13241 weblogic 20 0 8920 1168 828 R 0 0.0 0:00.45 top
...省略...
PID #進程ID
USER #進程全部者
PR #進程優先級
NI #nice值,負值表示高優先級,正值表示低優先級
VIRT #進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
RES #進程使用的,未被換出的物理內存大小,單位kb。RES=CODE+DATA
SHR #共享內存大小,單位kb
S #進程狀態(D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程)
%CPU #進程啓動後所佔用的CPU時間百分比,單位1/100秒
%MEM #進程使用的物理內存百分比
TIME+ #進程使用的CPU時間總計
COMMAND #任務名稱
序號 列名 含義
a PID 進程id
b PPID 父進程id
c RUSER Real user name
d UID 進程全部者的用戶id
e USER 進程全部者的用戶名
f GROUP 進程全部者的組名
g TTY 啓動進程的終端名。不是從終端啓動的進程則顯示爲 ?
h PR 進程優先級
i NI nice值。負值表示高優先級,正值表示低優先級
j P 最後使用的CPU,僅在多CPU環境下有意義
k %CPU 進程啓動後的CPU時間佔用百分比
l TIME 進程使用的CPU時間總計,單位秒
m TIME+ 進程使用的CPU時間總計,單位1/100秒
n %MEM 進程使用的物理內存百分比
o VIRT 進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES
p SWAP 進程使用的虛擬內存中,被換出的大小,單位kb。
q RES 進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA
r CODE 可執行代碼佔用的物理內存大小,單位kb
s DATA 可執行代碼之外的部分(數據段+棧)佔用的物理內存大小,單位kb
t SHR 共享內存大小,單位kb
u nFLT 頁面錯誤次數
v nDRT 最後一次寫入到如今,被修改過的頁面數。
w S 進程狀態(D=不可中斷的睡眠狀態,R=運行,S=睡眠,T=跟蹤/中止,Z=殭屍進程)
x COMMAND 命令名/命令行
y WCHAN 若該進程在睡眠,則顯示睡眠中的系統函數名
z Flags 任務標誌,參考 sched.h
默認狀況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。能夠經過下面的快捷鍵來更改顯示內容。
更改顯示內容經過 f 鍵能夠選擇顯示的內容。按 f 鍵以後會顯示列的列表,按 a-z 便可顯示或隱藏對應的列,最後按回車鍵肯定。
按 o 鍵能夠改變列的顯示順序。按小寫的 a-z 能夠將相應的列向右移動,而大寫的 A-Z 能夠將相應的列向左移動。最後按回車鍵肯定。
按大寫的 F 或 O 鍵,而後按 a-z 能夠將進程按照相應的列進行排序。而大寫的 R 鍵能夠將當前的排序倒轉。
top命令補充:
命令格式:top [-] [d] [p] [q] [c] [C] [S] [s] [n]
d 指定每兩次屏幕信息刷新之間的時間間隔。固然用戶可使用s交互命令來改變之。
p 經過指定監控進程ID來僅僅監控某個進程的狀態。
q 該選項將使top沒有任何延遲的進行刷新。若是調用程序有超級用戶權限,那麼top將以儘量高的優先級運行。
S 指定累計模式
s 使top命令在安全模式中運行。這將去除交互命令所帶來的潛在危險。
i 使top不顯示任何閒置或者僵死進程。 -【這個比較有用】
c 顯示整個命令行而不僅是顯示命令名 -【這個比較有用,組合使用,top -ic】
NTP-slave:~ # top -ic
top - 07:15:19 up 5 days, 1:58, 2 users, load average: 0.30, 0.18, 0.10
Tasks: 118 total, 1 running, 117 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.2%sy, 0.0%ni, 99.5%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1910720k total, 1809476k used, 101244k free, 200864k buffers
Swap: 4192252k total, 0k used, 4192252k free, 1506872k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
47347 root 20 0 8916 1112 808 R 2 0.1 0:00.01 top -ic
其餘實用命令
下面介紹在top命令執行過程當中可使用的一些交互命令。從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,若是在命令行選項中使用了s選項,則可能其中一些命令會被屏蔽掉。
Ctrl+L 擦除而且重寫屏幕。
h或者? 顯示幫助畫面,給出一些簡短的命令總結說明。
k 終止一個進程。系統將提示用戶輸入須要終止的進程PID,以及須要發送給該進程什麼樣的信號。通常的終止進程可使用15信號;若是不能正常結束那就使用信號9強制結束該進程。默認值是信號15。在安全模式中此命令被屏蔽。
i 忽略閒置和僵死進程。這是一個開關式命令。
q 退出程序。
r 從新安排一個進程的優先級別。系統提示用戶輸入須要改變的進程PID以及須要設置的進程優先級值。輸入一個正值將使優先級下降,反之則可使該進程擁有更高的優先權。默認值是10。
S 切換到累計模式。
s 改變兩次刷新之間的延遲時間。系統將提示用戶輸入新的時間,單位爲s。若是有小數,就換算成m s。輸入0值則系統將不斷刷新,默認值是5 s。須要注意的是若是設置過小的時間,極可能會引發不斷刷新,從而根原本不及看清顯示的狀況,並且系統負載也會大大增長。
f或者F 從當前顯示中添加或者刪除項目。
o或者O 改變顯示項目的順序。
l 切換顯示平均負載和啓動時間信息。 -【就是控制最上方顯示不顯示,沒什麼用】
m 切換顯示內存信息。 -【就是控制最上方顯示不顯示,沒什麼用】
t 切換顯示進程和CPU狀態信息。 -【就是控制最上方顯示不顯示,沒什麼用】
c 切換顯示命令名稱和完整命令行。 -【有用,能看到完整的命令】
N 以 PID 的大小的順序排列表示進程列表
M 根據駐留內存大小進行排序。 -【根據內存使用狀況進行排序,有用】
P 根據CPU使用百分比大小進行排序。 -【根據CPU使用狀況進行排序,有用】
T 根據時間/累計時間進行排序。 -【根據進程使用的CPU時間總計排序,有用】
W 將當前設置寫入~/.toprc文件中。這是寫top配置文件的推薦方法。-【有用】
附經常使用操做:
top //每隔5秒顯式全部進程的資源佔用狀況
top -d 2 //每隔2秒顯式全部進程的資源佔用狀況
top -c //每隔5秒顯式進程的資源佔用狀況,並顯示進程的命令行參數(默認只有進程名)
top -p 12345 -p 6789//每隔5秒顯示pid是12345和pid是6789的兩個進程的資源佔用狀況
top -d 2 -c -p 123456 //每隔2秒顯示pid是12345的進程的資源使用狀況,並顯式該進程啓動的命令行參數
三:查看多核CPU命令
命令:mpstat -P ALL 和 sar -P ALL
示例:
weblogic@YDCK-APP18:~/domains/mcp_domain/log/7116> mpstat -P ALL
Linux 3.0.76-0.11-default (YDCK-APP18) 2017年06月16日 _x86_64_
09時39分36秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
09時39分36秒 all 0.43 0.00 0.07 0.01 0.00 0.02 0.00 0.00 99.46
09時39分36秒 0 2.48 0.00 0.37 0.04 0.00 0.16 0.00 0.00 96.95
09時39分36秒 1 0.57 0.00 0.16 0.03 0.00 0.00 0.00 0.00 99.24
09時39分36秒 2 0.07 0.00 0.01 0.00 0.00 0.00 0.00 0.00 99.91
09時39分36秒 3 0.06 0.00 0.01 0.00 0.00 0.00 0.00 0.00 99.92
09時39分36秒 4 0.08 0.00 0.02 0.02 0.00 0.00 0.00 0.00 99.88
09時39分36秒 5 0.07 0.00 0.01 0.01 0.00 0.00 0.00 0.00 99.91
09時39分36秒 6 0.04 0.00 0.01 0.00 0.00 0.00 0.00 0.00 99.95
09時39分36秒 7 0.05 0.00 0.01 0.00 0.00 0.00 0.00 0.00 99.94
結尾:
感謝閱讀,祝有收穫的一天,謝謝!