進程
進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。
Linux進程
Linux系統會在進程之間共享程序代碼和系統函數庫,所以在任何時刻內存中都只有代碼的一份拷貝。Linux會爲程序創建一個特殊的環境,該環境包含程序運行需要的所有資源,以保證程序能夠獨立運行,不受其他程序的干擾。這個特殊的環境就稱爲進程。每個 Linux 命令都與系統中的程序對應,輸入命令,Linux 就會創建一個新的進程。系統通過一個五位數字跟蹤程序的運行狀態,這個數字稱爲 pid 或進程ID。每個進程都擁有唯一的 pid。理論上,五位數字是有限的,當數字被用完時,下一個 pid 就會重新開始,所以 pid 最終會重複。但是,兩個 pid 一樣的進程不能同時存在,因爲Linux會使用 pid 來跟蹤程序的運行狀態。
前臺進程
默認情況下,用戶創建的進程都是前臺進程;前臺進程從鍵盤讀取數據,並把處理結果輸出到顯示器。我們可以看到前臺進程的運行過程。例如,使用 ls -l 命令來遍歷當前目錄下的文件:
後臺進程
後臺進程與鍵盤沒有必然的關係。當然,後臺進程也可能會等待鍵盤輸入。後臺進程的優點是不必等待程序運行結束就可以輸入其他命令。創建後臺進程最簡單的方式就是在命令的末尾加 &,例如:
前臺任務和後臺任務的切換
fg 命令可以將後臺任務調到前臺,語法爲:fg jobnumber
jobnumber 是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果後臺只有一個任務,可以不指定 jobnumber。
bg 命令可以將後臺暫停的任務,調到前臺繼續運行,語法爲:bg jobnumber
jobnumber 同樣是通過 jobs 命令獲取的後臺任務的的序號,注意不是pid。如果前臺只有一個任務,可以不指定 jobnumber。
如果希望將當前任務轉移到後臺,可以先 Ctrl+z 暫停任務,再使用 bg 命令。任務轉移到後臺可以空出終端,繼續輸入其他命令。
任務和進程
任務(task)是最抽象的,是一個一般性的術語,指由軟件完成的一個活動。一個任務既可以是一個進程,也可以是多個進程。簡而言之,它指的是一系列共同達到某一目的的操作。例如,讀取數據並將數據放入內存中。這個任務可以由一個進程來實現,也可以由多個進程來實現。 每個任務都有一個數字表示的任務號。進程(process)常常被定義爲程序的執行。可以把一個進程看成是一個獨立的程序,在內存中有其完備的數據空間和代碼空間。一個進程所擁有的數據和變量只屬於它自己。
jobs 命令可以用來查看系統中正在運行的任務,包括後臺運行的任務。該命令可以顯示任務號及其對應的進程ID。一個任務可以對應於一個或者多個進程號。
jobs 命令的 -l 選項可以查看當前任務包含的進程ID
其中,第一列表示任務號,第二列表示任務對應的進程ID,第三列表示任務的運行狀態,第四列表示啓動任務的命令。
查看正在運行的進程
可以使用 ps 命令查看進程的運行狀態,包括後臺進程,例如:
還可以結合 -f 選項查看更多信息,f 是 full 的縮寫.
每列的含義如下:
列 | 描述 |
---|---|
UID | 進程所屬用戶的ID,即哪個用戶創建了該進程。 |
PID | 進程ID。 |
PPID | 父進程ID,創建該進程的進程稱爲父進程。 |
C | CPU使用率。 |
STIME | 進程被創建的時間。 |
TTY | 與進程有關的終端類型。 |
TIME | 進程所使用的CPU時間。 |
CMD | 創建該進程的命令。 |
ps 命令還有其他一些選項:
選項 | 說明 |
---|---|
-a | 顯示所有用戶的所有進程。 |
-x | 顯示無終端的進程。 |
-u | 顯示更多信息,類似於 -f 選項。 |
-e | 顯示所有進程。 |
Centos5/6: init
Centos7: systemd
終止進程
當進程運行在前臺時,可以通過 kill 命令或 Ctrl+C 組合鍵來結束進程。
如果進程運行在後臺,那麼首先要通過 ps 命令來獲取進程ID,然後使用 kill 命令“殺死”進程,例如:
如上所示,kill 命令終結了 autofs 進程。
可以使用 pgrep 命令來進行進程過濾:
顯示某一用戶運行的所有進程:
父進程和子進程
每個 Linux 進程會包含兩個進程ID:當前進程ID(pid)和父進程ID(ppid)。可以暫時認爲所有的進程都有父進程。
由用戶運行的大部分命令都將 Shell 作爲父進程,使用 ps -f 命令可以查看當前進程ID和父進程ID。
使用 pstree 命令查看進程樹:
殭屍進程和孤兒進程
正常情況下,子進程被終止時會通過 SIGCHLD 信號通知父進程,父進程可以做一些清理工作或者重新啓動一個新的進程。但在某些情況下,父進程會在子進程之前被終止,那麼這些子進程就沒有了“父親”,被稱爲孤兒進程。
init 進程會成爲所有孤兒進程的父進程。init 的 pid 爲1,是Linux系統的第一個進程,也是所有進程的父進程。
如果一個進程被終止了,但是使用 ps 命令仍然可以查看該進程,並且狀態爲 Z,那麼這就是一個殭屍進程。殭屍進程雖然被終止了,但是仍然存在於進程列表中。一般殭屍進程很難殺掉,你可以先殺死他們的父進程,讓他們變成孤兒進程,init 進程會自動清理殭屍進程。
常駐進程
常駐進程一般是系統級進程,以 root 權限運行在後臺,可以處理其他進程的請求。
常駐進程沒有終端,不能訪問 /dev/tty 文件,如果使用 ps -ef 查看該進程,tty 這一列會顯示問號(?)。
更確切地說,常駐進程通常運行在後臺,等待指定事件發生,例如打印進程是一個常駐進程,它會等待用戶輸入打印相關的命令並進行處理。
top命令
top 命令是一個很有用的工具,它可以動態顯示正在運行的進程,還可以按照指定條件對進程進行排序,與Windows的任務管理器類似。
top 命令可以顯示進程的很多信息,包括物理內存、虛擬內存、CPU使用率、平均負載以及繁忙的進程等。例如:
htop 是一個 Linux 下的交互式的進程瀏覽器,可以用來替換 Linux 下的 top 命令:
vmstat是Virtual Meomory Statistics(虛擬內存統計)的縮寫,可對操作系統的虛擬內存、進程、CPU活動進行監控,對系統的整體情況進行統計。
字段說明:
Procs(進程):
r: 運行隊列中進程數量
b: 等待IO的進程數量
Memory(內存):
swpd: 使用虛擬內存大小
free: 可用內存大小
buff: 用作緩衝的內存大小
cache: 用作緩存的內存大小
Swap:
si: 每秒從交換區寫到內存的大小
so: 每秒寫入交換區的內存大小
IO:(現在的Linux版本塊的大小爲1024bytes)
bi: 每秒讀取的塊數
bo: 每秒寫入的塊數
系統:
in: 每秒中斷數,包括時鐘中斷。【interrupt】
cs: 每秒上下文切換數。 【count/second】
CPU(以百分比表示):
us: 用戶進程執行時間(user time)
sy: 系統進程執行時間(system time)
id: 空閒時間(包括IO等待時間),中央處理器的空閒時間 。以百分比表示。
wa: 等待IO時間
備註:
如果r經常大於4,id經常少於40,表示cpu的負荷很重。
如果bi,bo長期不等於0,表示內存不足。
如果disk經常不等於0,且在b中的隊列大於3,表示io性能不好。
Linux在具有高穩定性、可靠性的同時,具有很好的可伸縮性和擴展性,能夠針對不同的應用和硬件環境調整,優化出滿足當前應用需要的最佳性能。因此企業在維護Linux系統、進行系統調優時,瞭解系統性能分析工具是至關重要的。
強大的性能監測工具 dstat
dstat命令是一個用來替換vmstat、iostat、netstat、nfsstat和ifstat這些命令的工具,是一個全能系統信息統計工具
dstat使用說明:
直接使用 dstat,默認使用的是 -cdngy 參數,分別顯示 cpu、disk、net、page、system 信息
CPU狀態:CPU的使用率。顯示了用戶,系統和空閒部分,這更好地分析了CPU當前的使用狀況。如果你看到"wait"一欄中,CPU的狀態是一個高使用率值,那說明系統存在一些其它問題。當CPU的狀態處在"waits"時,那是因爲它正在等待I/O設備(例如內存,磁盤或者網絡)的響應而且還沒有收到。
磁盤統計(dsk):磁盤的讀寫操作,這一欄顯示磁盤的讀、寫總數。
網絡統計(net):網絡設備發送和接受的數據,這一欄顯示的網絡收、發數據總數。
分頁統計(paging):系統的分頁活動。分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。
系統統計(system):這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時纔有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。你的服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。
默認情況下,dstat每秒都會刷新數據。如果想退出dstat,你可以按"CTRL+C"鍵。
需要注意的是報告的第一行,通常這裏所有的統計都不顯示數值的。
dstat的參數詳情
- -c:顯示cpu當前狀態
- -C:加cpu號分別顯示cpu
- -l:顯示負載統計量
- -m:顯示內存狀態包括used,buffer,cache,free
- -n:顯示網卡總狀態
- -nf:分頁顯示網卡裝填
- -r:顯示i/o統計
- -s:顯示交換分區的狀態
- -t:顯示時間
- -fs:顯示文件系統統計數據,包括文件總數和innodes值
- -nocolor:輸出不現實顏色
- -socket:統計網絡數據
- -tcp:顯示tcp統計
- -udp:顯示udp統計
定製時間和輸出間隔,比如 dstat -nf 2 5
表示輸出網絡設備 2秒一次 一共輸出5次