Linux下的進程調度與作業管理
一、概述
1.1 進程的相關概念:
通過前面的幾個章節,我們幾乎已經學習了很多的linux的基礎,這個章節我們講一下linux下的進程管理,就像windows 下的進程一樣,我們知道windows 下有一個任務管理器,專門用來管理進程,我們首先看一下windows 的任務管理器:
從這2個圖我們可以看出,windows 下的進程管理是不需要我們用戶進行過多的調度的,我們有時候也會遇到比如說某一個進程占用CPU過多,我們的主機或者說操作系統就會變得非??ǎ袝r會出現”假死”的現象,在windows XP之前的版本,甚至包括XP都會出現真死的情況,就是鼠標卡住一動不動,也就是我們說的死機,造成這種原因一般就是CPU運行的負載過大,或者說某一個進程占用CPU時間太長,占用的CPU太多,造成的進程堵塞的情況,想必有維修經驗的同學都會遇到這樣的情況,由于windows大多是單任務 單用戶的系統,所以出現死機的情況我們只能“重啟”解決。但是如果是生產中的服務器,我們也reboot解決嗎。你要知道生產中的服務器是不允許沒有任何通知的情況下進行操作系統重啟操作的,我們又知道,linux內核是支持多任務、多用戶同時訪問的,所以我們可以在這個用戶死機的時候,用ALT+F1~F7 切換到其他的終端,在其他的終端上使用root權限把占用過的CPU的進程kill掉,這樣就能解決死機的問題了,這就是我們需要了解和掌握的linux 內存調度。
所謂進程,我們可以簡單理解,把進程想象成動態的程序,由于計算機只能識別二進制文件,所以我們在硬盤上存儲了許許多多的二進制可執行文件(程序),當我們在命令行模式下輸入某個命令時,前面講過其實我們是觸發了一個事件,也就是啟動了一個進程而已,只不過內核需要首先判斷一下進程的發起者,其實我們登錄的shell本身就是一個進程,我們一般要運行的這個圖標:
它本身就是一個程序,在我們登錄系統的時候也是觸發了一個事件,當我們輸入賬號和密碼的時候,其實就是給了這個進程一個權限,也就是UID 和GID 權限,因為/bin/bash本身也是一個程序而已,所以我們日常登錄的shell本身就是一個進程,我們在這個shell上運行命令,當然就是從這個進程中觸發一個事件,衍生出一個新的進程來加載到內存中,等待CPU執行而已,所以說這個衍生出來的進程就叫做子進程,創造這個子進程的進程就是父進程,子進程會繼承父進程的相關運行權限,包括父進程的環境變量就是這個意思。所以說,每一個進程都有一個PID ,而衍生出來的子進程也會有一個PID,也會有一個PPID 這個PPID就是他的父進程的PID號。
說了這么多,大概大家也應該會明白相關的原理,請看下面這2個圖:
二、工作管理
2.1 什么是工作管理
工作管理(job control) 是用在bash環境下的,也就是說,當我們登錄系統取得bash shell之后,在單一終端下同時運行多個工作的行為管理,舉例來說,我們在登錄bash后,想要一邊復制文件一邊進行數據查找,一邊進行編譯,還可以一邊進行VIM程序編寫,當然我們可以重復登陸那6個命令行界面的終端環境中,不過,能不能在一個bash 中實現,當然可以,就要用到job control 。
2.2 job control 的管理
1. 直接將命令丟到后臺中執行的 &
把某些工作直接丟到后臺環境中,讓我們可以繼續操作前臺的工作,例如:
2. 將目前的工作丟到后臺中“暫?!?: ctrl + z
比如我們正在編輯/etc/passwd 這個文件,我們發現想要查詢一個當前shell的一個其他文件的信息,那么可以使用ctrl+z 這個命令暫時將我們當前的任務掛起
+表示最近一個被丟進后臺的工作
3. 查看目前的后臺的工作狀態: jobs
jobs [-lrs]
選項:
-l 除了列出job number 與命令字串之外 同時列出PID的號碼
-r 僅列出在后臺run運行的工作
-s 僅列出正在后臺當中暫停(stop)的工作
4. 將后臺工作拿到前臺來處理 fg %number
例如:我們可以把剛才的vim 編輯的文件 返回到前臺接著進行編輯
[root@localhost test]# fg %3
vim passwd
5. 讓工作在后臺下的狀態變成運行中 bg
例如:執行find / ! -perm /111 > /tmp/text.text 后立即丟到后臺去暫停
然后我們運行bg %1 在運行jobs 來查看一下狀態
我們會發現現在1 這個作業的狀態是在后臺運行的running 態
6. 管理后臺當中的工作:kill
kill -signal %jobnumber
選項:
-l 這個是L的小寫,列出目前kill 能夠使用的信號(singnal) 有哪些
signal 代表給予后面接的那個工作什么樣的指示
這里詳細說明以下幾個數字的涵義:
-1 重新讀取一次參數的配置文件(類似于reload)
-2 代表與有鍵盤輸入 ctrl -c 同樣的操作
-9 立刻強制刪除一個工作
-15 以正常的程序方式終止一項工作,與-9 不一樣的
例如,我們把這個工作強制終止:
如果我們想讓工作3這個任務正常退出,則使用-15 例如:
2.3 進程管理
2.3.1 進程的查看
1. ps命令
選項:
-A 所有進程均顯示出來,與-e 具有同樣的作用
-a 不與終端 terminal 有關的所有進程
-u 有效用戶(effective user)相關的進程
X 通常與a 這個參數一起使用,可列出比較完整的信息
a: 所有與終端相關的進程
x: 所有與終端無關的進程
帶[] 的是內核線程
u: 以用戶為中心來組織狀態信息顯示
(1)僅查看自己的bash 相關進程ps -l
下面分別講解一下每一列的意義:
F : 代表這個進程的標志 (process flags) 說明這個進程的權限 常見的號碼有
**4** 表示此進程的權限為 root
**1** 表示此子進程金科進行復制(fork) 而無法實際執行(exec)
S 代表這個進程的狀態(STAT) 主要的狀態有:
**R** (Running)該進程正在運行中
**S** (Sleep)該進程目前正在睡眠狀態idle 但可以被喚醒
**D** 不可被喚醒的睡眠狀態 通常這個進程可能在等待I/O 的情況
**T** 停止狀態(STOP) 可能是在工作控制(后臺暫停)或出錯(traced)狀態
**Z** (Zombie)“僵尸”狀態,進程已經終止,但卻無法被刪除至內存外
UID/PID/PPID 代表此進程被改UID 所擁有 / 進程的PID號碼 / 此進程的PPID號碼
C 代表CPU使用率 單位為百分比
PRI/NI Priority/Nice 縮寫,代表此進程被CPU所執行的優先級,數值越小,代表該進程越快被CPU執行
ADDR/SZ/WCHAN 都與內存有關, ADDR 是 kernel function 指出該進程在內存的哪個部分,如果似乎個running 的進程,一般就會顯示為“-”,SZ 代表此進程用掉多少內存
WCHAN 表示目前進程是否運行中,“-” 表示正在運行中
TTY 登錄者的終端機的位置,若為遠程登陸則使用動態終端接口(pts/n)
TIME 使用掉的CPU時間,注意,是此進程花費的CPU運行的時間,不是系統時間
CMD 就是command 的縮寫,造成此程序的觸發進程的命令為何
2. 查看系統所有的進程 ps aux
解釋一下各個字段的涵義
USER 改進程屬于哪個用戶賬號
PID 該進程的進程標識符
%CPU 該進程使用掉的CPU資源百分比
%MEM 該進程所占用的物理內存百分比
VSZ 該進程使用掉的虛擬內存量(KB)
RSS 該進程占用的固定的物理內存兩(KB)
TTY 該進程是在那個終端機上面運行,若與終端機關無關則顯示 ? 另外 tty1~tty6是本機上面登錄者程序,若為pts/0等 則表示為由網絡連接進主機的進程
STAT 該進程目前的狀態,
R running 運行態
S Interuptable sleeping 可中斷睡眠
D uninteruptable sleeping 不可中斷睡眠
T Stopped 停止態
Z zombie 僵尸態
+ 前臺進程
l 多線程進程
N 低優先級進程
< 高優先級進程
s session leader 會話主導者
3. 其他ps 命令
(1)ps -lA 顯示出所有的進程
(2)ps axjf 顯示出進程之間的關系
(3)ps axo 自定義顯示列表 如只顯示 user,pid,command,psr,pri,ni 等信息
4. pgrep 命令
pgrep [OPTIONS] “PATTERN”
-U UID 僅顯示以指定用戶身份運行的進程
-G GID 僅顯示以指定用戶組的身份運行的進程
-I顯示PID 和進程名
5. 顯示指定命令所啟動的進程ID pidof
語法格式 pidof PROGRAM (給定的命令行程序)
6.top 命令 動態查看進程的變化
相對于ps是選取一個時間點的進程狀態,top 則可以持續檢測進程運行的狀態
top [-d數字] | top [-bnp]
選項:
-d 后面可以接秒數,就是整個進程界面更新的秒數,默認是5S
-b 以批次方式執行top 還有更多的參數可以使用。
通常會搭配重定向來講批處理的結果輸出成為文件
-n 與 -b 搭配,意義是:需要進行幾次top 的輸出結果
-p 指定某些個PID 來進行查看監測而已
在top 執行過程中可以使用按鍵命令
? 顯示在top 正當中可以輸入按鍵命令
P 以CPU 的使用資源排序顯示
M 以內存的使用資源排序顯示
N 以PID 來排序
T 由該進程使用的CPU時間累計(TIME+)排序
k 給予某個PID 一個信號(signal)
r 給予某個PID重新定義一個nice值
q 離開top軟件的按鍵
上圖就是運行top 命令后顯示出的內容,現在分別講述一下top 頭幾行信息的意義:
第一行top
目前的時間 17:39:31
開機到目前為止經過的時間 即 up 3:16
已經登錄系統的用戶人數 2 users 這個選項
后面的load average:0.00 0.01 0.05 分別是系統在1分鐘 5分鐘 15分鐘平均要負責運行幾個進程的意思,越小代表系統越閑置,若高于1就得注意系統壓力是否過大了
第二行
Tasks... 顯示的是目前進程的總量與個別進程在什么狀態(running,sleeping,stopped,zombie)比較注意的是最后的zombie 那個數值,如果不是0 要查詢是哪個編程了僵尸態
第三行
CPUs... 顯示的是CPU的整體負載,每隔選項可使用?查閱 需要特別注意的是 %wa 那個選項代表的是 I/Owait 同城系統變慢的原因就是這個值比較大
第四行與第五行
表示目前的物理內存與虛擬內存的使用情況,要注意的是swap 的使用量盡量少,如果swap被大量使用,表示系統的物理內存不足
第六行 就是top的首部
這里的列表的意義與PS 中的基本類似,這里就不加以詳細說明了
7. htop命令的用法
htop 是 top 的升級版,系統里面并沒有安裝,需要我們手動去安裝一下htop
上圖是運行htop 的結果,htop 需要手動配置epel yum源才能安裝運行后才能使用
顯然,htop 工具的功能更強大
htop命令:
選項:
-d #:指定延遲時間間隔;
-u UserName:僅顯示指定用戶的進程;
-s COLUME:以指定字段進行排序;
子命令:
l:顯示選定的進程打開的文件列表;
s:跟蹤選定的進程的系統調用;
t:以層級關系顯示各進程狀態;
a:將選定的進程綁定至某指定的CPU核心;
8. vmstat 檢測系統資源變化的命令
-
Report virtual memory statistics
vmstat [options] [delay [count]]
procs:
r:等待運行的進程的個數;CPU上等待運行的任務的隊列長度;
b:處于不可中斷睡眠態的進程個數;被阻塞的任務隊列的長度;
memory:
swpd:交換內存使用總量;
free:空閑的物理內存總量;
buffer:用于buffer的內存總量;
cache:用于cache的內存總量;
swap
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap的速率(kb/s)
io
bi:從塊設備讀入數據到系統的速度(kb/s)
bo:保存數據至塊設備的速率(kb/s)
system
in:interrupts,中斷速率;
cs:context switch, 上下文 切換的速率;
cpu
us: user space
sy:system
id:idle
wa:wait
st: stolen
選項:
-s:顯示內存統計數據;
9. pmap命令:
– report memory map of a process
pmap [options] pid [...]
-x:顯示詳細格式的信息;
另一種查看方式:cat /proc/PID/maps
10. glance工具
-
A cross-platform curses-based monitoring tool
內建命令:
常用選項:
-b:以Byte為單位顯示網上數據速率;
-d:關閉磁盤I/O模塊;
-m:關閉mount模塊;
-n:關閉network模塊;
-t #:刷新時間間隔;
-1:每個cpu的相關數據單獨顯示;
-o {HTML|CSV}:輸出格式;
-f /PATH/TO/SOMEDIR:設定輸出文件的位置;
C/S模式下運行glances命令:
服務模式:
glances -s -B IPADDR
IPADDR:本機的某地址,用于監聽;
客戶端模式:
glances -c IPADDR
IPADDR:是遠程服務器的地址;11. dstat 命令
dstat [-afv] [options..] [delay [count]]
常用選項:
-c, --cpu:顯示cpu相關信息;
-C #,#,...,total
-d, --disk:顯示磁盤的相關信息
-D sda,sdb,...,tobal
-g:顯示page相關的速率數據;
-m:Memory的相關統計數據
-n:Interface的相關統計數據;
-p:顯示process的相關統計數據;
-r:顯示io請求的相關的統計數據;
-s:顯示swapped的相關統計數據;
--tcp
--udp
--raw
--socket
--ipc
--top-cpu:顯示最占用CPU的進程;
--top-io:最占用io的進程;
--top-mem:最占用內存的進程;
--top-lantency:延遲最大的進程;
原創文章,作者:luobo3692003,如若轉載,請注明出處:http://www.www58058.com/49888