Centos系統上下文切換的檢查思路
Centos系統上下文切換的檢查思路
1.什么是上(shang)下文切換(Context Switch)?
上(shang)下文切(qie)換,有(you)時也稱做進程切(qie)換或(huo)(huo)任務切(qie)換,是指CPU從一(yi)個進程或(huo)(huo)線(xian)程切(qie)換到另一(yi)個進程或(huo)(huo)線(xian)程。
操作系(xi)統可以同(tong)時運行多個進(jin)程, 然(ran)(ran)而一(yi)顆CPU同(tong)時只(zhi)能執(zhi)行一(yi)項任(ren)(ren)務(wu)(wu)(wu)(wu),操作系(xi)統利用時間(jian)片輪(lun)轉的(de)方式(shi),讓用戶感覺這些(xie)任(ren)(ren)務(wu)(wu)(wu)(wu)正在同(tong)時進(jin)行。 CPU給每個任(ren)(ren)務(wu)(wu)(wu)(wu)都服(fu)務(wu)(wu)(wu)(wu)一(yi)定的(de)時間(jian), 然(ran)(ran)后把當前任(ren)(ren)務(wu)(wu)(wu)(wu)的(de)狀(zhuang)態保存下(xia)來, 在加載下(xia)一(yi)任(ren)(ren)務(wu)(wu)(wu)(wu)的(de)狀(zhuang)態后, 繼續服(fu)務(wu)(wu)(wu)(wu)下(xia)一(yi)任(ren)(ren)務(wu)(wu)(wu)(wu)。任(ren)(ren)務(wu)(wu)(wu)(wu)的(de)狀(zhuang)態保存及(ji)再加載, 這段過程就叫做(zuo)上下(xia)文切換(huan)。
當(dang)(dang)一個(ge)進(jin)(jin)(jin)程(cheng)(cheng)在(zai)執(zhi)行(xing)(xing)時(shi)(shi),CPU的(de)(de)所(suo)有寄存(cun)器中(zhong)(zhong)(zhong)(zhong)的(de)(de)值、進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de)狀態(tai)以及堆棧中(zhong)(zhong)(zhong)(zhong)的(de)(de)內(nei)容被(bei)稱 為該進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de)上下(xia)文。當(dang)(dang)內(nei)核需(xu)要(yao)切(qie)換到(dao)另一個(ge)進(jin)(jin)(jin)程(cheng)(cheng)時(shi)(shi),它需(xu)要(yao)保(bao)存(cun)當(dang)(dang)前進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de) 所(suo)有狀態(tai),即(ji)保(bao)存(cun)當(dang)(dang)前進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de)上下(xia)文,以便在(zai)再(zai)次執(zhi)行(xing)(xing)該進(jin)(jin)(jin)程(cheng)(cheng)時(shi)(shi),能夠必得到(dao)切(qie)換時(shi)(shi)的(de)(de)狀態(tai)執(zhi)行(xing)(xing)下(xia)去。在(zai)LINUX中(zhong)(zhong)(zhong)(zhong),當(dang)(dang)前進(jin)(jin)(jin)程(cheng)(cheng)上下(xia)文均(jun)保(bao)存(cun)在(zai)進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de)任務(wu)(wu)(wu)數據結 構中(zhong)(zhong)(zhong)(zhong)。在(zai)發生中(zhong)(zhong)(zhong)(zhong)斷(duan)(duan)時(shi)(shi),內(nei)核就在(zai)被(bei)中(zhong)(zhong)(zhong)(zhong)斷(duan)(duan)進(jin)(jin)(jin)程(cheng)(cheng)的(de)(de)上下(xia)文中(zhong)(zhong)(zhong)(zhong),在(zai)內(nei)核態(tai)下(xia)執(zhi)行(xing)(xing)中(zhong)(zhong)(zhong)(zhong)斷(duan)(duan)服務(wu)(wu)(wu)例程(cheng)(cheng)。但同(tong)時(shi)(shi)會保(bao)留所(suo)有需(xu)要(yao)用到(dao)的(de)(de)資(zi)源(yuan),以便中(zhong)(zhong)(zhong)(zhong)繼(ji)服務(wu)(wu)(wu)結束時(shi)(shi)能恢(hui)復被(bei)中(zhong)(zhong)(zhong)(zhong)斷(duan)(duan)進(jin)(jin)(jin)程(cheng)(cheng) 的(de)(de)執(zhi)行(xing)(xing)。
2.上下文切換的消耗?
直(zhi)接消耗包括(kuo): CPU寄存器(qi)需(xu)要(yao)保存和加載,系(xi)統調度(du)器(qi)的(de)代(dai)碼需(xu)要(yao)執行,TLB實(shi)例需(xu)要(yao)重新加載,CPU 的(de)pipeline需(xu)要(yao)刷掉。
間接(jie)消(xiao)耗:多核的cache之間得共(gong)享(xiang)數據(ju)(ju),間接(jie)消(xiao)耗對于程序的影響要(yao)看(kan)線程工作區操作數據(ju)(ju)的大小。
上下文(wen)切(qie)換(huan)(huan)(huan)通(tong)常(chang)是(shi)計算密(mi)集型(xing)的(de)。也就是(shi)說,它需要相當可(ke)觀的(de)處理器(qi)時(shi)(shi)間,在每秒幾(ji)十(shi)上百次(ci)的(de)切(qie)換(huan)(huan)(huan)中(zhong)(zhong),每次(ci)切(qie)換(huan)(huan)(huan)都需要納秒量級的(de)時(shi)(shi)間。所以,上下文(wen)切(qie)換(huan)(huan)(huan)對系統來說意(yi)味(wei)著消耗(hao)(hao)大量的(de) CPU 時(shi)(shi)間,事實(shi)上,可(ke)能是(shi)操作系統中(zhong)(zhong)時(shi)(shi)間消耗(hao)(hao)最大的(de)操作。
3.如何檢查(cha)上下文切換是否頻繁?
(1)確認CPU使用率

