什麼是進程?
在Linux 系統中,觸發任何一個事件,系統都將會將它定義爲一個進程,並且給予這個進程一個編號ID,稱爲PID,同時根據觸發這個進程的用戶與相關屬性關係,給予這個PID一組有效的權限設置。
進程與程序:
程序(program):通常爲二進制程序放置在存儲媒介中,以物理文件的形式存在。
進程(process):程序在被觸發後,執行者的權限與屬性、程序的程序代碼與所需數據都會被加載到內存中,操作系統並給及這個內存內的單元一個標示符(PID)。總的來說,進程就是運行中的程序的一個副本,是被載入內存的一個指令集合。
進程ID (Process ID,PID)用來標記每一個進程
UID、GID、SELinux 語境決定對文件系統的存取和訪問權限
通常從執行進程的用戶來繼承
存在生命週期
子進程與父進程:
子進程是由一個進程所產生的進程,產生這個子進程的進程稱爲父進程;父進程終止子進程自然終止。
子進程與父進程之間的關係最大的複雜點在於進程相互之間的調用,在linux中的過程調用中通常稱爲fork-and-exec的流程,進程都會通過父進程以複製的方式產生一個一模一樣的子進程,然後被複製出來的子進程再以exec的方式來執行實際要進行的進程,最終就成爲一個子進程的存在。
進程的創建:
第一個進程(父子關係):init (centos6)
systemd (centos7 )
進程:都是由父進程創建 方法fork(),clone()
進程的優先級:
系統優先級:數字越小,優先級越高
0-139(CentOS4,5):各有140個運行隊列和過期隊列
0-98,99(CenOS6)
實時優先級:99-0:值最大優先級最高
Nice值:-20,19對應系統優先級100-139或99
運行態:running
就緒態:ready
睡眠態:可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停於內存中,但不會被調度,除非手動啓動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉
進程管理工具:
ps命令:ps命令用於報告當前系統的進程狀態。可以搭配kill指令隨時中斷、刪除不必要的程序。ps命令是最基本同時也是非常強大的進程查看命令,使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程佔用了過多的資源等等,總之大部分信息都是可以通過執行該命令得到的。
命令語法:ps [OPTION] ….
支持三種風格的選項:
UNIX 風格:ps -ef
BSD風格:ps axo
GNU風格:ps --help
默認顯示當前終端中的進程
a選項包括所有終端中的進程
x選項包括不鏈接終端的進程
u選項顯示進程所有者的信息
f選項顯示進程的父進程
o屬性… 選項顯示定製的信息
pid(進程id)、comm(進程命令)、%cpu、%mem(內存)、state(狀態)、tty(終端)、euser(有效用戶)、ruser(發起命令的用戶)
STAT:進程狀態
R:running
S: interruptable sleeping
D: uninterruptable sleeping
T: stopped
Z: zombie
+: 前臺進程
l: 多線程進程
N:低優先級進程
<: 高優先級進程
s: session leader,會話(子進程)發起者
命令常用組合:
-ef
-e: 顯示所有進程
-f: 顯示完整格式程序信息
-eFH
-F: 顯示更完整格式的進程信息
-H: 以進程層級格式顯示進程相關信息
ni: nice值
pri: priority,優先級
psr: processor, CPU編號 (使用的是哪顆cpu)
ps –C processname :單獨顯示某個進程,可以使用-o 擴展參數選項
pstree命令:顯示進程樹,以樹狀圖的方式展現進程之間的派生關係,顯示效果比較直觀。
pstree –p :在進程樹狀圖中顯示進程ID。
nice/renice命令:調整優先級。靜態優先級:100-139,進程默認啓動時的nice值爲0,優先級爲120,只有跟用戶才能降低nice值(提高優先性)。
nice –n xx Command:以指定的優先級運行某個命令,xx的範圍是-20~19。
renice –n xx COMMAND : 在運行中的進程,修改優先級
pgrep命令:搜索進程
-u uid:effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示父進程爲此處指定的進程的進程列表
pgrep [options] pattern 支持正則表達式
pidof命令:按確切的程序名查看pid
命令絕對路徑:/sbin/pidof
用法:pidof COMMAND
將來可以用來腳本中監控一個重要的服務是否開啓
uptime:顯示啓動狀態,顯示當前時間,系統已啓動的時間、當前上線人數,系統平均負載(1、5、10分鐘的平均負載,一般不會超過1)。(沒有明確的單位。)
系統平均負載:指在特定時間間隔內運行隊列中的平均進程數。
通常每個CPU內核的當前活動進程數不大於3,那麼系統的性能良好。如果每個CPU內核的任務數大於5,那麼此主機的性能有嚴重問題。
如果linux主機是1個雙核CPU,當Load Average 爲6的時候說明機器已經被充分使用。
top命令:顯示進程使用系統資源情況
第一行:相當於uptime命令
第二行:進程信息
第三行:CPU使用情況
第四行:內存使用情況
第五行:交換分區swap使用情況
cpu那行:
us:user, 用戶空間佔用
sy:system, 內核空間佔用
ni:調整nice時間
id:idle,空閒
wa:wait, 等待IO時間
hi:hard interupt, 硬中斷
si:soft interupt, 軟中斷(模式切換)
st:stole, 虛擬機偷走的時間
排序:
在打開top後,可以按快捷鍵進行自定義排序:
P:以佔據的CPU百分比,%CPU
M:佔據內存百分比,%MEM
T:累積佔據CPU時長,TIME+
首部信息是否顯示:
uptime信息:l(字母l)
tasks及cpu信息:t
cpu分別顯示:1(數字1)
memory信息:m
退出命令:q
修改刷新時間間隔:s
終止指定進程:k
保存文件:W
也可以使用命令行的方式對top顯示的信息進行管理
選項:
d #: 指定刷新時間間隔,默認爲3秒
-b: 全部顯示所有進程
-n #: 刷新多少次後退出
htop命令:是一個Linux下交互式的進程瀏覽器,可以用來代替top命令。默認沒有安裝,需要從EPEL源安裝。
子命令:
s: 跟蹤選定進程的系統調用
l: 顯示選定進程打開的文件列表
a:將選定的進程綁定至某指定CPU核心
t: 顯示進程樹
使用命令直接對顯示信息進行操作:
選項:
-d #: 指定延遲時間;
-u UserName: 僅顯示指定用戶的進程
-s COLUME: 以指定字段進行排序
vmstat 命令:含義是顯示虛擬內存狀態,但是它還可以報告關於進程、內存、I/0等系統整體運行狀態。
命令默認顯示一次就退出。可以設置間隔幾秒刷新一次,也可以定義刷新次數
顯示中的各項含義:
procs:
r:可運行(正運行或等待運行)進程的個數,和核心數有關
b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)
memory:
swpd: 交換內存的使用總量
free:空閒物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量
swap:
si:從磁盤交換進內存的數據速率(kb/s)
增加si:dd if=/dev/zero of=/dev/null
so:從內存交換至磁盤的數據速率(kb/s)
增加so:dd if=/dev/zero of=/dev/null bs=3Gcount=1
io:
bi:從塊設備讀入數據到系統的速率(kb/s)
增加bi:dd if=/dev/sda of=/dev/null
bo: 保存數據至塊設備的速率
增加bo:dd if=/dev/zero of= /app/f1
system:
in: interrupts 中斷速率,包括時鐘
cs: context switch 進程切換速率
cpu:
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO.2.5.41前,包括in idle.
st: Time stolen from a virtualmachine.2.6.11前, unknown.
iostat命令:統計CPU和設備IO信息
pmap命令:顯示進程和內存間的映射關係
pmap –x PID顯示詳細格式的信息
glances命令:系統監控工具,通過glances工具我們可以監視CPU、平均負載、內存、網絡流量、磁盤I/O,其他處理器和文件系統空間的利用情況。
C/S模式下運行glances命令
服務模式:
glances-s -B IPADDR
IPADDR: 指明監聽的本機哪個地址
客戶端模式:
glances-c IPADDR
IPADDR:要連入的服務器端地址
示例:
dstat命令:dstat命令是一個全能系統信息統計工具。擁有一個彩色的界面,在手動觀察性能狀況時,數據比較顯眼容易觀察;而且dstat支持即時刷新,如輸入dstat 3即每三秒收集一次,但最新的數據都會每秒刷新顯示。dstat也可以收集指定的性能資源,如dstat -c即顯示CPU的使用情況。
dstat[-afv] [options..] [delay [count]]
-c: 顯示cpu相關信息
-C #,#,...,total
-d: 顯示disk相關信息
-D total,sda,sdb,...
-g:顯示page相關統計數據
-m: 顯示memory相關統計數據
-n: 顯示network相關統計數據
-p: 顯示process相關統計數據
-r: 顯示io請求相關的統計數據
-s: 顯示swapped相關的統計數據
默認採用-cdngy參數
Kill 命令:向進程發送控制信號,以實現對進程的管理,每一個信號對應一個數字。
Kill –l :顯示當前系統可用信號
常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程;相當於Ctrl+c
3) SIGQUIT:相當於ctrl+\
9) SIGKILL: 強制殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:繼續運行
19) SIGSTOP:後臺休眠
注:
(1)不是所有的進程都可以使用發信號9 的方式結束的,對於終端進程就會失效。
(2)Kill -0 pid選項檢查某個進程是否正常工作,(以後可以用來檢查摸個服務是否正常工作)killall命令:根據進程名管理進程(有時候一個服務開啓的進程太多,根據進程號一個一個刪除太麻煩。)