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