1. 程式人生 > >馬哥學習----李洋個人筆記----進程管理

馬哥學習----李洋個人筆記----進程管理

總量 調用 pgrep mapping mod stack 名稱 nohup any

內核的功用:進程管理、文件系統、網絡功能、內存管理、驅動程序、安全功能

什麽是進程? 進程是運行中的程序的一個副本,是被載入內存的一個指令集合,進程的特點

1 進程ID(Process ID,PID)號碼被用來標記各個進程
2 UID、GID、和SELinux語境決定對文件系統的存取和訪問權限,
3 通常從執行進程的用戶來繼承
4 存在生命周期

任務結構:Linux內核存儲進程信息的數據結構格式
任務列表:多個任務的的task struct組成的鏈表

進程的創建:
init是第一個進程,其余所有進程都是基於它來創建的,即父子關系。
進程下面可以有多個線程,也可以沒有。
進程:都由其父進程創建,CoW fork(), clone()

進程內存:進程是由內存來處理的,當處理的進程大小超過了內存總量時候,可以通過如下方式來完成處理:
1 LRU(最少使用) 通過減少近期最少使用的算法,來釋放內存 物理地址空間和線性地址空間

2 MMU(內存管理單元)大體上是將進程拆分為小塊,暫時放在物理硬盤的效果。這樣MMU
就 負責轉換線性(進程地址)和物理地址(硬盤上的)

3 TLB(轉移後背緩沖器) 相當於MMU的翻譯後備緩沖器,用於保存虛擬地址和物理地址映射關系的緩存。

LRU的算法:假設進程塊數之後三個,存在多個進程任務時候,取舍關系如下:
假設進程的序列為 4 3 4 2 3 1 4 2,每次調入一個進程。而物理塊只有3個,則
第1輪4調入內存 這時內存空間為 4

第2輪3調入內存 這時內存空間為 3 4
第3輪4調入內存 這時內存空間為 4 3
第4輪2調入內存 這時內存空間為 2 4 3
第5輪3調入內存 這時內存空間為 3 2 4
第6輪1調入內存 這時內存空間為 1 3 2
第7輪4調入內存 這時內存空間為 4 1 3
第8輪2調入內存 這時內存空間為 2 4 1

依次循環~
進程可以在同一進程和不同主機之間調用,
同一主機的進程: signal:信號 不同主機:rpc: remote procedure call 遠程過程調用

shm: shared memory 共享內存 socket: IP和端口號

semaphore:信號量,一種計數器 遠程調用進程需要RPC服務來支持。

各個服務器都有自己的默認端口號,比如:
web 的默認端口號 80
ftp 的默認端口號 21
ssh 的默認端口號 22
telnet 的默認端口號 23
pop 的默認端口號 110

進程的種類:
守護進程: 可以理解為服務,通常在後臺一直在運行著。在系統引導過程中啟動的進程,它們和終端無關。
前臺進程:跟終端相關,通過終端啟動的進程
註意:兩者可相互轉化

進程狀態:
運行態:running
就緒態:ready
睡眠態分為兩種:
可中斷:interruptable 比如 sleep命令。
不可中斷:uninterruptable 屬於暫時停止的。
停止態:stopped,暫停於內存,但不會被調度,除非手動啟動
僵死態:zombie,結束進程,父進程結束前,子進程不關閉

進程的分類: CPU-Bound:CPU密集型,非交互的 以及 IO-Bound:IO密集型,交互的 兩種

Linux系統狀態的查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap,vmstat, dstat, kill,
pkill, job, bg, fg, nohup等等。

pstree命令: pstree - display a tree of processes 顯示進程樹
pstree -p 顯示進程樹的同時顯示進程號
ps: process state 進程狀態
ps - report a snapshot of the current processes 報告當前進程的快照
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中

