Centos系統(tǒng)上下文切換的檢查思路
1.什么是上下文切換(Context Switch)?
上下文切換,有時(shí)也稱做進(jìn)程切換或任務(wù)切換,是指CPU從一個(gè)進(jìn)程或線程切換到另一個(gè)進(jìn)程或線程。
操作系統(tǒng)可以同時(shí)運(yùn)行多個(gè)進(jìn)程, 然而一顆CPU同時(shí)只能執(zhí)行一項(xiàng)任務(wù),操作系統(tǒng)利用時(shí)間片輪轉(zhuǎn)的方式,讓用戶感覺(jué)這些任務(wù)正在同時(shí)進(jìn)行。 CPU給每個(gè)任務(wù)都服務(wù)一定的時(shí)間, 然后把當(dāng)前任務(wù)的狀態(tài)保存下來(lái), 在加載下一任務(wù)的狀態(tài)后, 繼續(xù)服務(wù)下一任務(wù)。任務(wù)的狀態(tài)保存及再加載, 這段過(guò)程就叫做上下文切換。
當(dāng)一個(gè)進(jìn)程在執(zhí)行時(shí),CPU的所有寄存器中的值、進(jìn)程的狀態(tài)以及堆棧中的內(nèi)容被稱 為該進(jìn)程的上下文。當(dāng)內(nèi)核需要切換到另一個(gè)進(jìn)程時(shí),它需要保存當(dāng)前進(jìn)程的 所有狀態(tài),即保存當(dāng)前進(jìn)程的上下文,以便在再次執(zhí)行該進(jìn)程時(shí),能夠必得到切換時(shí)的狀態(tài)執(zhí)行下去。在LINUX中,當(dāng)前進(jìn)程上下文均保存在進(jìn)程的任務(wù)數(shù)據(jù)結(jié) 構(gòu)中。在發(fā)生中斷時(shí),內(nèi)核就在被中斷進(jìn)程的上下文中,在內(nèi)核態(tài)下執(zhí)行中斷服務(wù)例程。但同時(shí)會(huì)保留所有需要用到的資源,以便中繼服務(wù)結(jié)束時(shí)能恢復(fù)被中斷進(jìn)程 的執(zhí)行。
2.上下文切換的消耗?
直接消耗包括: CPU寄存器需要保存和加載,系統(tǒng)調(diào)度器的代碼需要執(zhí)行,TLB實(shí)例需要重新加載,CPU 的pipeline需要刷掉。
間接消耗:多核的cache之間得共享數(shù)據(jù),間接消耗對(duì)于程序的影響要看線程工作區(qū)操作數(shù)據(jù)的大小。
上下文切換通常是計(jì)算密集型的。也就是說(shuō),它需要相當(dāng)可觀的處理器時(shí)間,在每秒幾十上百次的切換中,每次切換都需要納秒量級(jí)的時(shí)間。所以,上下文切換對(duì)系統(tǒng)來(lái)說(shuō)意味著消耗大量的 CPU 時(shí)間,事實(shí)上,可能是操作系統(tǒng)中時(shí)間消耗最大的操作。
3.如何檢查上下文切換是否頻繁?
(1)確認(rèn)CPU使用率
CPU是否處于空閑狀態(tài)。
(2)vmstat 1
從vmstat的輸出可以看到,io項(xiàng)的block_in和block_out是否頻繁,system項(xiàng)的每秒中斷數(shù)(in)和每秒的上下文切換(cs)是否頻繁。
(3)pidstat -w 1
從pidstat上可以看到,每個(gè)進(jìn)程對(duì)應(yīng)的cswch(自愿上下文切換)和nvcswch(非自愿上下文切換)是否頻繁。
cswch/s: 每秒任務(wù)主動(dòng)(自愿的)切換上下文的次數(shù),當(dāng)某一任務(wù)處于阻塞等待時(shí),將主動(dòng)讓出自己的CPU資源。
nvcswch/s: 每秒任務(wù)被動(dòng)(不自愿的)切換上下文的次數(shù),CPU分配給某一任務(wù)的時(shí)間片已經(jīng)用完,因此將強(qiáng)迫該進(jìn)程讓出CPU的執(zhí)行權(quán)。
(4)/proc/stat
/proc/stat包含了CPU的活動(dòng)信息,上下文切換就是其中一項(xiàng),以ctxt開頭,它表示系統(tǒng)開機(jī)到目前為止的上下文切換總數(shù)。
cat /proc/stat | grep ctxt && sleep 30 && cat /proc/stat | grep ctxt
通過(guò)上面的命令,可以計(jì)算出每秒上下文切換次數(shù)=兩者差值/30
通過(guò)以上命令即可以定位那個(gè)進(jìn)程上下文切換頻繁。
4.造成上下文切換頻繁的原因?
當(dāng)前執(zhí)行任務(wù)的時(shí)間片用完之后, 系統(tǒng)CPU正常調(diào)度下一個(gè)任務(wù)
當(dāng)前執(zhí)行任務(wù)碰到IO阻塞, 調(diào)度器將掛起此任務(wù), 繼續(xù)下一任務(wù)
多個(gè)任務(wù)搶占鎖資源, 當(dāng)前任務(wù)沒(méi)有搶到,被調(diào)度器掛起, 繼續(xù)下一任務(wù)
用戶代碼掛起當(dāng)前任務(wù), 讓出CPU時(shí)間
硬件中斷
版權(quán)保護(hù): 本文「Centos系統(tǒng)上下文切換的檢查思路」由 云主機(jī)配置專家 原創(chuàng),轉(zhuǎn)載請(qǐng)保留鏈接: http://www.iqcg.cn/docs/system/883.html