Linux 进程管理控制
【top 工具】
top 是一個在前臺執行的程序,通過交互界面可以實時的獲取到進程的狀態與系統的信息,在交互界面中可以通過一些指令來操作和篩選。
?
常用的交互命令有:
| q | 退出程序 |
| I | 切換顯示平均負載和啟動時間的信息 |
| P | 根據 CPU 使用百分比大小進行排序 |
| M | 根據駐留內存大小進行排序 |
| i | 開關式命令,忽略閑置和僵死的進程 |
| k | 終止一個進程,系統提示輸入 PID 及發送的信號值。 一般終止進程用 15 信號,不能正常結束則使用 9 信號。 (安全模式下該命令被屏蔽) |
運行 top 后進入如下界面
1)top 中的第一行數據
?
| top | 當前程序的名稱 |
| 18:50:24 | 當前的系統時間 |
| up 6 mins | 該機器已經啟動了多長時間 |
| 1 user | 當前系統中用戶數量 |
| load average: 0.43,0.84,0.47 | 對應第 1、5、15 分鐘內 cpu 的平均負載 |
?
說明:關于 load average
① load average 是對當前 CPU 工作量的度量,是與等待 CPU 的平均進程數相關的一個計算值,也就是運行隊列的平均長度。
② 假設我們的系統是單 CPU、單內核的,把它比喻成是一條單向的橋,把 CPU 任務比作汽車,則:
當 load = 0 時,意味著這個橋上并沒有車,cpu 沒有任何任務;
當 load < 1 時,意味著橋上的車并不多,一切都還是很流暢的,cpu 的任務并不多,資源還很充足;
當 load = 1 時,意味著橋已經被車給占滿了,沒有一點空隙,cpu 的已經在全力工作,系統資源都被用完了,但還在能力范圍之內,只是有點慢而已;
當 load > 1 時,意味著不僅是橋上已經被車占滿了,連橋外也被占滿了,cpu 已經在全力的工作,系統資源都被用完了,但是還是有大量的進程在請求,在等待運行。
這是單個 CPU 單核的情況,而實際生活中我們需要將得到的這個值除以我們的核數來看。
③ load 的臨界值一般為 1 ,但在實際中,有經驗的運維或者系統管理員會將臨界值定為 0.7。
當 load < 0.7 時,并不會去關注他;
當 0.7< load < 1 時,就需要稍微關注,此時雖然還可以應付,但是這個值已經離臨界不遠了;
當 load = 1 時,就需要警惕,此時已經沒有更多的資源,cpu 已經在全力以赴了;
當 load > 5 時,系統已經快不行了,這個時候就需要系統管理員加班解決問題了
④ 通常來說,我們都會先看 15 分鐘的值來看這個大體的趨勢,然后再看 5 分鐘的值對比來看是否有下降的趨勢。
2)top 中的第二行數據
第二行數據,是進程的一個情況統計
?
| Tasks: 245 total | 進程總數 |
| 1 running | 正在運行的進程數 |
| 244 sleeping | 睡眠的進程數 |
| 0 stopped | 停止的進程數 |
| 0 zombie | 僵尸進程數 |
3)top 中的第三行數據
?
第三行數據,是對 CPU 的使用情況的統計
?
| 5.3 us | 用戶空間進程占用 CPU 百分比 |
| 3.9 sy | 內核空間運行占用 CPU 百分比 |
| 0.0 ni | 用戶進程空間內改變過優先級的進程占用 CPU 百分比 |
| 90.8 id | 空閑 CPU 百分比 |
| 0.0 wa | 等待輸入輸出的 CPU 時間百分比 |
| 0.0 hi | 硬中斷(Hardware IRQ)占用 CPU 的百分比 |
| 0.0 si | 軟中斷(Software IRQ)占用 CPU 的百分比 |
| 0.0 st | Steal time,虛擬服務中,虛擬 CPU 等待實際 CPU 的時間的百分比 |
CPU 利用率是對一個時間段內 CPU 使用狀況的統計,通過這個指標可以看出在某一個時間段內 CPU 被占用的情況,而 Load Average 是 CPU 的 Load,它所包含的信息不是 CPU 的使用率狀況,而是在一段時間內 CPU 正在處理以及等待 CPU 處理的進程數情況統計信息,這兩個指標并不一樣。
4)top 中的第四行數據
?
第四行數據,是對內存的使用情況的統計
?
| 3926.1 total | 物理內存總量 |
| 2004.8 used | 使用的物理內存總量 |
| 1174.1 free | 空閑內存總量 |
| 747.1 buff/cache | 用作內核緩存的內存量 |
系統中可用的物理內存最大值并不是 free 這個單一的值,而是 free + buffers + swap 中的 cached 的和。
5)top 中的第五行數據
第五行數據,是對交換區的使用情況的統計
?
| 4094.0 total | 交換區總量 |
| 4094.0 used | 使用的交換區總量 |
| 0.0 free | 空閑交換區總量 |
| 2494.0 avail Mem | 緩沖的交換區總量,內存中的內容被換出到交換區,而后又被換入到內存,但使用過的交換區尚未被覆蓋 |
6)top 中的第六行至結尾
從第六行到結尾,每一行都是一個進程的情況
?
| PID | 進程 id |
| USER | 進程的所屬用戶 |
| PR | 進程執行的優先級 priority 值 |
| NI | 進程的 nice 值 |
| VIRT | 進程任務所使用的虛擬內存的總數 |
| RES | 進程所使用的物理(駐留)內存數 |
| SHR | 進程共享內存的大小 |
| S | 進程的進程的狀態 |
| %CPU | 進程 CPU 的利用率 |
| %MEM | 進程內存的利用率 |
| TIME+ | 進程活躍的總時間 |
| COMMAND | 進程運行的名字 |
說明
① NICE 值叫做靜態優先級,是用戶空間的一個優先級值。其值越小,進程優先級越高;值越大,進程優先級越低。
NICE 值的取值范圍是 -20 to +19, 默認值為 0,-20 優先級最高,19 優先級最低。
② PR 值叫做動態優先級,是進程在內核中實際的優先級值,進程優先級的取值范圍是通過一個叫做 MAX_PRIO 的宏定義的,它的值為 140。其值越小,進程優先級越高;值越大,進程優先級越低。
Linux 實際上實現了 140 個優先級范圍,取值范圍是從 0 - 139,而這其中,0 - 99 是實時進程的值,100 - 139 是給用戶的。
100 - 139 的值部分,有這么一個對應:PR = 20 + (-20 to +19),這里的 -20 to +19 便是 NICE 值。
因此,NICE 值與 PR 值雖然都是優先級,而且有著千絲萬縷的關系,但是他們的值、作用范圍并不相同。
③ VIRT 表示進程任務所使用的虛擬內存的總數,其中包含所有的代碼,數據,共享庫、被換出 swap 空間的頁面等所占據空間的總數。
?
【進程的優先控制】
進程的優先執行順序是根據該進程的優先級值來判定進程調度的優先級,而優先級的值就是上文所提到的 PR 值與 NICE 值來控制、體現的。
NICE 的值可以通過 nice 命令來修改的,而需要注意的是 nice 值可以調整的范圍是 -20 ~ 19,其中 root 用戶有著最高權限,既可以調整自己的進程也可以調整其他用戶的程序,并且是所有的值都可以用,而普通用戶只可以調整屬于自己的進程,并且其使用的范圍只能是 0 ~ 19,這是系統為了避免一般用戶搶占系統資源而設置的一個限制。
nice 命令格式:nice -n 優先級數值 要調整的進程
?
實例:打開一個程序放在后臺,調整優先級后用 ps 命令查看
【ps 命令】
?
1.ps 命令,是最基本最強大的進程查看命令,可以確定正在運行的進程、運行的狀態、進程是否結束、哪些進程占用了過多的資源等。
2.命令格式:ps [選項]
3.常用選項
?
| a | 顯示現行終端機下的所有程序,包括其他用戶的程序 |
| -a | 顯示所有終端機下執行的程序,除了階段作業領導者之外 |
| u | 以用戶為主的格式來顯示程序狀況 |
| x | 顯示所有程序,不以終端機來區分 |
| f | 用ASCII字符顯示樹狀結構,表達程序間的相互關系 |
| j/-j | 采用工作控制的格式顯示程序狀況 |
| l/-l | 采用詳細的格式來顯示程序狀況 |
| -o | 自定義所需要的顯示 |
4.輸出內容說明
?
| F | 進程的標志 |
| USER | 進程的擁有用戶 |
| PID | 進程的 ID |
| PPID | 其父進程的 PID |
| SID | 會話的 ID |
| TPGID | 前臺進程組的 ID |
| %CPU | 進程占用的 CPU 百分比 |
| %MEM | 占用內存的百分比 |
| NI | 進程的 NICE 值 |
| VSZ | 進程使用虛擬內存大小 |
| RSS | 駐留內存中頁的大小 |
| TTY | 終端 ID |
| S/STAT | 進程狀態 |
| WCHAN | 正在等待的進程資源 |
| START | 啟動進程的時間 |
| TIME | 進程消耗CPU的時間 |
| COMMAND | 命令的名稱和參數 |
注:
① F(Flags)欄,當值為 1 時,表示此子程序僅是 fork() 但沒有執行 exec();當值為 4 時,表示此程序使用超級管理員 root 權限
?
②?TPGID 欄寫著 -1 的都是沒有控制終端的進程,即守護進程
③ S/STAT 欄表示進程的狀態,常見狀態如下
?
| R | Running.運行中 |
| S | Interruptible Sleep.等待調用 |
| D | Uninterruptible Sleep.不可中斷睡眠 |
| T | Stoped.暫停或者跟蹤狀態 |
| X | Dead.即將被撤銷 |
| Z | Zombie.僵尸進程 |
| W | Paging.內存交換 |
| N | 優先級低的進程 |
| < | 優先級高的進程 |
| s | 進程的領導者 |
| L | 鎖定狀態 |
| l | 多線程狀態 |
| + | 前臺進程 |
5.常用查詢命令
?
1)羅列出所有的進程信息:ps aux
2)查找某個進程,還可以配合 grep 與正則表達式一起使用:ps | grep 進程名
3)將連同部分的進程呈樹狀顯示出來:ps axjf
4)自定義所需要的顯示:ps -afxo user,ppid,pid,pgid,command...
【pgrep 命令】
1.作用:以名稱為依據從運行進程隊列中查找進程,并顯示查找到的進程 pid,一般用來判斷程序是否正在運行。
2.命令格式:pgrep [選項] 進程名
注:pgrep 命令支持 grep 命令的匹配模式
3.常見選項:
?
| -o | 僅顯示找到的最小(起始)進程號 |
| -n | 僅顯示找到的最大(結束)進程號 |
| -l | 顯示進程名稱 |
| -P | 指定父進程號 |
| -g | 指定進程組 |
| -t | 指定開啟進程的終端 |
| -u | 指定進程的有效用戶ID |
4.實例:
【pstree 命令】
?
1.作用:直接的看到相同的進程數量,最主要的還可以看到所有進程之間的相關性。
2.命令格式:pstree [選項]
3.常見選項:
?
| -a | 顯示完整指令 |
| -p | 顯示PID |
| -u | 顯示用戶名稱 |
| -n | 以程序識別碼排序(默認是以程序名稱排序) |
4.實例:
總結
以上是生活随笔為你收集整理的Linux 进程管理控制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++语言基础 —— STL —— 容器
- 下一篇: 吃奶酪(洛谷-P1433)