適用ps來查看進程信息 ps [OPTION]... 支持三種選項:一般經典用法 ps axu
1 UNIX選項如-A-e
2 BSD選項如a
3 GNU選項如--help
選項:默認顯示當前終端中的進程
a 選項包括所有終端中的進程
x 選項包括不鏈接終端的進程
u 選項顯示進程所有者的信息
f 選項顯示進程的父進程 用符號將父子關系的連接起來
k|--sort 屬性 對屬性排序
o 屬性… 選項顯示定制的信息pid(進程號)、comm(所執行的指令)、%cpu(cpu占用率)、%mem(內存占用率)、
state(進程狀態)、tty(圖形終端編號)、euser(內核用戶)、ruser(root用戶)
使用 ps axo 之後,所列出的進程信息格式為:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND ,
VSZ: 占用的虛擬內存大小
RSS: 占用的實際內存大小
STAT: 該進程的狀態:
START: 進程開始時間
TIME: 進程執行的時間
進程的狀態STAT有如下幾種狀態:
R:運行狀態
S: 睡眠狀態
D: 不可終端的睡眠狀態
T: 跟蹤/停止狀態
Z: 僵屍進程
+: 前臺進程
l: 多線程進程
L:內存分頁並帶鎖
N:低優先級進程

實驗,利用 ps axo %cpu,%mem,pid,comm來顯示,CPU占用率最高的前十個進程

ps axo %cpu,%mem,pid,comm |sort -nr |grep -v COMMAND |head

sort –n 按數字排序,-r待倒序。grep –v 過濾掉指定的關鍵字。

進程的優先級:
系統優先級:數字越小,優先級越高,centos4和5中 0--139 各有140個運行隊列和過期隊列
實時優先級: 99-0 值最大優先級最高 centos6中,0-98 有99個,並且nice值:-20到19,對應系統優先級100-139或99

進程的優先級:通過pri的值來決定的,值越小,優先級越高。但是pri的值是寫在內核中的,無法修改,只能通過修改nice的值來實現。默認pri的值為80,nice的值為0.每個進程都有一個pri值和nice值,如果人為的給nice的值設為負數,那麽與之配對的pri值必然比默認值小,這樣對應進程的優先級就會提高了。舉例: 最終pri=默認pri+修改後的nice.

nice值:進程優先級調整命令
nice 的格式 : 選項,命令,加變量.
靜態優先級:100-139 進程默認啟動時的nice值為0,優先級為120

普通用戶不能將nice值設置為負值,(也就是只能比默認值大)
只有root用戶才能降低nice值(提高優先性).

nice和renice的區別:
1 nice是進程將要運行時設置的值 2 nice是運行完後修改的值

nice -n -20 ping 172.18.0.1 # renice -n -20 $(pidof ping)

平時工作,如果想找到具體的某個進程,最靈活的方式為:

ps 選項 | 其它命令

而我們要查看具體的信息:比如那些進程跟那個用戶有關.那些進程與終端有關等等時,就需要用到搜索命令了.
之前學到了文本搜索工具 grep(基本正則) egrep(擴展正則) fgrep(不用正則)
這些,接下來是搜索進程的pgrep,格式如下:

按預定義的模式:pgrep 格式:
pgrep [options] pattern(模式)

–u uid: effective user生效者,指的是那些進程與這個用戶相關

pgerp –u username/uid 查看指定用戶所運行的所有進程的進程號

pgerp -lu username/uid 查看指定用戶所運行的所有進程的進程號及進程名

-U uid: real user,真正發起運行命令者

-t terminal: 與指定終端相關的進程

pgrep -t 終端名 查看指定終端所運行的所有進程的進程號

pgrep –lt終端名 查看指定終端所運行的所有進程的進程號及進程名

-l: 顯示進程名 輔助選項,一般跟其他選項 u t 結合使用,單獨使用無效果

-a: 顯示完整格式的進程名
跟其他選項配合使用,只有centos7裏面有,centos6上沒有

-P pid: 顯示指定進程的子進程

grep –p N

所有跟進程號為N的子進程都會被列出來.

按確切的程序名稱:pidof 格式:
pidof 進程名 顯示指定進程的進程號

pidof /bin/bash

3309 793 列出與/bin/bash有關的進程號.

系統工具uptime
uptime 顯示當前時間,系統已啟動的時間、當前上線人數,系統平均負載(1、5、 10分鐘的平均負載,一般不會超過1)
系統平均負載: 指在特定時間間隔內運行隊列中的平均進程數
通常每個CPU內核的當前活動進程數不大於3,那麽系統的性能良好。如果每個CPU內核的任務數大於5,那麽此主機的性能有嚴重問題
如果linux主機是1個雙核CPU,當Load Average 為6的時候說明機器已經被充分使用

