官术网_书友最值得收藏!

2.3 進程、線程

AIX操作系統(tǒng)屬于多任務(wù)系統(tǒng),允許同時執(zhí)行多個程序。那么程序和進程、線程有什么關(guān)系?

2.3.1 進程、線程、優(yōu)先級概念

系統(tǒng)中執(zhí)行的程序被稱為進程。為了提高運行效率,進程可以被拆分成多個線程執(zhí)行(需要程序本身支持,采用多線程編寫方式編寫),每個CPU在同一時刻,只能執(zhí)行一個線程,一個線程執(zhí)行完畢退出(或者自己主動進入睡眠狀態(tài))、線程等待其他外設(shè)(IO操作)、有更高優(yōu)先級的中斷發(fā)生(在vmstat命令輸出中表現(xiàn)為一次in,即一次Interrupt)、或者達(dá)到了此線程最大允許運行時間,操作系統(tǒng)就會強制進行線程切換(在vmstat命令輸出中表現(xiàn)為一次cs,即一次Content Switch),讓CPU去執(zhí)行另一個線程。

在AIX操作系統(tǒng)中,所有等待執(zhí)行的線程都放在運行隊列里面,每隔10 ms,操作系統(tǒng)重新計算線程的優(yōu)先級(也就是每隔10ms,線程的執(zhí)行順序會重新排列),CPU優(yōu)先執(zhí)行隊列前面的幾個線程(每個CPU執(zhí)行一個線程,n個CPU的系統(tǒng)則可以同時執(zhí)行隊列前n個線程)。如果CPU正在執(zhí)行一個線程,此線程的優(yōu)先級在計算時就會被降低(當(dāng)使用默認(rèn)的調(diào)度模式時),因此如果一個線程長時間占據(jù)CPU,它的優(yōu)先級會越來越低。如果下一次優(yōu)先級計算的時候,另一個線程的優(yōu)先級高于此線程,則CPU就會將此線程“踢”到等待隊列里面(執(zhí)行隊列中靠后的位置),而去執(zhí)行另一個更高優(yōu)先級(執(zhí)行隊列中靠前的位置)的線程。線程本身也會由于IO、任務(wù)執(zhí)行結(jié)束休眠等原因,自己降低執(zhí)行優(yōu)先級,而進入等待隊列。

一個4 CPU的系統(tǒng)可以用這樣的情況來比喻:這是一個有人監(jiān)督管理的排隊隊列,有4個窗口在進行處理,每個窗口有2個工作人員,一個審核,一個蓋章(這就是4個CPU開啟了SMT的情況)。這樣這個系統(tǒng)可以同時讓8個人到窗口(相當(dāng)于8個線程),但是由于窗口只有4個,所以前4個人能夠遞交審核,另外4個需要稍等片刻。審核的時間有長有短,以第一窗口為例,審核結(jié)束,交給蓋章的人處理,這是第二個人就可以遞交自己的文件等待審核,而第一個人要等待文件蓋章,任務(wù)還沒有執(zhí)行完。這就是SMT啟動的情況:有時可以并行兩條指令,有時則不行。

可能第二個人審核的時候,發(fā)現(xiàn)材料不全,要求他再準(zhǔn)備(這就是等待IO),這個人就只好排到隊列后面,慢慢找材料(進行IO處理),系統(tǒng)又可以分派一個人到第一窗口。此時第一窗口蓋章工作結(jié)束,第一個人拿著完整材料退出(相當(dāng)于執(zhí)行完操作),又有一個新人被指派到第一窗口。也就是永遠(yuǎn)都有兩個人在一個窗口(一個CPU),這就是SMT的功能。

我們再來看那個準(zhǔn)備材料的人,假如他已經(jīng)準(zhǔn)備好,此時就可以向管理隊列的人申請“加塞兒”(提高優(yōu)先級),管理人員看到他是由于準(zhǔn)備材料而離開,則允許插隊,從隊列的后面插到隊列前面,那么下一個空閑窗口處理的人就可能是他。

