進程在競爭 CPU 的時候并沒有真正運行,系統(tǒng)的負載也會升高。

Linux 是一個多任務(wù)操作系統(tǒng),它支持遠大于 CPU 數(shù)量的任務(wù)同時運行,在每個任務(wù)運行前,CPU 都需要知道任務(wù)從哪里加載、又從哪里開始運行,也就是說,需要系統(tǒng)事先幫它設(shè)置好 CPU 寄存器和程序計數(shù)器(Program Counter,PC)。
CPU 寄存器,是 CPU 內(nèi)置的容量小、但速度極快的內(nèi)存。而程序計數(shù)器,則是用來存儲 CPU 正在執(zhí)行的指令位置、或者即將執(zhí)行的下一條指令位置。它們都是 CPU 在運行任何任務(wù)前,必須的依賴環(huán)境,因此也被叫做 CPU 上下文。
Linux 按照特權(quán)等級,把進程的運行空間分為內(nèi)核空間和用戶空間。
內(nèi)核空間(Ring 0)具有最高權(quán)限,可以直接訪問所有資源;
用戶空間(Ring 3)只能訪問受限資源,不能直接訪問內(nèi)存等硬件設(shè)備,必須通過系統(tǒng)調(diào)用陷入到內(nèi)核中,才能訪問這些特權(quán)資源。
從用戶態(tài)到內(nèi)核態(tài)的轉(zhuǎn)變,需要通過系統(tǒng)調(diào)用來完成。
比如,當(dāng)我們查看文件內(nèi)容時,就需要多次系統(tǒng)調(diào)用來完成:首先調(diào)用 open() 打開文件,然后調(diào)用 read() 讀取文件內(nèi)容,并調(diào)用 write() 將內(nèi)容寫到標(biāo)準(zhǔn)輸出,最后再調(diào)用 close() 關(guān)閉文件。
系統(tǒng)調(diào)用的過程會涉及到CPU 上下文的切換,CPU 寄存器里原來用戶態(tài)的指令位置,需要先保存起來。接著,為了執(zhí)行內(nèi)核態(tài)代碼,CPU 寄存器需要更新為內(nèi)核態(tài)指令的新位置。最后才是跳轉(zhuǎn)到內(nèi)核態(tài)運行內(nèi)核任務(wù),而系統(tǒng)調(diào)用結(jié)束后,CPU 寄存器需要恢復(fù)原來保存的用戶態(tài),然后再切換到用戶空間,繼續(xù)運行進程。所以,一次系統(tǒng)調(diào)用的過程,其實是發(fā)生了兩次 CPU 上下文切換。
進程是由內(nèi)核來管理和調(diào)度的,進程的切換只能發(fā)生在內(nèi)核態(tài)。所以,進程的上下文不僅包括了虛擬內(nèi)存、棧、全局變量等用戶空間的資源,還包括了內(nèi)核堆棧、寄存器等內(nèi)核空間的狀態(tài)。
進程的上下文切換就比系統(tǒng)調(diào)用時多了一步:在保存當(dāng)前進程的內(nèi)核狀態(tài)和 CPU 寄存器之前,需要先把該進程的虛擬內(nèi)存、棧等保存下來;而加載了下一進程的內(nèi)核態(tài)后,還需要刷新進程的虛擬內(nèi)存和用戶棧。
線程上下文切換上下文切換都需要幾十納秒到數(shù)微秒的 CPU 時間。
線程與進程大的區(qū)別在于,線程是調(diào)度的基本單位,而進程則是資源擁有的基本單位。內(nèi)核中的任務(wù)調(diào)度,實際上的調(diào)度對象是線程。
當(dāng)進程只有一個線程時,可以認為進程就等于線程。
當(dāng)進程擁有多個線程時,這些線程會共享相同的虛擬內(nèi)存和全局變量等資源。這些資源在上下文切換時是不需要修改的。
另外,線程也有自己的私有數(shù)據(jù),比如棧和寄存器等,這些在上下文切換時也是需要保存的。
線程的上下文切換其實就可以分為兩種情況:
為了快速響應(yīng)硬件的事件,中斷處理會打斷進程的正常調(diào)度和執(zhí)行,轉(zhuǎn)而調(diào)用中斷處理程序,響應(yīng)設(shè)備事件。而在打斷其他進程時,就需要將進程當(dāng)前的狀態(tài)保存下來,這樣在中斷結(jié)束后,進程仍然可以從原來的狀態(tài)恢復(fù)運行。
中斷上下文切換并不涉及到進程的用戶態(tài),所以,即便中斷過程打斷了一個正處在用戶態(tài)的進程,也不需要保存和恢復(fù)這個進程的虛擬內(nèi)存、全局變量等用戶態(tài)資源。中斷上下文,其實只包括內(nèi)核態(tài)中斷服務(wù)程序執(zhí)行所必需的狀態(tài),包括 CPU 寄存器、內(nèi)核堆棧、硬件中斷參數(shù)等。
進程調(diào)度觸發(fā)情況中斷上下文切換也需要消耗 CPU,切換次數(shù)過多也會耗費大量的 CPU,甚至嚴(yán)重降低系統(tǒng)的整體性能。
vmstat 是一個常用的系統(tǒng)性能分析工具,主要用來分析系統(tǒng)的內(nèi)存使用情況,也常用來分析 CPU 上下文切換和中斷的次數(shù)。
# 每隔 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 st
0 0 0 7005360 91564 818900 0 0 0 0 25 33 0 0 100 0 0pidstatcs(context switch)是每秒上下文切換的次數(shù)。
in(interrupt)則是每秒中斷的次數(shù)。
r(Running or Runnable)是就緒隊列的長度,也就是正在運行和等待 CPU 的進程數(shù)。
b(Blocked)則是處于不可中斷睡眠狀態(tài)的進程數(shù)。
sysstat 包含了常用的 Linux 性能工具,用來監(jiān)控和分析系統(tǒng)的性能。
pidstat是其中一個常用的進程性能分析工具,用來實時查看進程的 CPU、內(nèi)存、I/O 以及上下文切換等性能指標(biāo)。
vmstat 只給出了系統(tǒng)總體的上下文切換情況,要想查看每個進程的詳細情況,就需要使用我們上面提到過的 pidstat 了。給它加上 -w 選項,你就可以查看每個進程上下文切換的情況了。
# 每隔 5 秒輸出 1 組數(shù)據(jù)
$ 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
# 每隔 1 秒輸出一組數(shù)據(jù)(需要 Ctrl+C 才結(jié)束)
# -wt 參數(shù)表示輸出線程的上下文切換指標(biāo)
$ pidstat -wt 1
08:14:05 UID TGID TID cswch/s nvcswch/s Command
...
08:14:05 0 10551 - 6.00 0.00 sysbench
08:14:05 0 - 10551 6.00 0.00 |__sysbench
08:14:05 0 - 10552 18911.00 103740.00 |__sysbench
08:14:05 0 - 10553 18915.00 100955.00 |__sysbench
08:14:05 0 - 10554 18827.00 103954.00 |__sysbench判斷中斷上下文切換的原因cswch 自愿上下文切換,是指進程無法獲取所需資源,導(dǎo)致的上下文切換。比如說, I/O、內(nèi)存等系統(tǒng)資源不足時,就會發(fā)生自愿上下文切換。
nvcswch 非自愿上下文切換,則是指進程由于時間片已到等原因,被系統(tǒng)強制調(diào)度,進而發(fā)生的上下文切換。比如說,大量進程都在爭搶 CPU 時,就容易發(fā)生非自愿上下文切換。
/proc 實際上是 Linux 的一個虛擬文件系統(tǒng),用于內(nèi)核空間與用戶空間之間的通信。/proc/interrupts 就是這種通信機制的一部分,提供了一個只讀的中斷使用情況。
# -d 參數(shù)表示高亮顯示變化的區(qū)域
$ watch -d cat /proc/interrupts
CPU0 CPU1
...
RES: 2450431 5279697 Rescheduling interrupts
...變化速度最快的是重調(diào)度中斷(RES),這個中斷類型表示,喚醒空閑狀態(tài)的 CPU 來調(diào)度新的任務(wù)運行。這是多處理器系統(tǒng)(SMP)中,調(diào)度器用來分散任務(wù)到不同 CPU 的機制,通常也被稱為處理器間中斷(Inter-Processor Interrupts,IPI)。
但當(dāng)上下文切換次數(shù)超過一萬次,或者切換次數(shù)出現(xiàn)數(shù)量級的增長時,就很可能已經(jīng)出現(xiàn)了性能問題。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:Linux-CPU之上下文切換-創(chuàng)新互聯(lián)
新聞來源:http://chinadenli.net/article6/cohiog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、關(guān)鍵詞優(yōu)化、品牌網(wǎng)站設(shè)計、電子商務(wù)、服務(wù)器托管、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容