天天看點

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指令 檢視程序數。 常用用法如下:

<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>#    &lt;:高優先級程序</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種。

    使用 &amp; 或者 ctrl + Z可以把一個程序打入背景。

<code># ping 192.168.0.1 &amp;</code>

<code># 這樣打入背景的運作的作業,退出終端的時候,作業就會終止。</code>

<code># 使用 nohup 指令可避免這個問題</code>

<code># nohup ping 192.168.0.1 &amp;</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,如需轉載請自行聯系原作者

繼續閱讀