<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux CPU 上下文切換的故障排查

          共 3765字,需瀏覽 8分鐘

           ·

          2022-04-25 00:05


          在我的上一篇文章:《探討 Linux CPU 的上下文切換》中,我談到了 CPU 上下文切換的工作原理。快速回顧一下,CPU 上下文切換是保證 Linux 系統(tǒng)正常運(yùn)行的核心功能。可分為進(jìn)程上下文切換線程上下文切換中斷上下文切換

          在本文中,我將進(jìn)一步討論如何分析 CPU 上下文切換問(wèn)題。

          檢查 CPU 的上下文切換

          我們知道,過(guò)多的上下文切換會(huì)消耗 CPU 的時(shí)間來(lái)保存和恢復(fù)寄存器、程序計(jì)數(shù)器、內(nèi)核棧和虛擬內(nèi)存等數(shù)據(jù),從而導(dǎo)致系統(tǒng)性能顯著下降。

          既然上下文切換對(duì)系統(tǒng)性能的影響如此之大,那么我們?nèi)绾螜z查它呢?好了,你可以使用 vmstat 工具來(lái)查詢你系統(tǒng)的上下文切換。

          vmstat

          vmstat 是一種常用的系統(tǒng)性能分析工具。主要用于分析內(nèi)存使用情況,也常用于分析 CPU 上下文切換和中斷的次數(shù)。

          例如 vmstat 5(5 秒輸出間隔):

          讓我們看一下輸出:

          • cs(context switch):每秒上下文切換的次數(shù)。

          • in(interrupt):每秒的中斷數(shù)。

          • r(running | runnable):就緒隊(duì)列的長(zhǎng)度,即正在運(yùn)行和等待 CPU 的進(jìn)程數(shù)。

          • b(blocked):處于不間斷睡眠狀態(tài)的進(jìn)程數(shù)。

          在上面的例子中,我們可以看到上下文切換次數(shù)為 33 次,系統(tǒng)中斷次數(shù)為 25 次,就緒隊(duì)列長(zhǎng)度,不間斷狀態(tài)進(jìn)程數(shù)均為 0

          pidstat

          vmstat 工具只給出了系統(tǒng)的整體上下文切換的信息。要查看每個(gè)進(jìn)程的詳細(xì)信息,您需要使用 pidstat。添加 -w 選項(xiàng),您可以看到每個(gè)進(jìn)程的上下文切換:

          例如:

          #?Output?interval?is?5
          $?pidstat?-w?5
          Linux?4.15.0?(ubuntu)??09/23/18??_x86_64_??(2?CPU)
          08:18:26??????UID???????PID???cswch/s?nvcswch/s??Command
          08:18:31????????0?????????1??????0.20??????0.00??systemd
          08:18:31????????0?????????8??????5.40??????0.00??rcu_sched
          ...

          結(jié)果中有兩列需要我們注意:cswchnvcswch。其中,cswch 表示每秒自愿上下文切換的次數(shù),nvcswch 表示每秒非自愿上下文切換的次數(shù)。

          • 自愿上下文切換:指進(jìn)程無(wú)法獲得所需資源而導(dǎo)致的上下文切換。例如,當(dāng) I/O 和內(nèi)存等系統(tǒng)資源不足時(shí),就會(huì)發(fā)生自愿上下文切換。

          • 非自愿上下文切換:指進(jìn)程因時(shí)間片已過(guò)期而被系統(tǒng)強(qiáng)制重新調(diào)度時(shí)發(fā)生的上下文切換。例如,當(dāng)大量進(jìn)程競(jìng)爭(zhēng) CPU 時(shí),很容易發(fā)生非自愿的上下文切換。

          您必須牢記這兩個(gè)概念,因?yàn)樗鼈円馕吨煌男阅軉?wèn)題。

          案例分析

          既然您知道如何查看這些指標(biāo),那么就會(huì)出現(xiàn)另一個(gè)問(wèn)題,上下文切換頻率多久才是正常的呢?讓我們看一個(gè)示例案例。

          我們將使用 sysbench (https://github.com/akopytov/sysbenc),一個(gè)多線程的基準(zhǔn)測(cè)試工具通過(guò)生成負(fù)載來(lái)模擬上下文切換過(guò)多的問(wèn)題。假設(shè)您已經(jīng)在 Linux 系統(tǒng)上安裝了 sysbenchsysstat

          在我們模擬負(fù)載之前,讓我們?cè)谝粋€(gè)終端中運(yùn)行一下 vmstat

          在這里可以看到當(dāng)前的上下文切換次數(shù) cs35,中斷次數(shù) in19rb 都是 0。由于我目前沒(méi)有其他任務(wù)在運(yùn)行,因此它們是空閑系統(tǒng)中的上下文切換數(shù)量

          現(xiàn)在讓我們運(yùn)行 sysbench 來(lái)模擬多線程調(diào)度系統(tǒng)的瓶頸:

          $?sysbench?--threads=10?--max-time=300?threads?run

          現(xiàn)在,您應(yīng)該會(huì)看到 vmstat 輸出了與上面不同的結(jié)果:

          應(yīng)該可以發(fā)現(xiàn) cs 欄的上下文切換次數(shù)從之前的 35 次突增到 139 萬(wàn)次。同時(shí),注意觀察其他幾個(gè)指標(biāo):

          • r:就緒隊(duì)列的長(zhǎng)度已達(dá)到 8

          • ussyussy 的 CPU 使用率加起來(lái)是 100%,系統(tǒng) CPU 使用率是 84%,說(shuō)明 CPU 主要被內(nèi)核占用。

          • in:中斷數(shù)也上升到了 10000,說(shuō)明中斷處理也是一個(gè)潛在的問(wèn)題。

          結(jié)合這些指標(biāo)我們可以知道系統(tǒng)的就緒隊(duì)列太長(zhǎng)了,也就是有太多的進(jìn)程在運(yùn)行等待 CPU,導(dǎo)致大量的上下文切換,而大量的上下文切換導(dǎo)致了系統(tǒng) CPU 使用率的增長(zhǎng)。

          那么是什么過(guò)程導(dǎo)致了這些問(wèn)題呢?

          我們繼續(xù)分析,同時(shí)在第三個(gè)終端使用 pidstat,看看 CPU 和進(jìn)程上下文切換的情況:

          #?1?means?output?interval?is?1?second
          #?-w:?output?process?switching?index,
          #?-u:?output?CPU?usage?index
          $?pidstat?-w?-u?1
          08:06:33??????UID???????PID????%usr?%system??%guest???%wait????%CPU???CPU??Command
          08:06:34????????0?????10488???30.00??100.00????0.00????0.00??100.00?????0??sysbench
          08:06:34????????0?????26326????0.00????1.00????0.00????0.00????1.00?????0??kworker/u4:2
          08:06:33??????UID???????PID???cswch/s?nvcswch/s??Command
          08:06:34????????0?????????8?????11.00??????0.00??rcu_sched
          08:06:34????????0????????16??????1.00??????0.00??ksoftirqd/1
          08:06:34????????0???????471??????1.00??????0.00??hv_balloon
          08:06:34????????0??????1230??????1.00??????0.00??iscsid
          08:06:34????????0??????4089??????1.00??????0.00??kworker/1:5
          08:06:34????????0??????4333??????1.00??????0.00??kworker/0:3
          08:06:34????????0?????10499??????1.00????224.00??pidstat
          08:06:34????????0?????26326????236.00??????0.00??kworker/u4:2
          08:06:34?????1000?????26784????223.00??????0.00??sshd

          pidstat 的輸出可以發(fā)現(xiàn),CPU 使用率的增加確實(shí)是 sysbench 造成的,它的 CPU 使用率已經(jīng)達(dá)到了 100%。但上下文切換來(lái)自其他進(jìn)程,包括非自愿上下文切換頻率最高的 pidstat,以及自愿上下文切換頻率最高的內(nèi)核線程 kworkersshd

          注意:默認(rèn)情況下 pidstat 只顯示進(jìn)程的上下文切換,如果要查看實(shí)際線程的上下文切換,請(qǐng)?zhí)砑?-t 選項(xiàng)。

          中斷

          要找出中斷數(shù)量也很高的原因所在,您可以檢查 /proc/interrupts 文件。該文件會(huì)提供一個(gè)只讀的中斷使用情況。

          #?-d:?Highlight?the?change?area
          $?watch?-d?cat?/proc/interrupts
          ???????????CPU0???????CPU1
          ...
          RES:????2450431????5279697???Rescheduling?interrupts
          ...

          觀察一段時(shí)間后,可以發(fā)現(xiàn)變化最快的是重新調(diào)度中斷(RES, REScheduling interrupt)。這種中斷類型表明處于空閑狀態(tài)的 CPU 被喚醒以調(diào)度新的任務(wù)運(yùn)行。所以這里的中斷增加是因?yàn)樘嗟娜蝿?wù)調(diào)度問(wèn)題,這和前面上下文切換次數(shù)的分析結(jié)果是一致的

          現(xiàn)在回到最初的問(wèn)題,每秒多少次上下文切換是正常的?

          這個(gè)值實(shí)際上取決于系統(tǒng)本身的 CPU 性能。在我看來(lái),如果系統(tǒng)的上下文切換次數(shù)比較穩(wěn)定的話,幾百到一萬(wàn)應(yīng)該是正常的。但是,當(dāng)上下文切換次數(shù)超過(guò) 10000,或者切換次數(shù)快速增加時(shí),很可能是出現(xiàn)了性能問(wèn)題。

          結(jié)論

          此時(shí),你應(yīng)該可以根據(jù)上下文切換的類型做一些具體的分析了。

          • 自愿上下文切換較多,說(shuō)明進(jìn)程在等待資源,可能會(huì)出現(xiàn) I/O 飽和等其他問(wèn)題。

          • 非自愿上下文切換較多,說(shuō)明進(jìn)程正在被強(qiáng)制調(diào)度,也就是都在爭(zhēng)搶 CPU,說(shuō)明 CPU 確實(shí)產(chǎn)生了瓶頸。

          • 中斷次數(shù)增多,說(shuō)明 CPU 被中斷處理程序占用,需要通過(guò)查看 /proc/interrupts 文件來(lái)分析具體的中斷類型。

          鏈接:https://blog.devgenius.io/linux-cpu-context-switch-troubleshooting-bda45883e59e

          (版權(quán)歸原作者所有,侵刪)


          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91精品系列 | 亚洲最大性爱网站 | 日韩激情免费一级浪 | 午夜久久久久久 | 久久草在线播放 |