Linux下的進程管理
在操作系統系統中,進程是一個非常重要的概念。
一、Linux中進程的相關知識
1、什么是進程呢?
通俗的來說進程是運行起來的程序。唯一標示進程的是進程描述符(PID),在linux內核中是通過task_struck和task_list來定義和管理進程的。
2、進程的分類
1)根據在linux不同模式下運行分為:
核心態:這類進程運行在內核模式下,執行一些內核指令(Ring 0)。
用戶態:這類進程工作在用戶模式下,執行用戶指令(Ring 3)。
如果用戶態的進程要執行一些核心態的指令,此時就會產生系統調用,系統調用會請求內核指令完成相關的請求,就執行的結果返回給用戶態進程。
2)按照進程的狀態可分為:
運行態:running 正在運行的進程
可中斷睡眠態:進程處于睡眠狀態,但是可以被中斷
不可中斷的睡眠態:進程處于睡眠狀態,但是不可以被中斷
停止態:stoped 不會被內核調度
僵死態:zombie產生的原因是進程結束后,它的父進程沒有wait它,所導致的。
3)按照操作的密集程度
CPU密集型:進程在運行時,占用CPU時間較多的進程。
I/O密集型:進程在運行時,占用I/O時間較多的進程。
通常情況下,I/O密集型的優先級要高于CPU密集型。
4)按照進程的處理方式
批處理進程:
交互式進程:
實時進程:
3、進程的優先級
進程的有優先級,是用0-139數字來表示的,數字優先級從小到大依次是:0-99,139-100。
優先級分為2類:
實時優先級:0-99,是由內核維護的
靜態優先級:100-139,可以使用nice來調整,nice值的取值范圍是[-20,19),分別對應100到139。nice默認值是0。
動態優先級:由內核動態維護,動態調整。
二、進程的管理工具
1、pstree命令 查看進程數。 常用用法如下:
#p#
2、ps 命令 查看進程的相關狀態。支持SysV和BSD兩種風格的選項。
常用選型:
a 與終端相關的進程
x 與終端無關的進程
u 顯示運行進程的用戶
常用組合選項:ps aux
- # 下面分別來說明上圖的各個字段的含義
- # USER 進程以什么用戶身份運行
- # PID 進程描述符 具有唯一性
- # %CPU 進程運行時所占的cpu百分比
- # %MEM 進程運行時內存所占的百分比
- # VSZ Virtual memory SiZe 虛擬內存使用大小
- # RSS 常駐內存集,所有不能被置換出去的內存集
- # STAT 表示內存狀態
- # 常用的狀態有:
- # S:可中段睡眠狀態
- # R:運行態
- # D:不可中斷睡眠態
- # T:停止態
- # Z:僵尸態
- # s:session leader 所謂進程的領導者
- # +:表示是前臺進程
- # l:多線程進程
- # N:低優先級進程
- # <:高優先級進程
- # TTY 用來表示終端 顯示為“?”的說明是與終端無關的進程
- # START 進程開始時間
- # TIME 進程運行時間
- # COMMAND 執行進程的命令 如果命令被 "[]"包圍,說明是內核線程
-e 顯示所有進程
-f 顯示完成格式信息
常組合在一起使用:ps -ef
但是有些這種情況下,我們的命令有時候顯示不完整
此時想要顯示完成就要 ps -efww
-F:顯示額外信息
-H:顯示進程的層次結構
常用組合方式:ps -eFH
可能以后我們用到最多的選項:
-o 我們可以自定義顯示字段
- # 常用的有:
- # pid command psr pri ni %cpu %mem rsz vsz等
#p#
3、pgrep,pidof
pgrep 常用選型:
-U 查看指定用戶的進程號
-G 查看指定用戶組的進程號
-l 顯示進程名和進程號
pidof:只顯示已啟動進程的PID
4、top命令
- [root@server ~]# pidof httpd # 沒啟動的進程不顯示
- [root@server ~]# pidof man
- 5283
實時監控系統資源
- # 執行top命令后,進入交互式模式
- # top中的一些交互式命令:
- # l:控制是否顯示第一行,負載均衡信息
- # t:控制是否顯示進程信息由和cpu信息
- # m:控制是否顯示內存,交換信息
- # I 或者 1(數字):是否分別顯示cpu每個信息
- # M: 按%mem排序顯示,從大到小
- # k: kill 殺掉進程
- # s:修改默認刷新時間 默認是3秒
- # 下面解釋抬頭信息:
- top - 21:35:17 up 10:03, 4 users, load average: 0.00, 0.00, 0.00
- # 系統時間 啟動時間 登錄用戶數 負載均衡:1min 5min 15min
- # 何為系統負載?在這里指的是等待在進程隊列里的平均進程數
- # 此出顯示的信息 等價于 uptime 命令
- Tasks: 165 total, 1 running, 164 sleeping, 0 stopped, 0 zombie
- # 進程總數 運行數 睡眠態數 停止態數 僵尸進程數
- Cpu(s): 0.0%us,0.0%sy, 0.0%ni, 100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
- # 0.0%us:user space:用于運行用戶空間的程序所占的cpu百分比
- # 0.0%sy:system space:用于運行內核空間的程序所占的cpu百分比
- # 0.0%ni:nice值調用時間所占cpu百分百比
- # 100.0%id:系統cpu空閑所占百分比
- # 0.0%wa:用于等待I/O所占的cpu百分比
- # 0.0%hi:硬中斷所占cpu百分比
- # 0.0%si:軟中斷所占cpu百分比
- # 0.0%st:系統被“偷走”的cpu所占的百分比,一般指的是用于虛擬機運行所占的cpu
- Mem: 1012548k total, 396328k used, 616220k free, 99444k buffers
- # 總內存大小 使用的內存大小 剩余內存大小 緩存的大小
- Swap: 2097144k total, 0k used, 2097144k free, 144156k cached
- # 交換分區總大小 使用的 剩余的 緩沖大小
- # 此處顯示的信息等價于 free 命令
常用選項:
-d #: 指定刷新時間間隔
-b: 以批次的方式顯示top的刷新
-n #: 顯示的批次
例如:top -d 4 -b 2 -n 3
#p#
4、htop
htop命令是top命令的升級版,無論是在功能上還是在界面顯示上,都比top命令更勝一籌。
u: 交互式選擇顯示指定用戶的進程
l: 顯示光標所在進程所打開的文件列表
s: 顯示光標所在進程執行的系統調用
a: 綁定進程到指定的CPU
#:快速定位光標至PID為#的進程上
下圖是htop的界面。這個工具比較強大,用法功能比較多,在這里先做簡單介紹。以后筆者會專門寫htop的博客。
5、vmstat
wmstat 查看虛擬使用情況
- # 常用用法:
- # vmstat 顯示信息會默認1秒刷新一次,一直顯示
- # vmstart -n 2 顯示信息會2秒刷新一次,一直顯示
- # vmstat -n 1 4 顯示信息會1秒刷新一次,刷新4次
- [root@server ~]# vmstat -n 1 1
- 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 614392 100468 144776 0 0 2 1 6 5 0 0 100 0 0
- # 我們解釋一下每個字段的含義:
- # procs字段 關于進程的
- # r 指運行隊列的進程數,如果過長,可能是cpu性能較低
- # b 阻塞隊列的長度,通常是用于等待I/O的完成。如果太大,說明I/O性能較低
- # memory字段 關于內存使用的
- # swap 使用的交換內存大小
- # free 空余內存大小 它的值=總大小-buff-cache-used
- # buff 緩沖大小,目的是為了加速I/O的寫操作(一般是磁盤)
- # cache 緩存大小,摸底是為了加速I/O的讀操作(一般是磁盤)
- # swap字段 說明交換內存
- # si swapin 指的是數據進入交換內存的速率 單位:KB/s
- # so swapout 指的是數據出交換內存的速率 單位:KB/s
- # 如果這2個值比較大的時候,會出現抖動現象。建議增加內存
- # io字段 I/O的說明
- # bi:Block in 從塊設備讀入內存的速率 KB/s
- # bo: block out 保存到塊設備的速率 KB/s
- # 這就是我們通常說的磁盤的讀寫性能,可以通過RAID提高。
- # system字段 關于系統的
- # in: interruppt 中斷發生的速率
- # cs: 上下文切換的速率(進程調度)
- # cpu字段 說明cpu的使用情況
- # us:user space:用于運行用戶空間的程序所占的cpu百分比
- # sy:system space:用于運行內核空間的程序所占的cpu百分比
- # id:系統cpu空閑所占百分比
- # wa:用于等待I/O所占的cpu百分比,這是由于cpu和i/o速度相差太多所造成的
- # st:系統被“偷走”的cpu所占的百分比,一般指的是用于虛擬機運行所占的cpu的時間百分比
6、nice,renice
調整進程的優先級。
nice 在進程啟動的時候設置優先級。
- # 常用參數:
- # -n NICE 例如:nice -n 3 httpd
- # 一般情況下,nice值是負值的設定一般有管理員來設定。普通用戶只能設置nice為正值。
- # 如果不指定 -n 參數,默認的nice值是10
renice 重新設置已啟動進程的優先級。
- # 常用選項是:
- # -n NICE 重新設定nice的值
- # -p PID 設定進程的PID
7、kill,killall
對于有Linux C編程經驗的人來說,我們知道IPC通信方式之一就是通過信號量(signal),那么對于kill和killall命令來說,它們與信號量有著很大的關系,或者說kill,killall命令通過信號量讓我們可以手動的向進程傳遞信號來控制進程。
常見的信號量如下:
- [root@server ~]# kill -l
- 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
- 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
- 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
- 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
- 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
- 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
- 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
- 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
- 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
- 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
- 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
- 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
- 63) SIGRTMAX-1 64) SIGRTMAX
- # 我們常用到的信號是:
- # 1 SIGHUP 在不關閉進程的情況下,重讀配置文件。ngnix在這方面做得相當的好,甚至可以實現在線升級。
- # 2 SIGINT 中斷信號 相當于 ctrl + C
- # 9 SIGKILL 暴力殺死
- # 15 SIFTERM 優雅的關閉 默認是這種情況
- # kill用法如下:
- # kill [-SIGNAL] PID
- # 對于SIGNAL有三種表示:例如:1) -9 -15 -1 -2 2)-SIGKILL -SIGHUP -SIGTERM 3) -HUP -KILL -TERM -INT 等。
- #
- # killall是殺掉一類進程
- # 例如:killall httpd 等價于 kill `pidof httpd`
#p#
8、jobs,bg,fg
什么是作業呢?作業就是許多進程一起協同完成一項具體的工作。作業有前臺作業和后臺作業2種。
使用 & 或者 ctrl + Z可以把一個進程打入后臺。
- # ping 192.168.0.1 &
- # 這樣打入后臺的運行的作業,退出終端的時候,作業就會終止。
- # 使用 nohup 命令可避免這個問題
- # nohup ping 192.168.0.1 &
- # 可以使用jobs命令查看后臺的作業
- # 每個作業都有一個作業號來標識作業
- # 作業控制命令
- # bg [[%]JOB_NUM]: 讓送往后臺的作業繼續在后臺運行
- # fg [[%]JOB_NUM]: 將后臺作業調回前臺
- # kill %JOB_NUM: 終止指定的作業
9、dstat命令,查看各種狀態信息
用法:dstat [-afv] [options..] [delay [count]]
常用參數 | 具體意義 |
-c | 顯示cpu統計數據,如有多個CPU匯總統計 |
-d | 顯示disk統計數據,如有多塊磁盤則匯總統計 |
-D DEVICE | 顯示特定磁盤的信息 |
-g | 顯示page信息(具體什么是page以及他的作用,會在以后內存調優博客中具體說明) |
-i | 顯示中斷的統計數據 |
-m | 顯示內存的統計信息 |
-l | 顯示系統的負載信息 |
-n | 顯示網絡接口的相關屬性 |
-s | 顯示系統屬性 |
-N INTER_FACE_NAME | 顯示特定接口的屬性 |
-s | 顯示交換內存的屬性 |
-p | 顯示進程隊列 |
--ipc | 顯示ipc消息隊列、信號量和共享內存的使用狀況 |
-a | 等價于 -cdngy 顯示CPU,磁盤,網卡,page,系統屬性 |
-f | 以完整格式顯示所有信息, |
--tcp,--udp | 顯示tcp,udp狀態信息 |
更多參數查看 man 手冊。
示例:
10、查看內存映射
pmap PID 查看對應進程的內存映射,常用的用法是:pman `pidof PROCESS_NAME`。當然這些信息也可以查看 /proc/PID/pmap 文件查看。
11、glances命令
一款強大的系統監控工具:能實時監控像cpu,meomory,load,swap,Network,mount,disk等信息。
其他功能的使用,請使用 h 來獲取幫助。由于此工具比較強大,因此這里者簡單的介紹,后期會于 htop 工具做專門的介紹。
原文鏈接:http://guoting.blog.51cto.com/8886857/1440640