Linux基礎-08-進程控制

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. 第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
進程狀態。
            D=不可中斷的睡眠狀態
            R=運行
            S=睡眠
            T=跟蹤/中止
            Z=殭屍進程
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]比較小的緣由。咱們能夠作一個簡單的測試
  1. 釋放掉被系統cache佔用的數據;
echo 3>/proc/sys/vm/drop_caches 
  1. 讀一個大文件,並記錄時間;
  2. 關閉該文件;
  3. 重讀這個大文件,並記錄時間;
  第二次讀應該比第一次快不少。
  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/meminfo3.14內核版本開始提供MemAvailable的值;在2.6.27~3.14版本之間,是free程序本身計算available的值;早於2.6.27版本,available的值則同free同樣。
 
2. 系統中進程的監控—ps
1) 進程的定義:進程是程序的一次動態執行。
2) 守護進程的定義:守護進程是在後臺運行並提供系統服務的一些進程。
3) 父進程、子進程的定義:當一個進程建立另外一個進程時,第1個進程被稱爲新進程的父進程,而新進程被稱爲子進程。
4) ps命令的功能:用來顯示當前進程的狀態。
ps -aux 顯示全部的與用戶相關的完整信息
grep -v 反向匹配
ps aux |grep'firefox' |grep -v 'grep' 尋找firefox進程
3. 系統中進程的監控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
4. pgrep命令的功能:經過名稱或其餘屬性查找進程
例如:查找名爲firefox的進程的命令爲:pgrep firefox
5. pkill命令的功能:經過名稱或其餘屬性發信號給進程
例如:殺死名爲firefox的進程的命令爲:pkill firefox
 
Firefox % 將Firefox調到後臺運行
jobs 查看在後臺運行的程序
fg %1 將程序從後臺調到前臺
相關文章
相關標籤/搜索