進程管理工具 top:有許多內置命令:
比如,排序:
P:以占據的CPU百分比,%CPU
M:占據內存百分比,%MEM
T:累積占據CPU時長,TIME+
首部信息顯示:

直接top命令後,顯示的內容解析

第一行:
top - 21:15:47 up 7:15(截止到21:15:47共計登錄了7小時15分)
2 users(共兩個用戶) load average: 0.00, 0.01, 0.05(平均負載在1,5,15分鐘內分別為 0.00,0.01,0.05)

第二行:
Tasks: 171 total(共計171個進程數) 1 running(1個正在運行的)170 sleeping(170個睡眠狀態的) 0 stopped(0個停止的進程),0 zombie(0個僵屍進程.)

第三行:
Cpu(s)表示 0.0%us(用戶空間占用CPU百分比) ,0.2%sy(內核空間占用CPU百分比) 0.0%ni( 用戶進程空間內改變過優先級的進程占用CPU百分比), 99.8%id(空閑CPU百分比,假設電腦是4核CPU,一個進程只能占據一個核心當其中給一個完全占滿後,這裏會顯示75%,即還有三個核可以使用), 0.0%wa(等待輸入輸出的CPU時間百分比), 0.0%hi( CPU服務於硬件中斷所耗費的時間總額), 0.0%si(CPU服務軟中斷所耗費的時間總額), 0.0%st(虛擬機被管理程序偷去的CPU時間[如果當前處於一個管理程序下的vm,實際上管理程序也是要消耗一部分CPU處理時間的]

第四行:
Mem: 2038352k total(物理內存總量), 748372k used(使用的物理內存總量), 1289980k free(空閑內存總量), 62696k buffers(用作內核緩存的內存量)

第五行:
Swap:2097148k total(虛擬內存交換區總量),0k used(使用的交換區總量), 2097148k free(空閑交換區總量), 337380k cached(緩沖的交換區總量)

紅線上方可以根據需求輸入命令,例如:
q 退出命令
s 修改刷新時間間隔:
k 終止指定進程: # kill pid 17174
W 保存文件:
-d #: 指定刷新時間間隔,默認為 3 秒 # top -d 1 隔1秒刷新一次。
-b: 全部顯示所有進程
-n #: 刷新多少次後退出

htop命令:選項:相當於top的升級版。輸出上面多了顏色顯示。
內存工具
vmstat命令:虛擬內存信息。格式:
vmstat [options] [delay [count]] (延遲,數)
選項: -s: 顯示內存的統計數據

運行vmstat後顯示:按列查看

procs: 下方的
r:可運行(正運行或等待運行)進程的個數,和核心數有關
b:處於不可中斷睡眠態的進程個數(被阻塞的隊列的長度)

memory:下方的
swpd: 交換內存的使用總量
free:空閑物理內存總量
buffer:用於buffer的內存總量
cache:用於cache的內存總量

swap:下方的
si:從磁盤交換進內存的數據速率(kb/s)
so:從內存交換至磁盤的數據速率(kb/s)

io:下方的
bi:從塊設備讀入數據到系統的速率(kb/s)
bo: 保存數據至塊設備的速率

system:下方的
in: 中斷速率,包括時鐘
cs: 進程切換速率

cpu:下方的
us: 運行非內核代碼的時間Time spent running non-kernel code
us的值比較高時,說明用戶進程消耗的CPU時間多,但是如果長期超50%的使用,那麽我們就該考慮優化程序算法或者進行加速。

sy: 運行內核代碼的時間Time spent running kernel code
sy的值高時,說明系統內核消耗的CPU資源多,這並不是良性表現,我們應該檢查原因。

id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
空閑時間百分比
wa: Time spent waiting for IO. 2.5.41前,包括in idle.
IO等待時間百分比
st: Time stolen from a virtual machine. 2.6.11前, unknown.
從虛擬機中偷來的時間

iostat 顯示cpu和硬盤的io信息。
-C 顯示CPU使用情況

-d 顯示磁盤使用情況

-k 以 KB 為單位顯示

-m 以 M 為單位顯示

-N 顯示磁盤陣列(LVM) 信息

-n 顯示NFS 使用情況

-p[磁盤] 顯示磁盤和分區的情況

-t 顯示終端和CPU的信息

-x 顯示詳細信息

-V 顯示版本信息

顯示詳細信息: iostat –x

第一行..忽略
第二行
%user:CPU處在用戶模式下的時間百分比。
%nice:CPU處在帶NICE值的用戶模式下的時間百分比。
%system:CPU處在系統模式下的時間百分比。
%iowait:CPU等待輸入輸出完成時間的百分比。此項值比較高代表:硬盤存在I/O瓶頸.
%steal:管理程序維護另一個虛擬處理器時,虛擬CPU的無意識等待時間百分比。
%idle:CPU空閑時間百分比。

硬盤信息行:
rrqm/s:每秒進行 merge 的讀操作數目。
r/s: 每秒完成的讀 I/O 設備次數。
w/s: 每秒完成的寫 I/O 設備次數。
rsec/s: 每秒讀扇區數。
wsec/s:每秒寫扇區數。
rkB/s: 每秒讀 K 字節數。取一半,因為扇區大小為512節
wkB/s:每秒寫 K 字節數。同取一半。
avgrq-sz:平均每次設備 I/O 操作的數據大小(扇區)
avgqu-sz: 平均 I/O隊列長度。
await:平均每次設備 I/O 操作的等待時間(毫秒)
svctm: 平均每次設備 I/O 操作的服務時間(毫秒)
%util: 一秒中有百分之多少的時間用於 I/O 操作,或者說一秒中有多少時間 I/O 隊列是非空的。

pmap命令:進程對應的內存映射
一般只起查看作用個,通常使用

pmap –x 來查看進程及子進程占用的內存地址及空間大小。

RSS: 占用的記憶體大小(內存)
Mode:映像權限
Mapping:映像支持文件。值為[anon]時表達為已分配內存。
值為[stack]時表達為程序堆棧

遠程監控工具:glances

一般用到的是:
glances 服務器 / 客戶端工作方式
glances 支持服務器/客戶端工作方式,可以實現遠程監控。首先假設
服務器 IP 地址:10.0.2.14
客戶端 IP 地址:10.0.2.15
確保二者都已經安裝好 glances 軟件包。
首先在服務器端啟動;

glances -s -B 10.0.2.15

glances server is running on 10.0.2.15:61209

可以看到 glances 使用的端口號是 61209,所以用戶需要確保防火墻打開這個端口。或者
關閉防火墻 # Iptables stop
下面在客戶端使用如下命令連接服務器,首先

glances – c 10.0.2.15

註意左下角顯示“Connected to 10.0.2.15”>表示客戶端已經連接服務器成功。
通過 glances 輸出顏色了解系統性能

綠色表示性能良好,無需做任何額外工作;(此時 CPU 使用率、磁盤空間使用率和內存使用率低於 50%,系統負載低於 0.7)。
藍色表示系統性能有一些小問題,用戶應當開始關註系統性能;(此時 CPU 使用率、磁盤空間使用率和內存使用率在 50%-70% 之間,系統負載在 0.7-1 之間)。
品紅表示性能報警,應當采取措施比如備份數據;(此時 CPU 使用率、磁盤空間使用率和內存使用率在 70%-90% 之間,,系統負載在 1-5 之間)。
紅色表示性能問題嚴重,可能宕機;(此時 CPU 使用率、磁盤空間使用率和內存使用率在大於 90%,系統負載大於 5)。、

kill命令: 向進程發送控制信號,以實現對進程管理,每個信號對應一個數字,信號名稱以SIG開頭(可省略),不區分大小寫
顯示當前系統可用信號: kill –l,trap -l
常用信號:man 7 signal
1) SIGHUP: 無須關閉進程而讓其重讀配置文件
2) SIGINT: 中止正在運行的進程; 相當於Ctrl+c
3) SIGQUIT: 相當於ctrl+\
9) SIGKILL: 強制殺死正在運行的進程
15) SIGTERM:終止正在運行的進程
18) SIGCONT:將休眠的進程放入後臺運行 與SIGSTOP相反,和fg/bg命令一樣
19) SIGSTOP:後臺休眠 相當於 ctrl+Z
指定信號的方法: (1) 信號的數字標識:1, 2, 9 (2) 信號完整名稱:SIGHUP (3) 信號的簡寫名稱:HUP. 一般只寫數字編號。
要撤銷所有的後臺作業,可以輸入kill 0。因為有些在後臺運行的命令會啟動多個進程,跟蹤並找到所有要殺掉的進程的PID是件很麻煩的事。這時,使用kill 0來終止所有由當前shell啟動的進程,是個有效的方法。

