進程管理:
1、程序和進程的關係:
程序是爲了完成某種任務而設計的軟件,比如LibreOffice是程序
進程就是運行中的程序;運行中的程序是程序的一個副本,存在着生命週期;
一個運行着的程序,可能有多個進程。尤其是作爲服務進程,在爲了響應多個訪問時會創建多個進程來對其進行服務;
Linux內核存儲進程信息的固定格式:task struct;
多個任務的task struct組件的鏈表:task list;
2、進程分爲交互進程(用戶、前臺進程)、批處理進程和守護進程三類:
Linux內核屬於搶佔式多任務;
守護進程(daemon)總是活躍的在系統啓動過程中啓動的進程,跟終端無關;
由於守護進程是一直運行着的,所以它所處的狀態是等待請求處理任務;
前臺進程:跟終端相關,通過終端啓動的進程;
注意:也可以吧在前臺啓動的進程送往後臺,以守護模式運行;
進程的分類2:
CPU-Bound:CPU密集型,佔用CPU資源較大;多分CPU資源;
IO-Bound:IO密集型,佔用IO資源較大;提高優先級;
3、進程狀態:
運行態:running
就緒態:ready
睡眠態:
可中斷:interruptable
不可中斷:uninterruptable
停止態:stopped暫停於內存中,但不會被調度,除非手動啓動之;
僵死態:zombie,例如父進程在結束時沒有指定其子進程的管理進程則容易導致其子進程成爲僵死態。
4、進程的屬性:
進程ID(PID):是唯一的數值,用來區分進程;
父進程和父進程的ID(PPID:parent process ID);
啓動進程的用戶ID(UID)和所歸屬的組(GID):
進程狀態:狀態分爲運行R、休眠S、殭屍Z;
進程執行的優先級;
進程所連接的終端名;
進程資源佔用:比如佔用資源大小(內存、CPU佔用量)
5、父進程和子進程:
操作系統啓動時,啓動的第一個進程在CentOS6中是init,CentOS7中是systemd,由他們來創建進程來完成工作;
父進程和子進程是管理和被管理的關係;
當父進程終止時,子進程也隨之而終止。
但子進程終止,父進程並不一定終止。
進程都由其父進程創建,使用fork()系統調用創建;
在進程管理中,當我們發現進程佔用資源過多,或無法控制的進程時,應該殺死該進程,以保護系統的穩定安全運行;
6、進程創建:
進程創建存在進程樹,內核創建第一個進程init,後續的用戶空間的管理工作由init處理,若init在管理用戶空間的進程的過程中若需要調用內核空間的資源則向內核申請;
7、進程優先級:
linux屬於多任務操作系統,需要運行多個進程;爲了響應所有進程的操作,linux將CPU資源劃分成時間片,通過分配時間片的方式同時響應多個進程的調用;
爲了確保重要的進程能夠得到 CPU,這種選擇是基於調度優先級 進程的。
使用top命令時,NI列即表示進程的優先級,該列展示了調度優先級或者說每個進程的niceness。niceness的範圍一般從-20到19,-20表示調度優先級最高,19表示優先級最低;
進程優先級:
0-139:共分140個;
1-99:實時優先級;數字越大,優先級越高;
100-139:靜態優先級;數字越小,優先級越高;
Nice值:
-20,19
對應100,139
在任務隊列中創建140個隊列,對應140個優先級,相同優先級的進程排在對應的隊列中;在進程調度時無需遍歷所有進程,只需掃描這140個隊列中優先級最高的隊列中的首部即可。
[root@localhost ~]# top top - 21:01:12 up 27 min, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 152 total, 1 running, 151 sleeping, 0 stopped, 0 zombie Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1906492k total, 194168k used, 1712324k free, 12332k buffers Swap: 2097148k total, 0k used, 2097148k free, 65336k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 19356 1536 1224 S 0.0 0.1 0:01.41 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.02 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 stopper/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 7 root RT 0 0 0 0 S 0.0 0.0 0:00.37 migration/1 8 root RT 0 0 0 0 S 0.0 0.0 0:00.00 stopper/1 9 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/1 10 root RT 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/1 11 root 20 0 0 0 0 S 0.0 0.0 0:01.91 events/0 12 root 20 0 0 0 0 S 0.0 0.0 0:00.17 events/1 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup
[root@localhost ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 2317 2314 0 80 0 - 27085 wait pts/0 00:00:00 bash 4 R 0 2406 2317 0 80 0 - 27033 - pts/0 00:00:00 ps
niceness的默認值:
從top命令的NI列和ps -l的執行結果可以看出,常規用戶所啓用進程的niceness的默認值是0;可以運行nice命令且不帶任何參數,以此驗證系統中的nice值;
使用nice設置優先級:
(1)Linux和Unix系統使用有40個優先級的優先級系統,範圍從-20(最高優先級)到19(最低優先級);
(2)常規用戶啓動的進程優先級一般是0;
(3)ps命令可以使用-l選項顯示優先級(例如:nice或NI、level)
(4)nice命令顯示我們的默認優先級;
nice 命令還可以用來啓動具有不同優先級的進程。使用 -n 或 (--adjustment) 選項時帶一個負值可以增加優先級值,
帶一個正值將減少優先級值。具有最低優先級值的進程運行時有最高調度優先級,
因此可以這樣記憶,增加優先級值對於其他進程而言更好(nice)。
注意,您必須是超級用戶(根用戶)才能調低優先級值。換句話說,常規用戶通常只能增加它們的優先級值。
進程元數據:
內核爲系統上的每個進程創建用來創建該進程的元數據結構;
Linux內核存儲進程信息的固定格式:task struct(任務結構體);
多個任務的task struct組成的鏈表:task list(任務列表)
8、進程管理:通過進程管理工具實現;
(1)pstree
pstree - display a tree of processes
(2)ps:process state
ps - report a snapshot of the current processes,報告一個當前所有進程的快照;
ps爲我們提供了進程的一次性的查看,它所提供的查看結果並不是動態連續的;如果想對進程進行動態連續的監控,可以使用top、htop等工具;
Linux系統各進程的相關信息均保存在/proc/PID目錄下的各文件中。
ps [options]
選項:支持兩種風格:
常用組合:aux
u:以用戶爲中心組織進程狀態信息顯示;
a:與終端相關的進程;
x;與終端無關的進程;
[root@localhost ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 19356 1536 ? Ss Aug31 0:01 /sbin/init root 2 0.0 0.0 0 0 ? S Aug31 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S Aug31 0:00 [migration/0] root 4 0.0 0.0 0 0 ? S Aug31 0:00 [ksoftirqd/0]
顯示結果參數說明:
VSZ:Virtual memory Size,虛擬內存集;
RSS:ReSident Size,常駐內存集;
STAT:進程狀態:
R:running
S:interruptable sleeping
D:uninterruptable sleeping
T:stopped
Z:zombie
+:前臺進程;
1:多線程進程;
N:低優先級進程;
<: 高優先級進程;
s: session leader,會話創建者;
START:啓動時間;
TIME:佔用CPU的累積時長;
常用組合:-ef
-e:顯示所有進程;
-f:顯示完整格式程序信息;
[root@kalaguiyin ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 9月04 ? 00:00:06 /usr/lib/systemd/systemd --switched-root --syste root 2 0 0 9月04 ? 00:00:00 [kthreadd] root 3 2 0 9月04 ? 00:00:00 [ksoftirqd/0] root 5 2 0 9月04 ? 00:00:00 [kworker/0:0H] root 7 2 0 9月04 ? 00:00:00 [migration/0] root 8 2 0 9月04 ? 00:00:00 [rcu_bh] root 9 2 0 9月04 ? 00:00:00 [rcuob/0] root 10 2 0 9月04 ? 00:00:00 [rcuob/1] root 11 2 0 9月04 ? 00:00:00 [rcuob/2] root 12 2 0 9月04 ? 00:00:00 [rcuob/3] root 13 2 0 9月04 ? 00:00:00 [rcuob/4]
常用組合:-eFH
-F: 顯示完整格式的進程信息;
-H:以進程層級格式顯示進程相關信息;
[root@kalaguiyin ~]# ps -eFH | tail root 1487 1 0 31575 1704 1 9月04 ? 00:00:01 /usr/sbin/crond -n root 1488 1 0 6483 956 1 9月04 ? 00:00:00 /usr/sbin/atd -f root 1505 1 0 21146 2248 0 9月04 ? 00:00:00 login -- root root 2805 1505 0 29036 2792 2 9月04 tty1 00:00:00 -bash root 1992 1 0 23289 2224 1 9月04 ? 00:00:00 /usr/libexec/postfix/master -w postfix 2013 1992 0 23332 3916 2 9月04 ? 00:00:00 qmgr -l -t unix -u postfix 9184 1992 0 23352 3952 1 08:00 ? 00:00:00 cleanup -z -t unix -u postfix 9188 1992 0 22820 4528 2 08:00 ? 00:00:00 local -t unix postfix 9405 1992 0 23315 3892 0 08:11 ? 00:00:00 pickup -l -t unix -u postfix 10160 1992 0 23316 3908 3 08:50 ? 00:00:00 trivial-rewrite -n rewrite -t unix -u
常用組合:-eo,axo;
-o選項表示顯示指定的字段;
ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
ps -eopid,tt,user,fname,tmout,f,wchan
[root@kalaguiyin ~]# ps -eo pid,tid,ni,pri,stat | tail 9405 9405 0 19 S 9754 9754 0 19 S 9978 9978 0 19 S 10104 10104 0 19 S 10160 10160 0 19 S 10207 10207 0 19 S 10253 10253 0 19 S 10310 10310 0 19 S 10318 10318 0 19 R+ 10319 10319 0 19 S+
字段說明;
ni:nice值;
pri:priority,優先級
psr:processor,CPU:運行在那顆CPU上;
rtptrio:實時優先級;
ppid:父進程的id;
(3)pgrep, pkill: look up or signal processes based on name and other attributes
是通過程序的名字來查詢進程的工具,一般是用來判斷程序是否正在運行
pgrep [options] pattern
pkill [options] pattern
-u uid: effective user,有效用戶;
-U uid: real user,
-t terminal: 與指定終端相關的進程
-l: 顯示進程名
-a: 顯示完整格式的進程名
-P pid: 顯示其父進程爲此處指定的進程的進程列表
(4)pidof:根據進程名獲取其pid;
[root@kalaguiyin ~]# pidof bash 2848 2805 953
(5)top:實時顯示系統中各個進程的資源佔用狀況。
內置命令:
排序;
P:以佔據的CPU百分比排序;
M:以佔據內存百分比排序;
T:以累積佔據CPU時長排序;
首部信息顯示:
uptime信息:l命令;
tasks及cpu信息:t命令;
cpu分別顯示:1(數字)
memory信息:m命令;
選項:
-d #;指定刷新時間間隔,默認爲3秒;
-b :以批次方式;
-n # :顯示多少批次;
(6)htop ===>原top工具的替代者,功能更爲強大;
系統安裝時,不自帶;需要自行安裝,可以使用Fedora的EPEL源,具體操作請參考Linux軟件包管理;
選項:
-d #: 指定延遲時間;
u UserName: 僅顯示指定用戶的進程;
-s COLOMN: 以指定字段進行排序;
命令:
s: 跟蹤選定進程的系統調用;
l: 顯示選定進程打開的文件列表;
a:將選定的進程綁定至某指定CPU核心;
t: 顯示進程樹
(7)vmstat:報告關於內核線程、虛擬內存、磁盤、陷阱和 CPU 活動的統計信息。
vmstat [options] [delay [count]]
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 1651316 44720 71880 0 0 2 1 9 17 0 0 100 0 0
字段說明:
procs:
r:等待運行的進程的個數;
b:處於不可中斷睡眠態的進程個數;(被阻塞的隊列的長度);
memory:
swpd: 交換內存的使用總量;
free:空閒物理內存總量;
buffer:用於buffer的內存總量;
cache:用於cache的內存總量;
swap:
si:數據進入swap中的數據速率(kb/s)
so:數據離開swap中的數據速率(kb/s)
io:
bi:從塊設備讀入數據到系統的速率;(kb/s)
bo: 保存數據至塊設備的速率;
system:
n: interrupts, 中斷速率;
cs: context switch, 進程切換速率;
cpu:
us :用戶空間佔據比例
sy ;內核空間佔據比例;
id :空閒比例
wa :等待IO完成的時間比例;
st :被偷走的時間比例;
選項:
-s: 顯示內存的統計數據 ===》相當於查看/proc/meminfo文件的內容;
(8)dstat: 是vmstat的升級版,擁有更多使用的功能,建議使用;
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 :enable raw stats (raw sockets)
--socket 用來顯示tcp、udp端口狀態;
--ipc :顯示ipc消息隊列、信號等信息;
--top-cpu:顯示最佔用CPU的進程;
--top-io: 顯示最佔用io的進程;
--top-mem: 顯示最佔用內存的進程;
--top-lantency: 顯示延遲最大的進程;
(9)pmap:report memory map of a process
pmap [options] pid [...]
-x: 顯示詳細格式的信息;
另外一種實現:
# cat /proc/PID/maps
(10)glances:由 Python 編寫,使用 psutil 庫來從系統抓取信息的基於 curses 開發的跨平臺命令行系統監視工具。
以監視 CPU,平均負載,內存,網絡流量,磁盤 I/O,其他處理器 和 文件系統 空間的利用情況.
usage:
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]
內建命令:
a Sort processes automatically l Show/hide logs c Sort processes by CPU% b Bytes or bits for network I/O m Sort processes by MEM% w Delete warning logs p Sort processes by name x Delete warning and critical logs i Sort processes by I/O rate 1 Global CPU or per-CPU stats d Show/hide disk I/O stats h Show/hide this help screen f Show/hide file system stats t View network I/O as combination n Show/hide network stats u View cumulative network I/O s Show/hide sensors stats q Quit (Esc and Ctrl-C also work) y Show/hide hddtemp stats
常用選項:
-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:要連入的服務器端地址
(11)kill命令:向進程發送控制信號,以實現對進程的管理;
顯示當前系統可以信號;
# kill -l
# man 7 signal 獲得具體每個信號的幫助信息;
常用信號:
1) SIGHUP: 無須關閉進程而讓其重讀配置文件;
2) SIGINT: 中止正在運行的進程;相當於Ctrl+c;
9) SIGKILL: 殺死正在運行的進程;
15) SIGTERM:終止正在運行的進程;
18) SIGCONT:繼續運行停止的進程;
19) SIGSTOP:停止進程;
其實,關於資源管理(Resource Managenent)的命令還有很多,如:iostat、netstat、mpstat、numstat、ss等,此次就不再一一說明;
後期如果有時間再總結。