要是此時又進來一個人,拿著領(lǐng)導(dǎo)批條(也就是更高優(yōu)先級的中斷產(chǎn)生了),管理人員不敢怠慢,甚至讓當(dāng)前正在處理的一個窗口停下來,先把他攆回隊列(在隊列中的位置根據(jù)已經(jīng)處理的時間長短決定,如果已經(jīng)處理了很長時間,則排在隊列靠后,否則靠前),讓這個優(yōu)先級高的人先處理。

實際情況與以上排隊情況類似如圖2-7所示,優(yōu)先級總計128級,0為最高級,127為最低級,雖然是一個大隊列,但是在每個級別可能有多個等待線程,當(dāng)輪到此優(yōu)先級線程執(zhí)行的時候,具有相同優(yōu)先級的線程按一定順序關(guān)系(線程調(diào)度規(guī)則)先后執(zhí)行。

優(yōu)先級少于40(優(yōu)先級較高,數(shù)值越低優(yōu)先級越高)的線程為系統(tǒng)內(nèi)核線程。每個普通線程的默認(rèn)優(yōu)先級是60,通過nice命令可以增加或者減少優(yōu)先級,上下幅度為20,這樣一個普通程序的優(yōu)先級可以在40~80之間的變化范圍。除了nice之外,還有一些數(shù)值是由占用CPU時間片產(chǎn)生的所謂CPU懲罰值確定的,占用CPU時間片越長,優(yōu)先級越低。

圖2-7 AIX線程調(diào)度中的128級優(yōu)先級和等待隊列

問題:是否系統(tǒng)CPU越多,程序執(zhí)行越快?

答案:不一定。由于CPU最小執(zhí)行單位是線程,因此即使某個程序負(fù)載很大,需要消耗大量CPU計算能力,但是如果此程序不能拆分成更多的線程,則盡管有很多CPU,也只能閑置。不過通常系統(tǒng)不止一個程序在執(zhí)行,有很多操作系統(tǒng)的調(diào)度程序、設(shè)備驅(qū)動程序,都需要CPU執(zhí)行,因此一般情況下,增加CPU數(shù)量會讓分配給這個單線程程序的CPU時間片不會被別的任務(wù)搶占,從而間接提高程序的計算速度。不過由于只是輔助作用,更多的CPU對程序執(zhí)行速度提升的效果會越來越不明顯。

操作系統(tǒng)有幾種調(diào)度模式和參數(shù)控制線程優(yōu)先級,在默認(rèn)模式下,通過修改這些參數(shù)(使用schedutune命令),能夠?qū)PU執(zhí)行線程情況產(chǎn)生很多影響:

(1)加快線程切換速度,對OLTP(OnLine Transaction Process在線交易,例如銀行窗口,需要交互輸入輸出)一類業(yè)務(wù)有好處,可以讓交易更快地得到響應(yīng)。方法是通過參數(shù)加快占據(jù)CPU資源的線程的優(yōu)先級衰減,盡快進行進程切換。

(2)延長每個線程執(zhí)行時間,有益于計算性業(yè)務(wù)(大量查詢、報表、統(tǒng)計、科學(xué)計算)。由于每次切換都有不必要的操作系統(tǒng)處理,讓每個線程執(zhí)行時間最長可以更快速完成線程的工作。

(3)將某個進程(及其線程)與某個CPU綁定,防止此進程的過渡耗費系統(tǒng)CPU資源,將其占用量限制在某(幾)個CPU。

而AIX系統(tǒng)有更多的預(yù)先定義的進程調(diào)度規(guī)則,影響具有相同優(yōu)先級的進程(隊列):

(1)SCHED_FIFO,先進先出模式。如果設(shè)定此種規(guī)則,則線程會持續(xù)執(zhí)行,直到自動退出、被終止或者更高優(yōu)先級的線程需要執(zhí)行。只有固定優(yōu)先級線程才可以使用此方式。

(2)SCHED_RR,循環(huán)模式。如果某個線程用完CPU時間片,將被扔到隊列中的最后排隊。也是只有固定優(yōu)先級的線程才能使用這種規(guī)則。

