04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
生活随笔
收集整理的這篇文章主要介紹了
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一節(jié),我給你講了 CPU 上下文切換的工作原理。簡(jiǎn)單回顧一下,CPU 上下文切換是保證 Linux 系統(tǒng)正常工作的一個(gè)核心功能,按照不同場(chǎng)景,可以分為進(jìn)程上下文切換、線程上下文切換和中斷上下文切換。具體的概念和區(qū)別,你也要在腦海中過(guò)一遍,忘了的話及時(shí)查看上一篇。今天我們就接著來(lái)看,究竟怎么分析 CPU 上下文切換的問(wèn)題。
怎么查看系統(tǒng)的上下文切換情況
通過(guò)前面學(xué)習(xí)我們知道,過(guò)多的上下文切換,會(huì)把 CPU 時(shí)間消耗在寄存器、內(nèi)核棧以及虛擬內(nèi)存等數(shù)據(jù)的保存和恢復(fù)上,縮短進(jìn)程真正運(yùn)行的時(shí)間,成了系統(tǒng)性能大幅下降的一個(gè)元兇。既然上下文切換對(duì)系統(tǒng)性能影響那么大,你肯定迫不及待想知道,到底要怎么查看上下文切換呢?在這里,我們可以使用 vmstat 這個(gè)工具,來(lái)查詢系統(tǒng)的上下文切換情況。vmstat 是一個(gè)常用的系統(tǒng)性能分析工具,主要用來(lái)分析系統(tǒng)的內(nèi)存使用情況,也常用來(lái)分析 CPU 上下文切換和中斷的次數(shù)。比如,下面就是一個(gè) vmstat 的使用示例:# 每隔 5 秒輸出 1 組數(shù)據(jù) $ vmstat 5 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0我們一起來(lái)看這個(gè)結(jié)果,你可以先試著自己解讀每列的含義。在這里,我重點(diǎn)強(qiáng)調(diào)下,需要特別關(guān)注的四列內(nèi)容:- cs(context switch)是每秒上下文切換的次數(shù)。
- in(interrupt)則是每秒中斷的次數(shù)。
- r(Running or Runnable)是就緒隊(duì)列的長(zhǎng)度,也就是正在運(yùn)行和等待 CPU 的進(jìn)程數(shù)。
- b(Blocked)則是處于不可中斷睡眠狀態(tài)的進(jìn)程數(shù)。
- 所謂自愿上下文切換,是指進(jìn)程無(wú)法獲取所需資源,導(dǎo)致的上下文切換。比如說(shuō), I/O、內(nèi)存等系統(tǒng)資源不足時(shí),就會(huì)發(fā)生自愿上下文切換。
- 而非自愿上下文切換,則是指進(jìn)程由于時(shí)間片已到等原因,被系統(tǒng)強(qiáng)制調(diào)度,進(jìn)而發(fā)生的上下文切換。比如說(shuō),大量進(jìn)程都在爭(zhēng)搶 CPU 時(shí),就容易發(fā)生非自愿上下文切換。
案例分析
知道了怎么查看這些指標(biāo),另一個(gè)問(wèn)題又來(lái)了,上下文切換頻率是多少次才算正常呢?別急著要答案,同樣的,我們先來(lái)看一個(gè)上下文切換的案例。通過(guò)案例實(shí)戰(zhàn)演練,你自己就可以分析并找出這個(gè)標(biāo)準(zhǔn)了。你的準(zhǔn)備
今天的案例,我們將使用 sysbench 來(lái)模擬系統(tǒng)多線程調(diào)度切換的情況。sysbench 是一個(gè)多線程的基準(zhǔn)測(cè)試工具,一般用來(lái)評(píng)估不同系統(tǒng)參數(shù)下的數(shù)據(jù)庫(kù)負(fù)載情況。當(dāng)然,在這次案例中,我們只把它當(dāng)成一個(gè)異常進(jìn)程來(lái)看,作用是模擬上下文切換過(guò)多的問(wèn)題。下面的案例基于 Ubuntu 18.04,當(dāng)然,其他的 Linux 系統(tǒng)同樣適用。我使用的案例環(huán)境如下所示:機(jī)器配置:2 CPU,8GB 內(nèi)存預(yù)先安裝 sysbench 和 sysstat 包,如 apt install sysbench sysstat正式操作開始前,你需要打開三個(gè)終端,登錄到同一臺(tái) Linux 機(jī)器中,并安裝好上面提到的兩個(gè)軟件包。包的安裝,可以先 Google 一下自行解決,如果仍然有問(wèn)題的,在留言區(qū)寫下你的情況。另外注意,下面所有命令,都默認(rèn)以 root 用戶運(yùn)行。所以,如果你是用普通用戶登陸的系統(tǒng),記住先運(yùn)行 sudo su root 命令切換到 root 用戶。安裝完成后,你可以先用 vmstat 看一下空閑系統(tǒng)的上下文切換次數(shù):# 間隔 1 秒后輸出 1 組數(shù)據(jù) $ vmstat 1 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st0 0 0 6984064 92668 830896 0 0 2 19 19 35 1 0 99 0 0這里你可以看到,現(xiàn)在的上下文切換次數(shù) cs 是 35,而中斷次數(shù) in 是 19,r 和 b 都是 0。因?yàn)檫@會(huì)兒我并沒(méi)有運(yùn)行其他任務(wù),所以它們就是空閑系統(tǒng)的上下文切換次數(shù)。操作和分析
接下來(lái),我們正式進(jìn)入實(shí)戰(zhàn)操作。首先,在第一個(gè)終端里運(yùn)行 sysbench ,模擬系統(tǒng)多線程調(diào)度的瓶頸:# 以 10 個(gè)線程運(yùn)行 5 分鐘的基準(zhǔn)測(cè)試,模擬多線程切換的問(wèn)題 $ sysbench --threads=10 --max-time=300 threads run 接著,在第二個(gè)終端運(yùn)行 vmstat ,觀察上下文切換情況:# 每隔 1 秒輸出 1 組數(shù)據(jù)(需要 Ctrl+C 才結(jié)束) $ vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st6 0 0 6487428 118240 1292772 0 0 0 0 9019 1398830 16 84 0 0 08 0 0 6487428 118240 1292772 0 0 0 0 10191 1392312 16 84 0 0 0你應(yīng)該可以發(fā)現(xiàn),cs 列的上下文切換次數(shù)從之前的 35 驟然上升到了 139 萬(wàn)。同時(shí),注意觀察其他幾個(gè)指標(biāo):- r 列:就緒隊(duì)列的長(zhǎng)度已經(jīng)到了 8,遠(yuǎn)遠(yuǎn)超過(guò)了系統(tǒng) CPU 的個(gè)數(shù) 2,所以肯定會(huì)有大量的 CPU 競(jìng)爭(zhēng)。
- us(user)和 sy(system)列:這兩列的 CPU 使用率加起來(lái)上升到了 100%,其中系統(tǒng) CPU 使用率,也就是 sy 列高達(dá) 84%,說(shuō)明 CPU 主要是被內(nèi)核占用了。
- in 列:中斷次數(shù)也上升到了 1 萬(wàn)左右,說(shuō)明中斷處理也是個(gè)潛在的問(wèn)題。
- 自愿上下文切換變多了,說(shuō)明進(jìn)程都在等待資源,有可能發(fā)生了 I/O 等其他問(wèn)題;
- 非自愿上下文切換變多了,說(shuō)明進(jìn)程都在被強(qiáng)制調(diào)度,也就是都在爭(zhēng)搶 CPU,說(shuō)明 CPU 的確成了瓶頸;
- 中斷次數(shù)變多了,說(shuō)明 CPU 被中斷處理程序占用,還需要通過(guò)查看 /proc/interrupts 文件來(lái)分析具體的中斷類型。
小結(jié)
今天,我通過(guò)一個(gè) sysbench 的案例,給你講了上下文切換問(wèn)題的分析思路。碰到上下文切換次數(shù)過(guò)多的問(wèn)題時(shí),我們可以借助 vmstat 、 pidstat 和 /proc/interrupts 等工具,來(lái)輔助排查性能問(wèn)題的根源。思考
最后,我想請(qǐng)你一起來(lái)聊聊,你之前是怎么分析和排查上下文切換問(wèn)題的。你可以結(jié)合這兩節(jié)的內(nèi)容和你自己的實(shí)際操作,來(lái)總結(jié)自己的思路。歡迎在留言區(qū)和我討論,也歡迎把這篇文章分享給你的同事、朋友。我們一起在實(shí)戰(zhàn)中演練,在交流中學(xué)習(xí)。 與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 03 | 基础篇:经常说的 CPU 上下
- 下一篇: 06 | 案例篇:系统的 CPU 使用率