lsof命令用於查看你進程開打的文件,打開文件的進程,進程打開的端口(TCP、UDP)。找回/恢復刪除的文件。是十分方便的系統監視工具,因為lsof命令需要訪問核心內存和各種文件,所以需要root用戶執行。

在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。所以如傳輸控制協議 (TCP) 和用戶數據報協議 (UDP) 套接字等,系統在後臺都為該應用程序分配了一個文件描述符,無論這個文件的本質如何,該文件描述符為應用程序與基礎操作系統之間的交互提供了通用接口。因為應用程序打開文件的描述符列表提供了大量關於這個應用程序本身的信息,因此通過lsof工具能夠查看這個列表對系統監測以及排錯將是很有幫助的。

語法

lsof(選項)
選項

-a:列出打開文件存在的進程;
-c<進程名>:列出指定進程所打開的文件;
-g:列出GID號進程詳情;
-d<文件號>:列出占用該文件號的進程;
+d<目錄>:列出目錄下被打開的文件;
+D<目錄>:遞歸列出目錄下被打開的文件;
-n<目錄>:列出使用NFS的文件;

-i<條件>:列出符合條件的進程。(4、6、協議、:端口、 @ip )

lsof -i :21

顯示出是那麽進程在占用著21號端口

-p<進程號>:列出指定進程號所打開的文件;
-u:列出UID號進程詳情;
-h:顯示幫助信息;
-v:顯示版本信息。

