進程的分類:
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
常用選項說明
-p pid :只顯示指定pid進程信息
-u user:只顯示指定用戶的進程信息
-n :指定top命令在刷新n顯示後退出
-d delay:指定top命令刷新顯示的時間間隔(秒),默認爲3秒
-n #:指定顯示的次數
-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
total 系統當前的進程總數
running 系統正在運行的進程數
sleeping 系統正在休眠的進程數
stopped 系統中停止的進程數
zombie 系統中僵死的進程數
第三行是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
us 表示用戶進程佔用cpu百分比
sy 表示系統進程佔用cpu百分比
ni 表示改變過優先級的用戶進程佔用的cpu百分比
id 空閒cpu百分比
wa 等待IO所佔用的cpu百分比(數值太高意味着磁盤太慢了)
hi 硬件中斷佔用的cpu百分比
si 輸件中斷佔用的cpu百分比
st 虛擬設備的cpu百分比
第四行物理內存信息
Mem: 1906492k total, 1403288k used, 503204k free, 89960k buffers
total 物理內存總數
used 己經使用的物理內存
free 空閒的物理內存數
bufers 用作緩衝區的內存數
第四行是虛擬內存的信息
Swap: 4095996k total, 6824k used, 4089172k free, 480704k cached
total 虛擬內存總數
used 己經使用的虛擬內存數
free 空閒的虛擬內存數
cached 用作緩存的虛擬內存數
第五其餘部份是進程信息
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
PID 進程ID
USER 進程運行者
PR 優先級
NI nice值,-20是最高級,19是最低級
VIRT 進程使用的虛擬內存大小
RES 進程使用的物理內存大小
SHR 共享內存大小
S 進程狀態
%CPU 進程佔用的CPU百分比
%MEM 進程使用的物理內存百分比
TIME+ 進程使用的總的CPU時間比
COMMAND 進程的名稱
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值;