Linux系統中的基本運行單位是進程,通過對系統系統中的進程的管理能夠對系統的實時運行狀態進行了解和調度。Linux中提供了用於查看、調整和停止進程的命令。本文仍然以RHEL6說明Linux系統的進程管理。
一、進程概述
程序是保存在存儲介質中的可執行機器代碼(或指令)和數據的集合,而進程是在計算機處理器執行中的計算機程序。他們的關系如下:
- 程序是保存在外部存儲介質中的可執行代碼和數據,是靜態保存的代碼。
- 進程是程序代碼在處理器中的運行,是動態執行的代碼。
- 操作系統在執行程序時,將代碼有外部存儲介質(硬盤)讀取到內部存儲介質(內存)中,駐留在內存中的程序代碼作為進程在CPU中被動態執行。
- Linux是多進程操作系統,每個程序啟動時可以創建多個進程,與其他程序創建的進程共同運行在Linux內核空間。每個進程都是一個獨立的任務,它們一招操作系統內核制定的規則交替被CPU執行。每個單獨的進程運行在自己的虛擬地址空間,並且只能通過安全的內核管理機制與其他進程進行交互。
在進程的生存期內將使用許多系統資源,它將使用CPU來運行指令,使用物理內存來保存執行代碼和數據,它將打開和使用文件子系統中的文件,並直接或間接地使用系統中的物理設備。
二、查看進程
1、使用ps命令
常用參數:
a 顯示所有用戶的所有進程(包括其它用戶);
u 按用戶名和啟動時間的順序來顯示進程;
x 顯示無控制終端的進程;
e 顯示所有進程,包括沒有控制端的進程;
f 用樹形格式來顯示進程;
l 長格式輸出;
w 為了避免詳細參數被截斷,可以用多個w來讓其顯示完整(比如說ww或者是www);
o 需要查看的選項
舉例說明:
[root@Vtest ~]# ps aux|more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.2 2864 1396 ? Ss 13:30 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S 13:30 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 13:30 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S 13:30 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S 13:30 0:00 [migration/0] root 6 0.0 0.0 0 0 ? S 13:30 0:00 [watchdog/0] root 7 0.0 0.0 0 0 ? S 13:30 0:00 [events/0] root 8 0.0 0.0 0 0 ? S 13:30 0:00 [cpuset]
ps命令輸出中包含的信息:
USER:進程的屬主; PID :進程的ID; PPID :父進程; %CPU :進程占用的CPU百分比; %MEM :占用內存的百分比; NI :進程的NICE值,也就是進程的優先值(-20~19之間),數值越大,優先級越底; VSZ :進程虛擬大小; RS :駐留中頁的數量; TTY :終端ID。問號表示是無終端的,也就是系統本身。 STAT :進程狀態 D Uninterruptible sleep (usually IO) R 正在運行可中在隊列中可過行的; S 處於休眠狀態; T 停止或被追蹤; W 進入內存交換(從內核2.6開始無效); X 死掉的進程(從來沒見過); Z 僵屍進程; <</strong> 優先級高的進程 N 優先級較低的進程 L 有些頁被鎖進內存; s 進程的領導者(在它之下有子進程); l 多線程 (using CLONE_THREAD, like NPTL pthreads do) + 位於后台的進程組; WCHAN :正在等待的進程資源; START : 啟動進程的時間; TIME : 進程消耗CPU的時間; COMMAND: 啟動進程的命令的名稱和參數;
ps命令的其他用法:
(1)
[root@Vtest ~]# ps aux |grep httpd ###查看httpd程序的進程
root 1879 0.0 1.6 33096 8548 ? Ss 13:31 0:00 /usr/sbin/httpd apache 1887 0.0 0.8 33096 4212 ? S 13:31 0:00 /usr/sbin/httpd
(2)
[root@Vtest ~]# ps axo pid,%cpu,%mem,comm |grep httpd ##只查看pid,%cpu,%mem,comm這幾項
1879 0.0 1.6 httpd 1887 0.0 0.8 httpd 1888 0.0 0.8 httpd
至於其他的參數,大家可以自行練習一下。
Tips:什么是僵屍進程。通常,造成僵屍進程的成因是因為該進程應該已經執行完畢,或者是因故應該要終止了, 但是該進程的父進程卻無法完整的將該進程結束掉,而造成那個進程一直存在內存當中。如果你發現在某個進程的 CMD 后面還接上 時,就代表該進程是僵屍進程。當系統不穩定的時候就容易造成所謂的僵屍進程。也有可能是因為程序寫的不完善,或者是使用者的操作習慣不良等等所造成。如果你發現系統中很多僵屍進程時,記得要找出該進程的父進程,然后做個跟蹤排除問題!
2、top命令
top命令會在當前終端全屏顯示系統運行信息,實時跟蹤系統資源的使用情況,顯示內容包括CPU、內存占用情況,系統運行進程的列表和每一個進程運行的狀態等信息,對於分析系統運行中的問題很有幫助。
[root@Vtest ~]# top
以下是top某一刻的輸出信息:
- top - 14:01:40 up 31 min, 1 user, load average: 0.04, 0.01, 0.00
- Tasks: 122 total, 1 running, 121 sleeping, 0 stopped, 0 zombie
- Cpu(s): 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.3%si, 0.0%st
- Mem: 511140k total, 283656k used, 227484k free, 24136k buffers
- Swap: 2064376k total, 0k used, 2064376k free, 148144k cached
- PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- 2215 root 20 0 2672 1116 880 R 0.7 0.2 0:00.08 top
- 2145 root 20 0 11552 3316 2580 S 0.3 0.6 0:00.25 sshd
- 1 root 20 0 2864 1396 1184 S 0.0 0.3 0:01.67 init
- 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
- 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
- 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
- 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
- 7 root 20 0 0 0 0 S 0.0 0.0 0:00.00 events/0
- 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuset
- 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper
- 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns
- 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr
- 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm
- 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 sync_supers
- 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
- 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0
- 16 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kblockd/0
- 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid
- 18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify
- 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug
- 20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata/0
- 21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux
- 22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd
- 23 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khubd
我們把輸出信息划分為三部分:
1-5行為第一部分:
第1行:
top - 14:01:40 : 當前時間,默認每三秒更新一次。
up 31 min :系統運行了多長時間,格式為時:分
1 user :當前登錄用戶數
load average: 0.00, 0.00, 0.00 : 系統負載,即任務隊列的平均長度。三個數值分別為 1分鍾、5分鍾、15分鍾前到現在的平均值。
第2行:
Tasks: 122 total :系統總的進程數
1 running :正在運行的進程數
121 sleeping:休眠狀態的進程數
0 stopped :停止的進程數
0 zombie :僵屍進程數
第3行:
Cpu(s): 0.0%us (user mode)用戶所占用CPU百分比
0.3%sy (system mode)內核所占用CPU百分比
0.0%ni (nice)用戶進程內改變過優先級的進程占用CPU百分比
99.3%id (idle task) 空閑CPU百分比
0.0%wa (I/O waiting)等待輸入輸出的CPU時間百分比(I/O 產生的問題,會嚴重的影響您的服務器性能,因為I/O是消耗CPU的)
0.0%hi (servicing IRQs)
0.3%si (servicing soft IRQs)
0.0%st (steal (time given to other DomU instances))
第4行:
Mem: 511140k total:物理內存總量
283656k used :已使用的物理內存
227484k free :未使用的物理內存
24136k buffers :內核緩存占用的物理內存
第5行:
Swap: 2064376k total :交換分區總容量
0k used:已使用的交換分區容量
2064376k free:未使用的交換分區容量
148144k cached :緩存的總容量,如果存在未使用的物理內存,則cached占用的是物理內存,如果未使用的物理內存為0,則cached將會占用部分swap分區,那么cached的容量是它占用的物理內存部分加上占用的swap分區的部分。
第6行為第二部分:
此為top的內部命令輸入部分,常用命令有:
s 改變top命令的刷新頻率(默認是3秒),Change delay from 3.0 to:輸入相應的數字
l 關閉或開啟第一行 top 信息
t 關閉或開啟第二行 Tasks 和第三行 Cpus 信息
m 關閉或開啟第一部分第四行 Mem 和 第五行 Swap 信息
N 以 PID 的大小的順序排列表示進程列表
P 以 CPU 占用率大小的順序排列進程列表
M 以內存占用率大小的順序排列進程列表
R 對排列進行反轉
u 顯示指定用戶的進程,默認是全部用戶的進程
c 顯示進程的全路徑,默認是只有進程名
n 或者 # 設置在進程列表所顯示進程的數量,但最多是顯示滿屏
f 調整top命令顯示列表項。如增加GROUP列或UID列等等。但在下次使用top命令,還是原來成默認的。
k 結束進程
r 調整進程的優先級(Linux和AIX是從-20到19,HP-UX為0到39),至於如何得到的,可以通過man nice來查看。
h 顯示幫助
q 退出 top
其余部分為進程信息:
top進程信息列表中各列的含義:
PID 進程id
PPID 父進程id
RUSER Real user name
UID 進程所有者的用戶id
USER 進程所有者的用戶名
GROUP 進程所有者的組名
TTY 啟動進程的終端名。不是從終端啟動的進程則顯示為 ?
PR 優先級
NI nice值。負值表示高優先級,正值表示低優先級(Linux和AIX是從-20到19,HP-UX為0到39)
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 任務標志
默認情況下僅顯示比較重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通過我們上面所說的內部的f命令,來調整列表選項。