進程管理,及性能監控 ps, pstree, pidof, top, htop, pmap, vmstat, dstat

進程的分類:
    CPU-Bound: CPU密集型
    I/O-Bound: I/O密集型

進程的分類:
    批處理進程
    交互式進程
    實時進程

進程調度器:
    進程優先級:0-139
        實時優先級:1-99,數字越大,優先級越高
        靜態優先級:100-139, nice值調整,數字越大,優先級越低
            nice:     -20, 19
            priority: 100, 139
        動態優先級:由內核維護,動態調整


進程狀態:running
    運行態:
        就緒態:
    睡眠態:sleeping
        可中斷睡眠: inruptable
        不可中斷睡眠: uninruptable
    停止態:不會被調度,stopped
    僵死態:zombie


進程管理命令:
    ps, pstree, pidof, top, htop, pmap, vmstat, dstat

linux 終端    
        控制檯:/dev/console    
        物理終端:
        虛擬終端:/dev/tty[1-6]
        模擬終端:/dev/pts/#
        串行終端:/dev/ttyS#
   

1、ps: 顯示進程狀態的命令

常用組合1:ps -aux

    -a:與終端相關的進程

    -x:與終端無關的進程

    -u:以用戶爲中心顯示相關的進程

    -o:自定義需要顯示的字段,不能和u組合

              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 -aux
USER    PID %CPU %MEM    VSZ   RSS TTY    STAT   START   TIME COMMAND
root    1  0.0  0.1    2900   1404 ?     Ss    Feb28   0:05 /sbin/init

STAT: 進程狀態
            R: 運行中
            S: 可中斷
            D: 不可中斷
            T:停止
            Z:僵死
            s: session leader
            +:前臺進程
            l: 多線程進程
            N: 低優先級進程
            <: 高優先級進程


-u: 以用戶爲中心顯示進程相關信息
            %CPU:cputime(進程運行總時長)/realtime(cpu總共運行時長)
            %MEM:
            VSZ: Virutal memory SiZe(虛擬地址空間大小)
            RSS: 常駐內存集


其它常用組合 

ps -ef

        -e: 顯示所有進程
        -f: 顯示完整格式列表


ps -eFH
        -F: 顯示額外信息
        -H: 顯示進程的層次信息


2、pgrep 查找進程的PID號

# pgrep -U root   \\ 只顯示root用戶的PID號
# pgrep -G root   \\ 只顯示root組的PID號
# pgrep -f ping.sh  \\列出和ping.sh程序相關的PID號,此-f 選項可省



3、pidof 顯示指定命令啓動的進程PID號

# pidof COMMAND


4、dstat 性能檢測工具

[root@zibbix ~]# dstat 
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
  0   0  99   0   0   0| 978B   78k|   0     0 |   0     0 | 107   104 
  0   0  97   2   0   0|   0   464k|1592B  826B|   0     0 | 149   176 
  0   0 100   0   0   0|   0    44k|1656B  346B|   0     0 | 107    76

上而示例爲dstat執行的結果,默認每秒對cpu、disk(磁盤)、net(網絡)、paging(頁面)、system(系統)進行監控。

CPU狀態:顯示了用戶、系統、空閒、I/0等待

磁盤統計磁盤的讀寫操作,這一欄顯示磁盤的讀(read)、寫(writ)總數

網絡統計:網絡設備發送和接受的數據,這一欄顯示的網絡收(rece)、發(send)數據總數。

分頁統計:系統的分頁活動。分頁指的是一種內存管理技術用於查找系統場景,一個較大的分頁表明系統正在使用大量的交換空間,或者說內存非常分散,大多數情況下你都希望看到page in(換入)和page out(換出)的值是0 0。

系統統計這一項顯示的是中斷(int)和上下文切換(csw)。這項統計僅在有比較基線時纔有意義。這一欄中較高的統計值通常表示大量的進程造成擁塞,需要對CPU進行關注。你的服務器一般情況下都會運行運行一些程序,所以這項總是顯示一些數值。


dstat 可以通過兩個參數來控制輸出信息,dstat [delay [count]]

如下,第一個參數控制每3秒更新一次數據,只顯示8次。

dstat 3 8

常用選項如下:

  • -l :顯示負載統計量

  • -m :顯示內存使用率(包括used,buffer,cache,free值)

  • -r :顯示I/O統計

  • -s :顯示交換分區使用情況

  • -t :將當前時間顯示在第一行

  • –fs :顯示文件系統統計數據(包括文件總數量和inodes值)

  • –nocolor :不顯示顏色(有時候有用)

  • –socket :顯示網絡統計數據

  • –tcp :顯示常用的TCP統計

  • –udp :顯示監聽的UDP接口及其當前用量的一些動態數據