lsof輸出各列信息的意義如下:

COMMAND:進程的名稱
PID:進程標識符
PPID:父進程標識符(需要指定-R參數)
USER:進程所有者
PGID:進程所屬組
FD:文件描述符,應用程序通過文件描述符識別該文件。
文件描述符列表:

cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改
txt:該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序
lnn:library references (AIX); 庫引用
er:FD information error (see NAME column); 信息錯誤,見NAME列
jld:jail directory (FreeBSD); 監聽目錄,FreeBSD
ltx:shared library text (code and data); 共享圖書館文本(代碼和數據)
mxx :hex memory-mapped type number xx. hex內存映射類型xx
m86:DOS Merge mapped file; DOS Merge映射文件;
mem:memory-mapped file; 內存映射文件
mmap:memory-mapped device; 射設備
pd:parent directory; 父目錄
rtd:root directory; 根目錄
tr:kernel trace file (OpenBSD 內核跟蹤文件
v86 VP/ix mapped file;
0:表示標準輸出
1:表示標準輸入
2:表示標準錯誤
一般在標準輸出、標準錯誤、標準輸入後還跟著文件狀態模式:

u:表示該文件被打開並處於讀取/寫入模式。
r:表示該文件被打開並處於只讀模式。
w:表示該文件被打開並處於。
空格:表示該文件的狀態模式為unknow,且沒有鎖定。
-:表示該文件的狀態模式為unknow,且被鎖定。
同時在文件狀態模式後面,還跟著相關的鎖:

N:for a Solaris NFS lock of unknown type; 對於操作系統 NFS鎖未知類型
r:for read lock on part of the file; (文件的部分讀鎖)
R:for a read lock on the entire file;(整個文件的讀鎖)
w:for a write lock on part of the file;(文件的部分寫鎖)
W:for a write lock on the entire file;(整個文件的寫鎖)
u:for a read and write lock of any length; 對於任何長度的讀和寫鎖;
U:for a lock of unknown type; 對於一個未知類型的鎖
x:for an SCO OpenServer Xenix lock on part of the file;
對於一個操作系統鎖,在文件的一部分
X:for an SCO OpenServer Xenix lock on the entire file;
對於操作系統Xenix鎖定整個文件
space:if there is no lock. 如果沒有鎖。

馬哥學習----李洋個人筆記----進程管理