CPU是否處于空(kong)閑(xian)狀態。
(2)vmstat 1

從vmstat的(de)輸出(chu)可以看(kan)到,io項的(de)block_in和block_out是否頻(pin)繁,system項的(de)每秒(miao)中(zhong)斷數(in)和每秒(miao)的(de)上下文(wen)切(qie)換(cs)是否頻(pin)繁。
(3)
pidstat -w 1

從pidstat上(shang)可以看(kan)到,每(mei)個(ge)進程對(dui)應(ying)的cswch(自(zi)愿(yuan)上(shang)下文切(qie)換)和nvcswch(非自(zi)愿(yuan)上(shang)下文切(qie)換)是否頻繁(fan)。
cswch/s: 每秒任(ren)(ren)務主動(dong)(自愿的)切換上(shang)下(xia)文的次數,當某(mou)一任(ren)(ren)務處于阻塞等待時,將主動(dong)讓出(chu)自己(ji)的CPU資源。
nvcswch/s: 每(mei)秒任務(wu)被(bei)動(不自愿的)切換上下文(wen)的次數,CPU分配給某一任務(wu)的時間片已經用(yong)完,因此將強迫該進程讓出CPU的執行權(quan)。
(4)/proc/stat
/proc/stat包(bao)含(han)了CPU的活動(dong)信息(xi),上下(xia)文切換就是其中一項,以ctxt開頭,它表示系(xi)統開機到目前為(wei)止(zhi)的上下(xia)文切換總數。
cat /proc/stat | grep ctxt && sleep 30 && cat /proc/stat | grep ctxt
通過上面的(de)命(ming)令,可以計(ji)算出每秒(miao)上下文切(qie)換(huan)次數(shu)=兩者差值/30
通過以(yi)上命(ming)令即可以(yi)定位那個(ge)進(jin)程上下文切換頻繁。
4.造成上下文切換頻(pin)繁的原因?
當前執行任務的時間片用(yong)完之后(hou), 系統(tong)CPU正常調度下一(yi)個(ge)任務
當前(qian)執(zhi)行任(ren)務碰(peng)到IO阻(zu)塞, 調(diao)度器將(jiang)掛(gua)起此任(ren)務, 繼續下一(yi)任(ren)務
多(duo)個任(ren)務搶(qiang)占鎖資源, 當前任(ren)務沒有搶(qiang)到,被調度器掛起, 繼續下一任(ren)務
用(yong)戶代(dai)碼掛起當前(qian)任務, 讓出CPU時(shi)間
硬件中斷