5、nice、renice 手動調整進程優先級
       可調整nice值的級別: -20, 19 調整的值,對應系統上100, 139(系統的優先別有0-139)

       默認nice爲0,其默認優先級爲120,普通用戶只能調大nice值,nice值越小優先級越高。

(a)、對於尚未啓用的程序:

# nice -n # COMMAND

(b)、對於運行中的進程:

# renice # PID

(c)、查詢nice值可以使用如下命令完成

# ps axo ni,command,pid


6、進程間通信,kill命令的使用

kill命令,用於實現向其它進程發送信息。

顯示常用信號

# kill -l
# man 7 signal
 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

kill命令使用格式

# kill [-signal] PID

    默認不帶參數信號爲15,常用的幾個signal如下:

        1) SIGHUP: 讓程序重讀配置文件,而不用重啓程序
        2) SIGINT: 中斷信號,Ctrl+c即發送此信號
        9) SIGKILL:殺死進程
        15) SIGTERM:終止進程

也可以使用killall來終止一個程序的所有進程

# killall [-SIGNAL] command



7、linux作業控制

    前臺作業:佔據着一個終端
    後臺作業:作業執行時不佔據終端,作業啓動後就釋放終端


(a)、非守護進程類的程序,啓動以後都在前臺工作,如果想送往後臺可以有如下幾種方式
       (1) 如果已經啓動:前臺-->後臺,Ctrl+z把前臺作業送往後臺,但作業將被“停止”
       (2)如果尚未啓動:COMMAND &

       (3)以上兩種方式送到後臺後,如果此時退出當前會話,作業也將一併退出,因爲作業與當前終端相關,如果不期望作來隨終端結束而終止可以使用nohup操作如下:

# nohup COMMAND &


(b)、如何查看後臺的作業?

# jobs  \\ 使用jobs命令可以查看後臺作業
[1]+  Stopped                 cat


(c)、如何操作後臺作業?

    # fg  [[%]job_num]: 將作業調回前臺繼續運行

# fg %1   \\ 此處的%號也是可以省略的,1爲jobs查看的作業號

    # bg [[%]job_num]:讓送往後臺的作業繼續運行

# bg %1

(d)、如何結束一個後臺作業?

# kill   [%job_num]    \\ 此處的%號是不可以省略

# kill %1


******************

系統監控是系統管理員的日常工作之一,它可以分爲性能監控和故障監控。


系統性能監控

    系統性能主要關注CPU、內存、磁盤IO和網絡這4個方面。有關系統性能的幾個工具有 vmstat、mpstat、iostat、sar、top


性能分析準則

    要衡量一個系統性能狀態可以從系統的響應時間以及系統吞吐量兩個角度來進行分析。

  •  系統響應時間:能夠快速響應客戶端請求,即響應時間短。

  •  系統吞吐量:在指定時間內系統能完成的用戶或系統請求數,該值越大說明系統的吞吐量越大,處理能力也越高。


        一個計算機是由各種實現不同功能的軟硬件資源所組成,這些資源之間是相互聯繫的,任何一個地方出現問題都會影響整個系統性能,如水桶效應,水桶的水量取決於最短的那塊。


        系統管理員進行系統監控的主要目的在於就是找出系統的性能瓶頸所在,然後有針對性的進行調整,計算機組成很複雜,但關鍵主要對CPU、內存、磁盤IO和網絡這4個方面進行監控。


8、TOP命令

 TOP是一個非常優秀的交互式性能監控工具,可以在一個統一的界面中按照用戶指定的時間間隔刷新顯示內存、cpu、進程、用戶數據、運行時間等性能信息。


命令格式:

top -hv | -d  delay   -n   -u user  -p pid

常用選項說明

spacer.gif-p pid :只顯示指定pid進程信息

spacer.gif-u user:只顯示指定用戶的進程信息

spacer.gif-n :指定top命令在刷新n顯示後退出

spacer.gif-d delay:指定top命令刷新顯示的時間間隔(秒),默認爲3秒

spacer.gif-n #:指定顯示的次數

spacer.gif-b 以批次顯示TOP的刷新



to命令運行結果:




在top界面下,按數字1可以展開多個CPU核心

t不顯示CPU性能參數

l 不顯示負載那一行

m 不顯示內存那一行

q 退出top命令


k:kill 終止一個進程


s改變TOP刷新時間間隔,默認爲3秒

上面所示第一行顯示系統運行時間、用戶數以及負載的平均信息

top - 11:48:01 up 1 day, 10:24,  1 user,  load average: 0.00, 0.00, 0.00

當前系統時間爲”11:48:01“,至今運行了1天,10個小時24分;當前登錄用戶數爲1個;最近1分鐘、5分鐘、15分鐘的負載平均值分別爲 0.00, 0.00, 0.00

