接觸 linux 的人對於 top 命令可能不會陌生(不一樣系統名字可能不同,如 IBM 的 aix 中叫 topas ),它的做用主要用來監控系統實時負載率、進程的資源佔用率及其它各項系統狀態屬性是否正常。html
下面咱們先來看張 top 截圖:java
前 8 行是系統總體的統計信息。第 1 行是任務隊列信息,同 uptime 命令的執行結果。其內容以下:linux
01:06:48 | 當前時間 |
up 1:22 | 系統運行時間,格式爲時:分 |
1 user | 當前登陸用戶數 |
load average: 0.06, 0.60, 0.48 | 系統負載,即任務隊列的平均長度。 三個數值分別爲 1分鐘、5分鐘、15分鐘前到如今的平均值。git 注意:這三個值能夠用來斷定系統是否負載太高——若是值github 持續大於系統 cpu 個數,就須要優化你的程序或者架構了。windows |
第 2~6 行爲進程和CPU的信息。當有多個CPU時,這些內容可能會超過兩行。內容以下:緩存
Tasks: 29 total | 進程總數 |
1 running | 正在運行的進程數 |
28 sleeping | 睡眠的進程數 |
0 stopped | 中止的進程數 |
0 zombie | 殭屍進程數 |
Cpu(s): 0.3% us | 用戶空間佔用CPU百分比 |
1.0% sy | 內核空間佔用CPU百分比 |
0.0% ni | 用戶進程空間內改變過優先級的進程佔用CPU百分比 |
98.7% id | 空閒CPU百分比 |
0.0% wa | 等待輸入輸出的CPU時間百分比 |
0.0% hi | Hardware IRQ |
0.0% si | Software IRQ |
注:安全
(1)IRQ: IRQ全稱爲Interrupt Request,便是「中斷請求」的意思。架構
(2)st(Steal Time):stole time 的縮寫,該項指標只對虛擬機有效,表示分配給當前虛擬機的 CPU 時間之中,被同一臺物理機上的其餘虛擬機偷走的時間百分比app
So, relatively speaking, what does this mean? A high steal percentage may mean that you may be outgrowing your virtual machine with your hosting company. Other virtual machines may have a larger slice of the CPU’s time and you may need to ask for an upgrade in order to compete. Also, a high steal percentage may mean that your hosting company is overselling virtual machines on your particular server. If you upgrade your virtual machine and your steal percentage doesn’t drop, you may want to seek another provider. A low steal percentage can mean that your applications are working well with your current virtual machine. Since your VM is not wrestling with other VM’s constantly for CPU time, your VM will be more responsive. This may also suggest that your hosting provider is underselling their servers, which is definitely a good thing.0.0% sisi(Software Interrupts)
Mem: 191272k total | 物理內存總量 |
173656k used | 使用的物理內存總量 |
17616k free | 空閒內存總量 |
22052k buffers | 用做內核緩存的內存量 |
Swap: 192772k total | 交換區總量 |
0k used | 使用的交換區總量 |
192772k free | 空閒交換區總量 |
123988k cached | 緩衝的交換區總量。 內存中的內容被換出到交換區,然後又被換入到內存,但使用過的交換區還沒有被覆蓋, 該數值即爲這些內容已存在於內存中的交換區的大小。 相應的內存再次被換出時可沒必要再對交換區寫入。 |
PS:如何計算可用內存和已用內存?
除了 free -m 以外,也能夠看 top:
Mem: 255592k total, 167568k used, 88024k free, 25068k buffers Swap: 524280k total, 0k used, 524280k free, 85724k cached
The answer is: free + (buffers + cached)
88024k + (25068k + 85724k) = 198816k
The answer is: used – (buffers + cached)
167568k – (25068k + 85724k) = 56776k
若是你的 swap used 數值大於 0 ,基本能夠判斷已經遇到內存瓶頸了,要麼優化你的代碼,要麼加內存。
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是指用來給塊設備作的緩衝大小,他只記錄文件系統的metadata以及 tracking in-flight pages.
cached是用來給文件作緩衝。
那就是說:buffers是用來存儲,目錄裏面有什麼內容,權限等等。
而cached直接用來記憶咱們打開的文件,若是你想知道他是否是真的生效,你能夠試一下,前後執行兩次命令#man X ,你就能夠明顯的感受到第二次的開打的速度快不少。
實驗:在一臺沒有什麼應用的機器上作會看得比較明顯。記得實驗只能作一次,若是想多作請換一個文件名。
#free
#man X
#free
#man X
#free
你能夠前後比較一下free後顯示buffers的大小。
另外一個實驗:
#free
#ls /dev
#free
你比較一下兩個的大小,固然這個buffers隨時都在增長,但你有ls過的話,增長的速度會變得快,這個就是buffers/chached的區別。
由於Linux將你暫時不使用的內存做爲文件和數據緩存,以提升系統性能,當你須要這些內存時,系統會自動釋放(不像windows那樣,即便你有不少空閒內存,他也要訪問一下磁盤中的pagefiles)
統計信息區域的下方顯示了各個進程的詳細信息。首先來認識一下各列的含義。
序號 | 列名 | 含義 |
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 鍵能夠將當前的排序倒轉。
從使用角度來看,熟練的掌握這些命令比掌握選項還重要一些。這些命令都是單字母的,若是在命令行選項中使用了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 切換顯示命令名稱和完整命令行。
M 根據駐留內存大小進行排序。
P 根據CPU使用百分比大小進行排序。
T 根據時間/累計時間進行排序。
W 將當前設置寫入~/.toprc文件中。這是寫top配置文件的推薦方法。
一、輸入大寫P,則結果按CPU佔用降序排序。
二、輸入大寫M,結果按內存佔用降序排序。
三、按數字 1 則能夠顯示全部CPU核心的負載狀況。
四、top -d 5 每隔 5 秒刷新一次,默認 1 秒
五、top -p 4360,4358 監控指定進程
六、top -U johndoe ‘U’爲 真實/有效/保存/文件系統用戶名。
七、top -u 500 ‘u’爲有效用戶標識
八、top -bn 1 顯示全部進程信息,top -n 1 只顯示一屏信息,供管道調用
九、top -M #show memory summary in megabytes not kilobytes
十、top -p 25097 -n 1 -b # -b 避免輸出控制字符,管道調用出現亂碼
十一、top翻頁:top -bn1 | less
十二、加強版的 top:htop ,一個更增強大的交互式進程管理器:
http://www.linuxidc.com/Linux/2011-03/33582.htm
http://os.51cto.com/art/201012/240719.htm
http://www.kernelhardware.org/linux-top-command/
http://www.ruanyifeng.com/blog/2011/07/linux_load_average_explained.html
http://www.taobaotest.com/blogs/qa?bid=2265 linux命令free詳解
http://blogread.cn/it/article/6386?f=wb top使用技巧
http://yikebocai.com/2014/11/cpu-load-too-high/ CPU Load太高問題分析和解決方案
https://github.com/oldratlee/useful-scripts useful-scripts:打印 java 佔用資源高的線程
http://newslxw.iteye.com/blog/1495565 一篇很好的linux下內存,IO解析文章
http://alanwu.blog.51cto.com/3652632/1122077 Buffer cache和page cache的區別
http://www.penglixun.com/tech/system/the_diffrents_of_page_cache_and_buffer_cache.html Page Cache和Buffer Cache的區別
http://csrd.aliapp.com/?p=13 The Page Cache FAQ(v0.1,歡迎補充與拍磚)
http://www.techug.com/4-process-manage-tools Linux 進程管理之四大名捕
http://www.ruanyifeng.com/blog/2016/12/user_space_vs_kernel_space.html User space 與 Kernel space