(3)SCHED_OTHER,這種策略在POSIX標(biāo)準(zhǔn)1003.4a中定義,每個時間片后都重新計算線程優(yōu)先級。

(4)SCHED_FIFO2,與SCHED_FIFO相同,除了一點:只允許某個線程處于隊列首位一定的時間,而不允許無限期執(zhí)行它。此策略的意思是盡力保證執(zhí)行此線程,但到了一定時間還是禁止它永遠(yuǎn)占據(jù)CPU。這個時間可以用schedtune –a參數(shù)控制。

(5)SCHED_FIFO3,屬于SCHED_FIFO3策略的線程永遠(yuǎn)占據(jù)執(zhí)行隊列首位(在同一優(yōu)先級隊列中),為了防止屬于SCHED_FIFO2規(guī)則的線程占據(jù)在屬于SCHED_FIFO3規(guī)則線程之前,一旦一個SCHED_FIFO3線程進入隊列,隊列規(guī)則參數(shù)即被修改,以阻止SCHED_FIFO2規(guī)則對此優(yōu)先級隊列起作用。也就是說,F(xiàn)IFO3的線程會屏蔽屬于同一優(yōu)先級的FIFO2線程。

(6)SCHED_FIFO4,SCHED_FIFO4規(guī)則使即使有高優(yōu)先級線程進入隊列,如果低優(yōu)先級線程只比它低一個等級(優(yōu)先級數(shù)字多1),那么低優(yōu)先級線程仍將繼續(xù)占據(jù)此CPU。

控制命令(AIX 5.2以前版本,注意,數(shù)字越小,優(yōu)先級越高):

        #/usr/samples/kernel/schedtune      → 控制CPU線程調(diào)度參數(shù)
        -t                                      → 修改時間片大小
        -r -d                                   → 配合使用修改線程優(yōu)先級衰減控制

比較小的r使得線程優(yōu)先級計算變化范圍縮減,nice對程序的優(yōu)先級控制更加明顯;

比較大的r則相反,線程優(yōu)先級計算變化跨度加大,nice作用更為不明顯;

比較小的d增大了CPU懲罰值,加速線程切換;

比較大的d減少了CPU占用懲罰,降低線程切換。

        -D                             → 將所有的schedtune參數(shù)都恢復(fù)為默認(rèn)值;
        #vmo                           → AIX 5.2以后提供的新命令,類似vmtune
        #schedo                        → AIX 5.2以后提供的新命令,類似schedtune
        #bindprocessor -q            → 查看可用的CPU
        #bindprocessor 13039 3      → 將進程13039綁定到第3號CPU(不可以用其他的CPU)
        #bindprocessor -u 13039     → 解除對13039的綁定
        #nice -5 vmstat 10 3         → 設(shè)定vmstat進程的優(yōu)先級(降低5,從60降低到65)
        #nice --5 vmstat 10 3       → 設(shè)定優(yōu)先級,提高5,從60提高到55)
        #renice -5 7569              → 重新調(diào)整進程7569的優(yōu)先級(在原來基礎(chǔ)之上提高5)

對于CPU的使用情況,可以通過vmstat命令查看:

        #vmstat 1 5     →每個一秒顯示一次,共顯示10次系統(tǒng)狀況。
        System Configuration: lcpu=16 mem=31488MB
        kthr      memory              page                faults              cpu
        -----  -----------   ------------------------  ------------    -----------
          r  b    avm   fre     re  pi  po  fr   sr  cy  in     sy   cs   us sy id wa
          4  2 3127273  3272   0   4   8  338  937  0  2357 22962 1561  13  1 83  3
          5  3 3127257  1556   0   4   0    0     0  0  2890 15790 2165  20  0 59 21
          2  4 3127903   958   0   7   4 1014 1673  0  2353  7290 1670  17  1 53 29
          3  3 3127948   966   0  23  12 1392 2693  0  2620  7943 1779  18  1 62 19
          3  3 3128040   968   0  43   7 1524 3643  0  2898 16537 2938  22  1 62 15

其中各項含義如下。

