linux進程管理
內核的功能:進程管理、文件系統、網絡管理、驅動程序、安全功能等
Pcrocess:運行中的程序的一個副本,是被載入內存中的一個指令集和
PID:進程ID,用來標記各個進程
task struct:進程的元數據空間,用來存儲進程數據信息和數據結構的格式
task list:多個任務的task struct組成的鏈表
MMU:負責轉換線性地址和物理地址
總結:內核為每一個進程保存了一個task struct,記錄了線性地址空間和物理地址空間及PID等信息,當一個進程想要訪問其線性地址空間中的數據時,內核會每次將其線性地址空間轉換為物理地址空間取得數據來進行操作的,該過程有一個專門的硬件潘成就是MMU,memory managerment unit。
進程的創建:當系統啟動后,先去運行內核代碼,等內核掌管一切后,創建第一個進程,我們稱為INIT進程,內核空間和用戶控件創建出來了,后續內核空間所有管理工作都有INIT負責,INIT負責所有進程,進程都由其父進程創建,內核中有一個函數fork()用于創建子進程。
進程的優先級:
系統優先級:數字越小,優先級越高
0-139(centos4,5)
各有140個運行隊列和過期隊列
0-98,99(centos6)
實時優先級:rtprio 99-0,值越大優先級越過
進程優先級調整:
靜態優先級: 100-139
進程默認啟動時的nice值為0,優先級為120
只有根用戶才能降低nice值(提高優先性)
nice值:-20,19對應系統優先級100-139或99
命令:
nice [option] [Command [arg]…] 讓進程已哪個優先級運行(普通用戶調整優先級,只能把ni調大)
nice -n -10 ping 127.0.0.1
renice [-n] priority pid… 更改正在運行進程的優先級(已經運行的程序默認優先級是0)
renice -n -10 5168
查看 ps axo pid,comm,ni
root@cenots6.8 ~ # ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 3108 3104 0 80 0 - 27120 wait pts/1 00:00:00 bash 4 R 0 3512 3108 0 80 0 - 27033 - pts/1 00:00:00 ps
根據ps -l查詢到的結果,可以看到PID進程編號,PPID父進程編號,PRI即進程的優先級,或者通俗點說就是程序被CPU執行的先后順序,此值越小進程的優先級別越高,NI就是前面提到的nice值,其表示進程可被執行的優先級的修正數值。如前面所說,PRI值越小越快被執行,那么加入nice值后,將會使得PRI變為:PRI(new)=PRI(old)+nice。這樣,當nice值為負值的時候,那么該程序將會優先級值將變小,即其優先級會變高,則其越快被執行,因此需要注意的:進程的nice值不是進程的優先級,他們不是一個概念,但是進程nice值會影響到進程的優先級變化。
進程相關概念:內核完成資源分配要占用一段空間,剩余的分配給進程使用,為了實現高效分配,把剩余內存切割成固定大小的片段,然后分片段給進程,大小為4K,每個片段就叫做page frame(頁框,存儲頁面數據),分配內存時,發現那個頁框空間就分配哪個給進程,,分配的頁框可以是連續的,也可以是不連續的,將這些頁框分配給進程后,加一個中間層,將這些頁框偽裝成連續的,每一個進程都是一個虛擬的內存,而不是真正的內存,而每個進程啟動時,他認為目前系統運行的只有內核和自己的程序,所有內存空間他都可用,其他進程也認為所有的內存空間他們都可以用,所以他們們以為所有可用的空間稱為線性地址空間,而真正占據的才是分配物理空間叫做物理空間。
進程類型:
守護進程:daemon,在系統引導過程中啟動的進程,和終端無關進程
前臺進程:根終端無關,通過終端啟動的進程
注意:可以把前臺進程送往后來運行,以守護模式運行
進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped,暫停與內存中,但不會被調度,除非手動啟動
僵尸態:zombie,結束進程,父進程結束前,子進程不關閉
端口:
0-1023:永久地分配給固定的應用使用,80/http, 21/ftp, 25/smtp, 110/pop3, 143/imap4;僅root有權限使用,特權端口;
1024-41951:注冊端口,但不嚴格,3306/mysql, 11211/memcached,
41952+:客戶端程序使用的隨機端口,動態端口,或稱為私有端口;
/proc/sys/net/ipv4/ip_local_port_range
Linux系統狀態的查看及管理工具:
常用命令:pstree、ps、pidof、pgrep、top、htop、glance、pmap、vmstat、dstat、kill、pkill、job、bg、fg、nohup
pstree:顯示進程樹
pidof processName:根據確切的進程名稱查詢進程
pidof passwd
4121
ps:process state用于顯示命令執行前所有進程的狀態
選項:
a:選項包括所有終端的進程
x:選項包括不連接終端的進程
u:選項顯示進程所有者的信息
f:選項顯示進程的父進程
o:屬性…選項顯示定制的信息,如:pid、comm、%cpu、%mem、state、tty、euser、ruser
ps axo pid,comm,%cpu,%mem,state,tty,euser,ruser
ps aux | grep sleep
-e:顯示所有進程
-f:顯示完整格式的進程信息
root@cenots6.8 ~ # ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.1 19344 1544 ? Ss 08:58 0:02 /sbin/init root 2 0.0 0.0 0 0 ? S 08:58 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 08:58 0:00 [migration/0] USER:用戶 PID:進程 %CPU:累計使用CPU的時間 %MEM:內存空間占用比率 VSZ:虛擬內存大小,線性內存 RSS:常駐內存級(不能放在swap交換內存上)
STAT:進程狀態
R:running
S:interuptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zommbie
+:前臺進程
I:多線程進程
N:低優先級進程
<:高優先級進程
s:session leader,會話(子進程)發起者
pgrep:按預定的模式查找進程
pgrep [options] pattern
-u uid:生效者 有效的是誰
pgrep -u root
輸出結果是PID
-U uid:真正發起運行命令者
例如 wang用戶發起passwd命令,發起者是wang,生效者是root
-t Terminal:與指定的終端相關的進程
pgrep -t pts/0 -l
3014 bash
4077 sleep
-l:顯示進程名字
pgrep -l sleep
3960 sleep
-a:顯示完整格式的進程名
-P:顯示指定的子進程
uptime:
root@cenots6.8 ~ # uptime 16:52:15 up 7:53, 2 users, load average: 0.01, 0.02, 0.05 顯示當前時間 系統已啟動的時間 當前登錄的用戶 系統平均負載(1、5、10鐘的平均負載,一般不會超過1)
系統平均負載:指在特定時間間隔內運行隊列中的平均進程數
如果每個CPU內核的當前活動進程數不大于3的話,那么系統的性能良好。 如果每個CPU內核的任務數大于5,那么這臺機器的性能有嚴重問題。如果linux主機是1個雙核CPU的話,當Load Average 為6的時候說明機器已經被充分使用了。
top:任務查看器,顯示linux系統的進程信息,從上往下排序
top - 17:14:54 up 8:16, 2 users, load average: 0.03, 0.07, 0.05 Tasks: 166 total, 1 running, 165 sleeping, 0 stopped, 0 zombie Cpu(s): 0.1%us, 0.0%sy, 0.0%ni, 99.9%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1004136k total, 670124k used, 334012k free, 61084k buffers Swap: 2097148k total, 0k used, 2097148k free, 344384k cached us:用戶空間 sy:內核空間 ni:調整nice時間 id:空閑 wa:等待IO時間 hi:硬中斷 si:軟中斷 st:虛擬機偷走時間
內置命令:
P:以占據的CPU百分比,%CPU
M:占據內存百分比,%MEM
T:累計占據CPU的時長,TIME+
首部顯示信息:
uptime信息:l命令
tasks及cpu信息,t命令
cpu分別顯示:1數字
memory信息:m命令
退出命令:q
修改刷新時間間隔:s
終止指定進程:k
保存文件:W
選項:
-d #:指定刷新時間間隔,默認3s
-b:以批次方式顯示 top -b
-n #:顯示多少批次
htop命令:需要從Fedora-EPEL源安裝
選項:
-d #:指定延遲時間
-u UserName:僅顯示指定用戶的進程
-s COLUME:以指定字段進程排序
子命令:
s:跟蹤選定進程的系統調用
l:顯示選定進程打開的文件列表
a:將選定的進程綁定至指定的CPU核心
t:顯示進程數
vmstat命令:虛擬內存信息
vmstat 2 4 :2s刷新一次 刷新4次
root@cenots6.8 ~ # vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 435712 23792 187208 0 0 227 6 110 125 1 3 96 0 0
procs:
r:等待運行的進程個數,和核心數有關
b:處于不可中斷睡眠態的過程個數(被阻塞的隊列長度)
memory:
swpd:交換內存的使用總量
free:空閑物理內存總量
buffer:用于buffer的內存總量
cache:用于cache的內存總量
swap:
si:從磁盤交換進內存的數據速率
so:從內存交換值磁盤的數據速率
io:
bi:從塊設備讀入數據到系統的速率(kb/s)
bo:保存數據至塊設備的速率
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 virtual machine. 2.6.11前, unknown
pmap命令:進程對應的內存映射
pmap [options] pid […]
-x:顯示詳細格式的信息
glances命令:需要依賴epel源進行安裝
cenots6.8 (CentOS 6.8 64bit / Linux 2.6.32-642.el6.x86_64) Uptime: 0:20:09 CPU 1.0% Load 4核 Mem 36.4% active: 241M Swap 0.0% user: 0.3% nice: 0.0% 1 min: 0.01 total: 981M inactive: 162M total: 2.00G system: 0.6% iowait: 0.0% 5 min: 0.10 used: 357M buffers: 24.2M used: 0 idle: 99.0% irq: 0.0% 15 min: 0.20 free: 623M cached: 185M free: 2.00G 網絡 Rx/s Tx/s Tasks 200 (298 thr), 1 run, 199 slp, 0 oth 自動排序 eth1 320b 9Kb lo 0b 0b VIRT RES CPU% MEM% PID USER NI S TIME+ NAME pan0 0b 0b 206M 12M 4.1 1.2 2884 root 0 R 0:00.51 /usr/bin/python /usr/bin/glances 19M 2M 0.0 0.2 1 root 0 S 0:02.19 /sbin/init Disk I/O In/s Out/s 0 0 0.0 0.0 2 root 0 S 0:00.20 kthreadd sda1 0 0 0 0 0.0 0.0 3 root 0 S 0:00.20 migration/0 sda2 0 0 0 0 0.0 0.0 4 root 0 S 0:00.10 ksoftirqd/0 sda3 0 0 0 0 0.0 0.0 5 root 0 S 0:00.00 stopper/0 sdd1 0 0 0 0 0.0 0.0 6 root 0 S 0:00.00 watchdog/0 0 0 0.0 0.0 7 root 0 S 0:00.36 migration/1 Mount Used Total 0 0 0.0 0.0 8 root 0 S 0:00.00 stopper/1 / 4.29G 116G 0 0 0.0 0.0 9 root 0 S 0:00.00 ksoftirqd/1 /boot 33.4M 190M 0 0 0.0 0.0 10 root
a 自動排序 l Show/hide logs
c 根據CPU使用率排序 b Bytes or bits for network I/O
m 根據內存占用比排序 w 刪除警告日志
p 根據進程名字排序 x 刪除警告和嚴重級別的日
i Sort processes by I/O rate 1 全局CPU或者每個CPU的狀態
d 顯示/隱藏硬盤I/O狀態 h Show/hide this help screen
f 顯示/隱藏文件系統狀態 t View network I/O as combination
n 顯示/隱藏network狀態 u View cumulative network I/O
s 顯示/隱藏sensors狀態 q Quit (Esc and Ctrl-C also work)
y 顯示/隱藏hddtemp狀態
常用選項:
-b: 以Byte為單位顯示網卡數據速率
-d: 關閉磁盤I/O模塊
-f /path/to/somefile: 設定輸入文件位置
-o {HTML|CSV}:輸出格式
-m: 禁用mount模塊
-n: 禁用網絡模塊
-t #: 延遲時間間隔
-1:每個CPU的相關數據單獨顯示
C/S模式下運行glances命令
服務模式:
glances -s -B IPADDR
IPADDR: 指明監聽的本機哪個地址
客戶端模式:
glances -c IPADDR
IPADDR:要連入的服務器端地址
dstat命令:系統資源統計
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相關的統計數據
–tcp
–udp
–unix
–raw
–socket
–ipc
–top-cpu:顯示最占用CPU的進程
–top-io: 顯示最占用io的進程
–top-mem: 顯示最占用內存的進程
–top-latency: 顯示延遲最大的進程
進程管理工具
kill命令:
向進程發送控制信號,以實現對進程管理
顯示當前系統可用信號:kill -l
常用信號:man 7 signal
1:SIGHUP:無須關閉進程而讓其重讀配置文件
2:SIGINT:終止正在運行的進程;相當于Ctrl+c
9:SIGKILL:殺死正在運行的進程
15:SIGTERM:終止正在運行的進程(不指定選項默認15)
18:SIGCONT:繼續運行
19:SIGSTOP:后臺休眠
指定信號的方法:
信號的數字標識:1,2,9
信號完整名稱:SIGHUP
信號的簡寫名稱:HUP
按PID對進程進行管理:
kill [-SIGNAL] pid…
按名稱對進程進行管理:
killall [-SIGNAL] comm…
killall -9 ping
按模式對進程進行管理:
pkill [options] pattern
-u uid: effective user,生效者
-U uid: real user,真正發起運行命令者
-t terminal: 與指定終端相關的進程
pkill -t pts/2
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示父進程為此處指定的進程的進程列表
作業管理控制:
前臺作業:通過終端啟動,且啟動后一直占據終端
后臺作業:可通過終端啟動,但啟動后即轉入后臺運行(釋放終端, 后臺程序 ctrl+c不能終止)
終端之間的相互切換:
例如:ping 127.0.0.1 & 后臺運行 –> jobs 查看進程編號 –> fg 編號 就能后臺程序轉為前臺
ping 127.0.0.1 前臺運行 –> ctrl + z 轉為后臺休眠 –> bg 編號 后臺運行
后臺作業雖然被送往后臺運行,但其依然與終端相關,退出終端,關閉后臺作業,如果希望送往后臺后,剝離與終端的關系則可采取以下方法:
# nohup COMMAND & #screen;COMMAND
查看所有作業:
jobs
同時運行多個進程,提高效率
有三個腳本:f1.sh f2.sh f3.sh 讓其同時運行
方法1、vim all.sh
f1.sh&
f2.sh&
f3.sh&
方法2、(f1.sh&);(f2.sh&);(f3.sh&)
方法3、{ f1.sh& f2.sh& f3.sh& }
原創文章,作者:Naruto,如若轉載,請注明出處:http://www.www58058.com/44883