第二行顯示進程的概要信息:

Tasks: 120 total,   1 running, 119 sleeping,   0 stopped,   0 zombie

spacer.giftotal        系統當前的進程總數

spacer.gifrunning   系統正在運行的進程數

spacer.gifsleeping  系統正在休眠的進程數

spacer.gifstopped   系統中停止的進程數

spacer.gifzombie     系統中僵死的進程數


第三行是CPU的信息

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

spacer.gifus   表示用戶進程佔用cpu百分比

spacer.gifsy    表示系統進程佔用cpu百分比

spacer.gifni     表示改變過優先級的用戶進程佔用的cpu百分比

spacer.gifid     空閒cpu百分比

spacer.gifwa    等待IO所佔用的cpu百分比(數值太高意味着磁盤太慢了)

spacer.gifhi      硬件中斷佔用的cpu百分比

spacer.gifsi       輸件中斷佔用的cpu百分比

spacer.gifst     虛擬設備的cpu百分比


第四行物理內存信息

Mem:   1906492k total,  1403288k used,   503204k free,    89960k buffers

spacer.giftotal    物理內存總數

spacer.gifused    己經使用的物理內存

spacer.giffree      空閒的物理內存數

spacer.gifbufers    用作緩衝區的內存數

第四行是虛擬內存的信息

Swap:  4095996k total,     6824k used,  4089172k free,   480704k cached

spacer.giftotal          虛擬內存總數

spacer.gifused         己經使用的虛擬內存數

spacer.giffree          空閒的虛擬內存數

spacer.gifcached   用作緩存的虛擬內存數

第五其餘部份是進程信息

   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                2350 mysql     20   0  685m  37m 6532 S  0.3  2.0   0:47.68 mysqld

spacer.gifPID          進程ID

spacer.gifUSER       進程運行者

spacer.gifPR            優先級

spacer.gifNI            nice值,-20是最高級,19是最低級

spacer.gifVIRT        進程使用的虛擬內存大小

spacer.gifRES         進程使用的物理內存大小

spacer.gifSHR        共享內存大小

spacer.gifS              進程狀態

spacer.gif%CPU      進程佔用的CPU百分比

spacer.gif%MEM    進程使用的物理內存百分比

spacer.gifTIME+     進程使用的總的CPU時間比

spacer.gifCOMMAND    進程的名稱



9、vmstat 內存監控

    Linux系統內存分爲物理內存和虛擬內存兩種。物理內存是真實的,虛擬內存則是使用磁盤空間來補充物理內存,將暫時不使用的內存頁寫到硬盤上,當這些內存頁需要時使用將會從硬盤(虛擬內存)讀到內存中,在Linux系統中虛擬內存就是磁盤上的swap分區。


vmstat使用格示

vmstat [delay [counts]]

  delay   (每隔幾秒顯示一次)

  counts (只顯示幾次)

 -s:顯示內存統計數據


vmstat(Virtual Meomory Statistics,虛擬內存統計)是Linux系統監控內存的常用工具,可對操作系統的虛擬內存、進程和CPU等情況進行監控。

[root@lsof ~]# vmstatprocs -----------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 1346760  27768 367168    0    0    24    17   16   15  0  0 99  0  0	

 


procs(進程)

r           在運行隊列中等待的進程數

b          被阻塞的,在等待io的進程數


memory(內存)

swpd          己經在使用的交換內存(swap虛擬內存)

free             空閒(未使用)的物理內存

buff            用作緩衝區的內存數,通用與緩存寫操作相關

cache       用作高速緩存區的內存數,通常用來緩讀操作相關。


swap(交換頁面)

si  從磁盤到交換內存的交換頁數量(KB/S)

so 從內存交換到磁盤的的交換頁數據(KB/S)


IO(塊設備)

bi  (block in)從塊設備讀入的數據量,(塊/秒)

bo (block out)保存至塊設備中的數據量,(塊/秒)


system(系統)

in 每秒的中斷數,包括時間中斷

cs (context switch)每稱的上下文切換的次數


CPU(處理器)

us 用戶進程使用的CPU時間(%)

sy  系統進程使用的CPU時間(%)

id  CPU空閒時間

wa  等待IO所消耗的CPU時間(%)

st    從虛擬設備中獲得的時間(%)



        於內存監控只需要關心 swpd、free、buff、cache、si、so尤其需要關注free和si、so三個指數。當物理內存不能滿足需求時系統就會把內存中的交換數據交換到磁盤中,這時si、so的數據將會增加。


-------------------------- CPU監控 ----------------------------------


CPU性能主要關注3個指示:運行隊列CPU使用率、和上下文切換