r:當(dāng)前在隊列中等待執(zhí)行的線程數(shù),如果這個數(shù)值經(jīng)常非常大(例如達(dá)到2~5倍以上的CPU數(shù)),就說明系統(tǒng)中等待執(zhí)行的線程比較多,可能存在性能問題。注意,對于大型應(yīng)用系統(tǒng),需要執(zhí)行的線程非常多,所以等待隊列中經(jīng)常有個位數(shù)的數(shù)字是很正常的情況,并不是說只有等待隊列永遠(yuǎn)是0,才說明系統(tǒng)的CPU滿足了要求。

b:當(dāng)前隊列中處于等待狀態(tài)的線程,由于IO(存儲、網(wǎng)絡(luò))操作未完成,無法繼續(xù)執(zhí)行,必須掛起,此時CPU可以切換到另外一個線程操作。顯然,如果有很多(大于2~5倍CPU數(shù))線程處于b狀態(tài),系統(tǒng)就可能有IO瓶頸。

avm:Active Memory,而不是available memory!這是經(jīng)常被理解錯誤的一項,它等于當(dāng)前使用的物理內(nèi)存和使用的交換區(qū)的總和減去作為文件系統(tǒng)緩存的物理內(nèi)存,單位為4KB,即一個內(nèi)存頁。

fre:空閑的物理內(nèi)存,單位為4KB。

pi:在vmstat兩次檢查間隔期間,系統(tǒng)將磁盤交換區(qū)讀回物理內(nèi)存頁的數(shù)量。通常多是內(nèi)存不夠的表現(xiàn)。

po:在vmstat兩次檢查間隔期間,系統(tǒng)將物理內(nèi)存頁交換到磁盤的數(shù)量。越多代表系統(tǒng)內(nèi)存越緊張,但偶爾出現(xiàn)的pi, po并不能說明任何問題,而且通常系統(tǒng)大量文件操作(例如文件系統(tǒng)備份/恢復(fù),tar操作等),往往伴隨著大量的pi, po,這都是正常現(xiàn)象。

re:pi/po,數(shù)值長期趨近于1,并且pi, po都很大,說明系統(tǒng)可能有thrash(抖動)的現(xiàn)象,即剛交換出去的內(nèi)存馬上又需要使用,必須交換回來,物理內(nèi)存可能嚴(yán)重不足。

fr:代表在此段時間內(nèi),有多少不使用的物理內(nèi)存被釋放,可能是內(nèi)存頁被程序釋放,也可能是已經(jīng)將其內(nèi)存交換到了磁盤。

sr:代表在此段時間內(nèi),由于有內(nèi)存使用申請,而物理內(nèi)存空閑不足,進行少內(nèi)存頁搜索的頁數(shù)。此數(shù)值越大,代表內(nèi)存申請越多,也就是內(nèi)存需要量比較大。

cy:進行內(nèi)存搜索、清理消耗的時鐘周期,此數(shù)值越大,說明內(nèi)存越緊張,操作系統(tǒng)用了過多的時間進行內(nèi)存清理。當(dāng)然,也有可能系統(tǒng)內(nèi)的程序調(diào)度(起/停)過于頻繁。無論如何,cy多大都說明當(dāng)前內(nèi)存使用、管理方面需要仔細(xì)分析。

in:中斷次數(shù),在此段時間內(nèi)由各種不同原因產(chǎn)生的中斷次數(shù),中斷的原因可能是CPU處理時間片到期、設(shè)備IO產(chǎn)生中斷等。vmstat –i可以查看更詳細(xì)的關(guān)于中斷的信息

