系統監控
系統監視和進程控制工具—top和free
top命令的功能
top命令顯示結果中一些常用狀態信息的具體含義
free命令的功能
系統中進程的監控—ps
什麽是進程
什麽是守護進程
什麽是父進程、子進程
ps命令的功能
系統中進程的監控—pstree、kill、pkill、pgrep
pstree命令的功能
pstree命令的用法舉例
kill命令的功能
kill命令的用法舉例
kill -9
pkill、pgrep命令的功能
1. 系統監視和進程控制工具—top和free
1) 掌握top命令的功能:top命令是Linux下常用的性能分析工具,能夠實時顯示系統中各個進程的資源占用狀況,類似於Windows的任務管理器。
2) 了解使用top命令列出系統狀態時,系統默認每5秒刷新一下屏幕上的顯示結果。
1. 第一行是任務隊列信息
12:38:33 |
當前時間 |
up 50days |
系統運行時間,格式為時:分 |
1 user |
當前登錄用戶數 |
load average: 0.06, 0.60, 0.48 |
系統負載。 三個數值分別為 1分鐘、5分鐘、15分鐘前到現在的平均值。 |
2. 第二、三行為進程和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 |
硬件中斷占用CPU時間的百分比 |
0.0% si |
軟件中斷占用CPU時間的百分比 |
3. 第四五行為內存信息。
4. 進程信息
列名 |
含義 |
PID |
進程id |
PPID |
父進程id |
RUSER |
Real user name |
UID |
進程所有者的用戶id |
USER |
進程所有者的用戶名 |
GROUP |
進程所有者的組名 |
TTY |
啟動進程的終端名。不是從終端啟動的進程則顯示為 ? |
PR |
優先級 |
NI |
nice值。負值表示高優先級,正值表示低優先級 |
P |
最後使用的CPU,僅在多CPU環境下有意義 |
%CPU |
上次更新到現在的CPU時間占用百分比 |
TIME |
進程使用的CPU時間總計,單位秒 |
TIME+ |
進程使用的CPU時間總計,單位1/100秒 |
%MEM |
進程使用的物理內存百分比 |
VIRT |
進程使用的虛擬內存總量,單位kb。VIRT=SWAP+RES |
SWAP |
進程使用的虛擬內存中,被換出的大小,單位kb。 |
RES |
進程使用的、未被換出的物理內存大小,單位kb。RES=CODE+DATA |
CODE |
可執行代碼占用的物理內存大小,單位kb |
DATA |
可執行代碼以外的部分(數據段+棧)占用的物理內存大小,單位kb |
SHR |
共享內存大小,單位kb |
nFLT |
頁面錯誤次數 |
nDRT |
最後一次寫入到現在,被修改過的頁面數。 |
S |
進程狀態。 |
COMMAND |
命令名/命令行 |
WCHAN |
若該進程在睡眠,則顯示睡眠中的系統函數名 |
Flags |
任務標誌,參考 sched.h |
cpu利用率與load average
cpu是用來幹活的,按照這個層面去理解,每個碼農都是一個cpu
cpu利用率:上一天班的時間是8個小時,而碼農敲代碼的時間為2個小時,2/8=0.25 ,25%就是碼農在一天的時間內的利用率(正常情況,cpu利用率<70%)
cpu負載:公司在一分鐘內為某個碼農安排了3個任務,而1分鐘內該碼農能做6個任務,那麽該碼農一分鐘內的負載為0.5
如果公司在5分鐘內為某個碼農安排了100個任務,而5分鐘內該碼農只能做50個任務,那麽該碼農5分鐘內的負載為2.0,即超負荷運轉
cpu負載<=1:能正常應付
cpu負載>1:超負荷運轉
如果有4核,相當於將100個任務交給4個碼農去幹,如果每個碼農的負載都是100%,那麽整體的cpu負載達到4.0則是很正常的現象
多核cpu, load average 應該 <= cpu核數 * 0.7
為何要有1分鐘,5分鐘,15分鐘三種cpu負載?
其實之所以要給出3個值,就是希望我們能結合起來看。或者說希望展示一個動態的圖表式的數據,比如最近一分鐘顯示負載120%。而最近5分鐘和15分鐘顯示負載為50%。可能你不用太過擔心。但是如果你發現系統的負載一直維持在120%以上,就必須要提高硬件配置了。
cpu利用率和cpu負載過高,都是不好的現象,但是也有可能出現,低利用率,高負載的情況:
為一個碼農分配了100個項目,毫無疑問,該碼農的負載是很高的,但是碼農在具體去做一個項目時,可能會碰到需要購買機器,或者查詢資料等耗費時間的問題,真正動手寫代碼的時間可能很短,而這段時間才是碼農真正為公司幹活的時間,如果每個項目都有類似這種問題,那麽100個項目加到一起,碼農真正工作的時間也不會太多,這就造成了低利用率。
在兩種情況下會導致一個進程在邏輯上不能運行,
1. 進程掛起是自身原因,遇到I/O阻塞,便要讓出CPU讓其他進程去執行,這樣保證CPU一直在工作
2. 與進程無關,是操作系統層面,可能會因為一個進程占用時間過多,或者優先級等原因,而調用其他的進程去使用CPU。
因而一個進程有三種狀態
3) 掌握free命令的功能:顯示內存的使用狀態。(下圖centos6中查看效果,用二維數組代表FO即free output)
1 2 3 4 5 6
1 total used free shared buffers cached
2 Mem: 24677460 23276064 1401396 0 870540 12084008
3 -/+ buffers/cache: 10321516 14355944
4 Swap: 25151484 224188 24927296
從操作系統的角度:
物理內存FO[2][1]=24677460KB
物理內存被使用的內存FO[2][2]=23276064KB
可以用內存F[2][3]=1401396KB
等式:FO[2][1] = FO[2][2] + FO[2][3]
共享內存F[2][4]=0,表示幾個進程共享的內存(數據共享)
F[2][5]=870540表示已經分配但是還未使用的buffers大小
F[2][6]=12084008表示已經分配但是還未使用的buffers大小
buffer和cache的解釋:
- 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.
也就是說buffer是用於存放要輸出到disk(塊設備)的數據的,而cache是存放從disk上讀出的數據。這二者是為了提高IO性能的,並由OS管理。
Linux和其他成熟的操作系統(例如windows),為了提高IO read的性能,總是要多cache一些數據,這也就是為什麽FO[2][6](cached memory)比較大,而FO[2][3]比較小的原因。我們可以做一個簡單的測試
- 釋放掉被系統cache占用的數據; echo 3>/proc/sys/vm/drop_caches
- 讀一個大文件,並記錄時間;
- 關閉該文件;
- 重讀這個大文件,並記錄時間;
第二次讀應該比第一次快很多。
free輸出的第二行是從一個應用程序的角度看系統內存的使用情況。
- 對於FO[3][2],即-buffers/cache,表示一個應用程序認為系統被用掉多少內存;
- 對於FO[3][3],即+buffers/cache,表示一個應用程序認為系統還有多少內存;
因為被系統cache和buffer占用的內存可以被快速回收,所以通常FO[3][3]比FO[2][3]會大很多。
這裏還用兩個等式:
- FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
- FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]
free命令的所有輸出值都是從/proc/meminfo中讀出的。
4) 掌握free命令的功能:顯示內存的使用狀態。(下面均為centos7中查看效果)
http://www.linuxatemyram.com/提到使用free
命令查看Linux
系統使用內存時,used
一項會把當前cache
的大小也會加進去,這樣會造成free
這一欄顯示的內存特別少:
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 869
Swap: 2047 6 2041
可是實際上,cache
根據應用程序的需要是可以回收利用的,因此free
這一欄並不能真實地表現有多少“可以使用”的內存。實際系統可用內存應該以available
數據為準。
linuxatemyram
所提到的free
命令也許是比較老的版本,我嘗試了RHEL 7.2
,Ubuntu 16.04
和Arch Linux
這3
個Linux
發行版,均沒有出現used
包含cache
的情況:
$ free -m
total used free shared buff/cache available
Mem: 64325 47437 3150 1860 13737 14373
另外,從man free
命令中也可以得到,目前計算used
的值是要減掉free
和buff/cache
的:
used Used memory (calculated as total – free – buffers – cache)
可以使用-w
命令行選項得到buff
和cache
各自使用的數量:
$ free -wm
total used free shared buffers cache available
Mem: 64325 48287 2476 1859 1430 12131 13524
需要註意的是,free
表示的是當前完全沒有被程序使用的內存;而cache
在有需要時,是可以被釋放出來以供其它進程使用的(當然,並不是所有cache
都可以釋放,比如當前被用作ramfs
的內存)。而available
才真正表明系統目前可以提供給應用程序使用的內存。/proc/meminfo
從3.14
內核版本開始提供MemAvailable
的值;在2.6.27
~3.14
版本之間,是free
程序自己計算available
的值;早於2.6.27
版本,available
的值則同free
一樣。
2. 系統中進程的監控—ps
1) 掌握進程的定義:進程是程序的一次動態執行。
2) 掌握守護進程的定義:守護進程是在後臺運行並提供系統服務的一些進程。
3) 掌握父進程、子進程的定義:當一個進程創建另一個進程時,第1個進程被稱為新進程的父進程,而新進程被稱為子進程。
4) 掌握ps命令的功能:用來顯示當前進程的狀態。
Ps –aux 顯示所有的與用戶相關的完整信息
系統中進程的監控pstree、kill
centos7默認沒有pstree,需要yum -y install psmisc
1) 掌握pstree命令的功能:以樹狀圖顯示程序。
2) 掌握pstree命令的用法舉例:
例如:列出PID為4729的進程的進程狀態樹的命令:pstree 4729
3) 掌握kill命令的功能:把一個信號發送給一個或多個進程。默認發送終止信號。
4) 靈活應用kill命令終止進程
例如:終止PID為3852的進程的命令:kill 3852
5) 靈活應用kill -9命令殺死進程
例如:殺死PID為3906的進程的命令:kill -9 3906
3. 掌握pgrep命令的功能:通過名稱或其他屬性查找進程
例如:查找名為firefox的進程的命令為:pgrep firefox
4. 掌握pkill命令的功能:通過名稱或其他屬性發信號給進程
例如:殺死名為firefox的進程的命令為:pkill firefox
系統監控