1.運行隊列


        每個CPU都維護一個運行隊列,調度器會不斷的輪循讓隊列中的進程運行,直到進程運行完成後將其隊列刪除;如果CPU過載,調度器跟不上系統要求,則會導致運行隊列中等礴的進程越來越多;正常來說每個CPU的運行隊列不要超過3,雙核心的不要超過6以此類推。


2.CPU使用率


     CPU使用率一般可以分爲以下幾個部份

    用戶進程:運行用戶進程所點用的CPU時間的百分比

    系統進程:運行系統進程和中斷所點用的CPU時間百分比。

    等待IO:因爲IO等待而使CPU處於idle狀態的時間百分比

    空閒:CPU處於空閒狀態的時間百分比;

        如果CPU空閒率長期低於10%,那麼表示CPU資源己經非常緊張了,應該考慮進行優化或添加更多的CPU。而“等待IO”表示CPU等待IO資源而被迫處於空閒狀態,這個時候CPU沒有處於運算狀態,所以“等待IO”值越小越好


3.上下文切換


    通過CPU時間輪循的方法,Linux能夠支持多任務同時運行。每個進程會被分配CPU時間片來運行。當一個進程用完時間片或被更高優先級的進程搶佔時間塊後,它會被轉到CPU等待運行隊列中,同時讓其它進程在CPU上運行,這個進程切換的過程稱爲上下文切換。過多的上下文切換會造成系統很大的開銷。


procs(進程)

r           在運行隊列中等待的進程數

b          在等待io的進程數

system(系統)

in 每秒的中斷數,包括時間中斷

cs 每稱的上下文切換的次數...

CPU(處理器)

us 用戶進程使用的CPU時間(%)...

sy  系統進程使用的CPU時間(%)...

id  CPU空閒時間...

wa  等待IO所消耗的CPU時間(%)...

st    從虛擬設備中獲得的時間(%)


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st 0  1      0 609920  13892 216408    0    0  2468   568 1748 7937  5  5 66 24  0	 0  2      0 585756  13948 239764    0    0  1680    36 1584 6402  4  3 82 11  0	






補充資料:關於mmap

系統調用mmap()可以將某文件映射至內存(進程空間),如此可以把對文件的操作轉爲對內存的操作,以此避免更多的lseek()與read()、write()操作,這點對於大文件或者頻繁訪問的文件而言尤其受益。

1、 Linux採用了投機取巧的分配策略,用到時,才分配物理內存。也就是說進程調用brk()或mmap()時,只是佔用了虛擬地址空間,並沒有真正佔用物理內存。這也正是free –m中used並不意味着消耗的全都是物理內存。
2、 mmap()通過指定標誌(flag) MAP_ANONYMOUS來表明該映射是匿名內存映射,此時可以忽略fd,可將它設置爲-1。如果不支持MAP_ANONYMOUS標誌的類unix系統,可以映射至特殊設備文件/dev/zero實現匿名內存映射。
3、 調用mmap()時就決定了映射大小,不能再增加。換句話說,映射不能改變文件的大小。反過來,由文件被映射部分,而不是由文件大小來決定進程可訪問內存空間範圍(映射時,指定offset最好是內存頁面大小的整數倍)。
4、通常使用mmap()的三種情況.提高I/O效率、匿名內存映射、共享內存進程通信。


mmap將一個文件或者其它對象映射進內存。文件被映射到多個頁上,如果文件的大小不是所有頁的大小之和,最後一個頁不被使用的空間將會清零。

當使用mmap映射文件到進程後,就可以直接操作這段虛擬地址進行文件的讀寫等操作,不必再調用read,write等系統調用.但需注意,直接對該段內存寫時不會寫入超過當前文件大小的內容.


採用共享內存通信的一個顯而易見的好處是效率高,因爲進程可以直接讀寫內存,而不需要任何數據的拷貝。對於像管道和消息隊列等通信方式,則需要在內核和用戶空間進行四次的數據拷貝,而共享內存則只拷貝兩次數據:一次從輸入文件到共享內存區,另一次從共享內存區到輸出文件。



進程:

使用命令 pmap -x <pid> 可以查看進程的內存佔用信息; lsof -a -p <pid> 可以查看一個進程打開的文件信息。ps -Lf <pid> 可以查看進程的線程數。

另外procfs也是一個分析進程結構的好地方。procfs是一個虛擬的文件系統,它把系統中正在運行的進程都顯現在/proc/<pid>目錄下。



練習:寫一個腳本
1、提示用戶輸入一個nice值;
2、顯示以指定nice值運行的所有進程名及PID;
3、指示用戶選擇要修改其nice值的進程的PID和nice值
4、執行修改;
5、修改結束後不退出,提示用戶可以繼續修改其它進程的nice值;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章