cs:上下文切換,對于一個CPU,當(dāng)正在執(zhí)行的線程與即將執(zhí)行的線程不是同一個的時候,就會產(chǎn)生一個cs(Content Switch)。有三種情況會導(dǎo)致cs:當(dāng)前線程等待資源(磁盤/網(wǎng)絡(luò)IO完成),線程自己要求sleep或等待資源解鎖;更高優(yōu)先等級線程要求CPU;此線程用盡了10ms時間片。由于自然情況下,每CPU可以產(chǎn)生100次線程切換(10ms一次),所以cs次數(shù)除以vmstat的間隔時間,再除以CPU個數(shù)可以用來判斷系統(tǒng)繁忙的指標(biāo)之一,這個數(shù)字如果遠(yuǎn)遠(yuǎn)高于100(通常是10~20倍以內(nèi)的比例,即每個CPU對應(yīng)1000~2000次cs都算正常),則可能有CPU瓶頸。對于最新的P5系列CPU,由于支持SMT,一個物理CPU同時支持2個線程,則可以考慮再除2或1.5,以進行合理的判斷。

sy:(在faults區(qū)的sy)此時間段內(nèi)系統(tǒng)調(diào)用次數(shù),用戶程序執(zhí)行過程中發(fā)出系統(tǒng)執(zhí)行調(diào)用申請,以便普通用戶請求核心操作,例如進行磁盤IO等操作。

us:系統(tǒng)中用戶操作所占CPU時間百分比。

sy:(在cpu區(qū)的sy)系統(tǒng)中系統(tǒng)調(diào)用所占CPU時間百分比。

id:系統(tǒng)中CPU的空閑時間百分比。

wa:系統(tǒng)等待磁盤IO所占時間百分比(此時CPU閑置)。

問題:是否wa很高的時候一定有IO瓶頸?

答案:wa很高的時候不代表一定有IO問題(盡管通常如此),反之wa很低也不代表沒有IO問題。因為最后這4個參數(shù)只是一個比例關(guān)系,例如如果系統(tǒng)IO性能很差,但同時CPU異常繁忙,則看到的wa并不很高。同樣的IO負(fù)荷,如果換到比較快的CPU的機器上,wio就會增加(因為相對于CPU處理時間,IO占用時間的比例更大了)。

在進行了CPU共享(需要POWER 5并購買微分區(qū)功能才支持)的機器上,還有另外兩項,pc和ec,pc代表實際分配給此分區(qū)的CPU數(shù)量(可能是小數(shù),以1%為單位),而ec代表授權(quán)此分區(qū)使用CPU的數(shù)量與實際使用的比例(超出100時說明當(dāng)前分區(qū)臨時使用了超過了指派給它的CPU資源)。

2.3.2 查看系統(tǒng)進程情況

下面的命令可以看到系統(tǒng)全部進程情況:

        #ps -ef

如果想看到各個進程占用CPU情況,可以用下面的命令:

        #ps aux

以下命令查看用戶guest的進程CPU使用:

        #ps -lu guest
          F     S UID   PID PPID   C PRI NI ADDR    SZ    WCHAN    TTY  TIME CMD
        241801 S 200 7032 7286   0  60 20 1b4c   108            pts/2  0:00 ksh
        200801 S 200 7568 7032   0  70 25 2310    88  5910a58  pts/2  0:00 vmstat
        241801 S 200 8544 6494   0  60 20 154b   108             pts/0  0:00 ksh

其中,

PRI:進程/線程優(yōu)先級。

NI:nice的設(shè)定值。

SZ等參數(shù)和進程使用的內(nèi)存有關(guān),在本書下一章節(jié)有詳細(xì)介紹。

下面的命令可以看到系統(tǒng)全部線程情況:

        #ps -kef

2.3.3 zombie(僵尸進程)

如果由于程序的原因,某個子程序的父進程一直沒有收到子程序的SIGCHLD信號,即使這個子程序已經(jīng)釋放了所有資源(已經(jīng)退出),但仍然占據(jù)著進程表中一個位置,這種程序被叫做:Zombie(僵尸進程),ps –ef結(jié)果中顯示的程序名是<defunct>。

        $ps -ef
        ....F  S UID PID PPID    C PRI NI ADDR SZ  TTY TIME CMD
        200003 A 0     1      0    0 60  20 500a 704    - 0:03 init
        240401 A 0  2502     1    0 60  20 d2da 40     - 0:00 uprintfd
        240001 A 0  2622 2874    0 60  20 2965 5208   - 0:46 X
        40001  A 0  2874     1    0 60  20 c959 384    - 0:00 dtlogin
        50005  Z 0  3776     1    1 68  24 0:00 <defunct>
        40401  A 0  3890     1    0 60  20 91d2 480    - 0:00 errdemon
        240001 A 0  4152     1    0 60  20 39c7 88     - 0:21 syncd
        240001 A 0  4420 4648    0 60  20 4b29 220    - 0:00 writesrv
        240001 A 0  4648     1    0 60  20 b1d6 308    - 0:00 srcmstr
        50005  Z 0 10072     1    0 68  24 0:00 <defunct>
        50005  Z 0 10454     1    0 68  24 0:00 <defunct>

只查看僵尸進程用如下命令:

        #ps as <defunct>

如圖2-8所示,進程由fork()函數(shù)啟動,在Idle狀態(tài)等待分配CPU資源,直到進入CPU執(zhí)行隊列而被激活;如果進程收到Stop信號,就被置于后臺等待狀態(tài),而通過激活可以重新進入執(zhí)行隊列;進程執(zhí)行一段時間之后會被交換出去在隊列中排隊,等待重新獲得CPU;當(dāng)程序退出時,會暫時處于Zombie狀態(tài),但正常情況下,很快就會徹底退出,如果不能完成退出動作,進程就變成了僵尸進程,永遠(yuǎn)存在于系統(tǒng)進程表中,直到系統(tǒng)重新啟動。通常僵尸進程除了占用進程號之外,不會消耗其他的系統(tǒng)資源,例如CPU,內(nèi)存,但并不能一定保證如此,因此如果系統(tǒng)中有很多僵尸進程,建議重新啟動計算機以清除。

圖2-8 進程狀態(tài)、關(guān)系圖

2.3.4 進程定時執(zhí)行控制

另一種對于進程的控制是定時啟動。cron守護進程可以用來定時啟動進程,該進程的控制文件是crontab文件,存放于/var/spool/cron/目錄中,以用戶名為文件名,如root用戶的crontab文件就是/var/spool/cron/root。AIX支持AT&T風(fēng)格crontab文件,每條包含下列格式:

        mm  hh  dd  mm  ww  command

mm:分鐘(0~59)

hh:小時(0~23)

dd:日期(1~31)

mm:月(1~12)

ww:星期的日子(0~6,從星期六到星期天)

command:需要執(zhí)行的shell命令

如果希望多次執(zhí)行,可以連續(xù)寫多個分鐘、小時、日期,中間用逗號隔開(注意無空格),如果此時間沒有要求,則添加星號填充空位。

crontab –e可以編輯自己的crontab,使用何種編輯器取決于EDITOR變量值。從編輯環(huán)境保存并且退出后,crontab文件即時生效。使用crontab –l可以顯示crontab的內(nèi)容。

由于crontab的執(zhí)行是由root用戶進程調(diào)用的,因此執(zhí)行的環(huán)境變量也是root用戶的,建議在crontab執(zhí)行的腳本中把相關(guān)的環(huán)境變量設(shè)置好,以防止執(zhí)行時出現(xiàn)環(huán)境變量不匹配的問題。

crontab執(zhí)行過程中,如果出現(xiàn)錯誤,將會向所有這賬戶發(fā)送郵件,該用戶登錄系統(tǒng)的時候會有You have new mail提示,可以用mail命令查看(子命令h查看標(biāo)題,d刪除)。

主站蜘蛛池模板: 蒙自县| 庄浪县| 桂东县| 鸡泽县| 龙海市| 崇州市| 桐梓县| 错那县| 富川| 景洪市| 济阳县| 雷山县| 文安县| 秀山| 寿阳县| 伊金霍洛旗| 东平县| 滦平县| 卓尼县| 和田市| 黄平县| 建湖县| 蓬溪县| 北安市| 贺兰县| 阳东县| 洞头县| 黔东| 留坝县| 哈尔滨市| 本溪| 临泽县| 扬中市| 江门市| 开原市| 云南省| 潞城市| 邓州市| 乌恰县| 潜山县| 惠州市|