自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

舞動(dòng)的操作系統(tǒng):深入了解Linux系統(tǒng)上下文切換

系統(tǒng) Linux
在本文中,我們將深入探討系統(tǒng)上下文切換的概念,以及如何使用vmstat工具來(lái)監(jiān)視系統(tǒng)上下文切換的情況。

最近排查性能碰到由于上下文切換頻繁導(dǎo)致性能下降的問(wèn)題,這里做一個(gè)對(duì)上下文排查的學(xué)習(xí)記錄。

在計(jì)算機(jī)科學(xué)領(lǐng)域,系統(tǒng)上下文切換是一項(xiàng)至關(guān)重要的操作,尤其在多任務(wù)操作系統(tǒng)中。Linux系統(tǒng)以其高度的穩(wěn)定性和可伸縮性而著名,而系統(tǒng)上下文切換是其核心特性之一。在本文中,我們將深入探討系統(tǒng)上下文切換的概念,以及如何使用vmstat工具來(lái)監(jiān)視系統(tǒng)上下文切換的情況。

什么是系統(tǒng)上下文切換

系統(tǒng)上下文切換是指操作系統(tǒng)在不同進(jìn)程或線(xiàn)程之間切換執(zhí)行的過(guò)程。在多任務(wù)操作系統(tǒng)中,這是一項(xiàng)至關(guān)重要的任務(wù),因?yàn)樗试S多個(gè)程序共享處理器時(shí)間,以便它們似乎同時(shí)運(yùn)行。系統(tǒng)上下文切換涉及保存當(dāng)前進(jìn)程的狀態(tài),切換到另一個(gè)進(jìn)程,并將其狀態(tài)還原,以便它可以繼續(xù)執(zhí)行。這是操作系統(tǒng)內(nèi)核的關(guān)鍵職責(zé)之一,以確保公平的資源分配和系統(tǒng)的高效性。

vmstat

在Linux系統(tǒng)中,vmstat是一個(gè)非常有用的工具,用于監(jiān)視系統(tǒng)性能,并且可以提供關(guān)于上下文切換的有用信息。您可以使用以下命令來(lái)運(yùn)行vmstat并顯示上下文切換統(tǒng)計(jì)信息:

vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b 交換 空閑 緩沖 緩存   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 1956380  62880 877460    0    0  3692   312  572 1251 28 50 21  1  0
 0  0      0 1956380  62880 877568    0    0    68     0  160  248  2  0 97  0  0
 0  0      0 1956380  62880 877568    0    0     0     0  168  265  2  1 97  0  0
 1  0      0 1956380  62880 877564    0    0     0     0  271  523  4  2 94  0  0
 1  0      0 1956380  62880 877552    0    0     0     4  225  356  3  1 96  0  0

這將以每秒一次的頻率輸出系統(tǒng)性能信息,其中包括上下文切換的統(tǒng)計(jì)數(shù)據(jù)。在輸出中,您將看到如下信息:

  • cs(上下文切換):這是系統(tǒng)上下文切換的總數(shù),包括進(jìn)程切換和中斷切換。
  • in(中斷數(shù)):這是自系統(tǒng)啟動(dòng)以來(lái)的中斷總數(shù)。
  • r(運(yùn)行隊(duì)列長(zhǎng)度):這是正在運(yùn)行的進(jìn)程數(shù)。
  • b(阻塞隊(duì)列長(zhǎng)度):這是等待資源的進(jìn)程數(shù)。

舉個(gè)栗子

我們?cè)趗buntu下運(yùn)行stress-ng -i 100模擬io加壓,在模擬之前使用vmstat 1監(jiān)控上下文切換。

我們可以看到cs從500左右漲到20000多以上,實(shí)際應(yīng)用中碰到性能問(wèn)題需要查上下文時(shí)就要使用vmstat來(lái)觀(guān)察,如果確認(rèn)了上下文切換比較頻繁,那么如何確認(rèn)是哪個(gè)應(yīng)用導(dǎo)致的呢?這時(shí)候就需要pidstat了。這里我在另一個(gè)終端已經(jīng)運(yùn)行起來(lái)了。

運(yùn)行pidstat -w 3  //每隔3秒輸出一次關(guān)于進(jìn)程上下文切換的統(tǒng)計(jì)信息
12時(shí)04分17秒   UID       PID   cswch/s nvcswch/s  Command
12時(shí)04分20秒     0        14      1.33      0.00  ksoftirqd/0
12時(shí)04分20秒     0        15     29.33      0.00  rcu_preempt
12時(shí)04分20秒     0        16      0.33      0.00  migration/0
12時(shí)04分20秒     0        22      0.33      0.00  migration/1
12時(shí)04分20秒     0        23      3.00      0.00  ksoftirqd/1
12時(shí)04分20秒     0        35      2.00      0.00  kcompactd0
12時(shí)04分20秒     0        48      2.33      0.00  kworker/1:1H-kblockd
12時(shí)04分20秒     0       247    707.33      0.00  kworker/u256:29-flush-8:0
12時(shí)04分20秒     0       254      0.33      0.00  kworker/0:2H-kblockd
12時(shí)04分20秒     0       278      5.00      1.33  jbd2/sda3-8
12時(shí)04分20秒     0       380      3.33      0.00  irq/16-vmwgfx
12時(shí)04分20秒   127       613      4.00      0.00  systemd-oomd
12時(shí)04分20秒     0       642     12.67      0.67  vmtoolsd
12時(shí)04分20秒   130       921      0.33      0.00  vnstatd
12時(shí)04分20秒     0      1383      1.00      0.00  vmtoolsd
12時(shí)04分20秒   998      1576      1.00      0.00  pmproxy
12時(shí)04分20秒     0      4294      9.33      9.33  gnome-shell
12時(shí)04分20秒     0      4431      2.00      0.00  ibus-daemon
12時(shí)04分20秒     0      4506     10.33      0.33  vmtoolsd
12時(shí)04分20秒     0      4550      1.00      0.00  ibus-extension-
12時(shí)04分20秒     0      4615      1.00      0.00  ibus-engine-lib
12時(shí)04分20秒     0      4835      8.33     13.33  gnome-terminal-
12時(shí)04分20秒     0      5411      6.67      0.00  kworker/0:2-events
12時(shí)04分20秒     0      5796     42.33      0.00  kworker/u256:1-writeback
12時(shí)04分20秒     0      7105      8.00      0.00  kworker/1:3-events
12時(shí)04分20秒     0      7224      1.00      1.00  vmstat
12時(shí)04分20秒     0      7475      6.33      6.33  stress-ng
12時(shí)04分20秒     0      7476      6.33      7.00  stress-ng
12時(shí)04分20秒     0      7477      5.00      6.00  stress-ng
12時(shí)04分20秒     0      7478      5.33      5.00  stress-ng
12時(shí)04分20秒     0      7479      5.33      8.00  stress-ng
12時(shí)04分20秒     0      7480      5.67      5.67  stress-ng
12時(shí)04分20秒     0      7481      5.33      5.67  stress-ng
12時(shí)04分20秒     0      7482      4.33      4.67  stress-ng
12時(shí)04分20秒     0      7483      5.33      5.33  stress-ng
12時(shí)04分20秒     0      7484      5.33      4.67  stress-ng
12時(shí)04分20秒     0      7485      4.67      6.00  stress-ng
12時(shí)04分20秒     0      7486      4.67      7.00  stress-ng
12時(shí)04分20秒     0      7487      4.33      5.00  stress-ng
12時(shí)04分20秒     0      7488      4.67      5.33  stress-ng
12時(shí)04分20秒     0      7489      5.00      5.00  stress-ng
12時(shí)04分20秒     0      7490      4.00      6.33  stress-ng
12時(shí)04分20秒     0      7491      5.00      7.00  stress-ng
12時(shí)04分20秒     0      7492      5.67      7.00  stress-ng
12時(shí)04分20秒     0      7493      5.67      5.00  stress-ng
12時(shí)04分20秒     0      7494      5.67      6.33  stress-ng
12時(shí)04分20秒     0      7495      5.67      3.67  stress-ng
12時(shí)04分20秒     0      7496      5.00      6.00  stress-ng
12時(shí)04分20秒     0      7497      5.00      8.33  stress-ng
........后面還有很多stress-ng的進(jìn)程

從結(jié)果中可以看到有很多stress-ng帶來(lái)的上下文切換,這里面還有個(gè)占大頭兒的kworker/u256:29-flush-8:0,占了707,他是做什么的呢?

kworker/u256:29-flush-8:0 是Linux內(nèi)核中的一個(gè)內(nèi)核線(xiàn)程,它用于執(zhí)行與I/O刷新相關(guān)的任務(wù)。這個(gè)線(xiàn)程通常是由kworker進(jìn)程池中的一個(gè)線(xiàn)程執(zhí)行的,負(fù)責(zé)刷新磁盤(pán)緩存中的數(shù)據(jù)到存儲(chǔ)設(shè)備,以確保數(shù)據(jù)的一致性和持久性。

具體來(lái)說(shuō),kworker/u256:29-flush-8:0 中的部分信息可以解釋如下:

  • kworker:這是內(nèi)核工作線(xiàn)程的通用前綴。
  • /u256:這是一個(gè)標(biāo)識(shí)符,通常是一個(gè)數(shù)字,用于唯一標(biāo)識(shí)內(nèi)核工作線(xiàn)程。
  • 29:這可能是該特定線(xiàn)程的標(biāo)識(shí)號(hào),用于標(biāo)識(shí)線(xiàn)程在內(nèi)核線(xiàn)程池中的位置。
  • flush-8:0:這部分通常描述了該線(xiàn)程正在執(zhí)行的任務(wù),這里是"flush",可能表示磁盤(pán)數(shù)據(jù)刷新操作。8:0 可能涉及到與設(shè)備名稱(chēng)或塊設(shè)備的相關(guān)信息。

這種類(lèi)型的內(nèi)核線(xiàn)程通常用于后臺(tái)任務(wù),以確保數(shù)據(jù)在內(nèi)存和磁盤(pán)之間的同步。它在I/O操作中扮演了重要角色,幫助維護(hù)數(shù)據(jù)的一致性,并減少數(shù)據(jù)丟失的風(fēng)險(xiǎn)。所以可以確定是stress-ng模擬io加壓帶來(lái)的上下文切換。

非自愿與自愿切換

上面pidstat可以看到cswch/s nvcswch/s,這兩個(gè)就是自愿上下文切換和非自愿上下文切換。

非自愿上下文切換(Non-Voluntary Context Switches)和自愿上下文切換(Voluntary Context Switches)是多任務(wù)操作系統(tǒng)中的兩種不同類(lèi)型的上下文切換,它們分別表示進(jìn)程或線(xiàn)程切換執(zhí)行的原因和方式。

(1) 自愿上下文切換(Voluntary Context Switches):

自愿上下文切換是由進(jìn)程或線(xiàn)程自身發(fā)起的上下文切換,而不是被操作系統(tǒng)強(qiáng)制執(zhí)行。這通常發(fā)生在以下情況下:

  • 進(jìn)程主動(dòng)讓出CPU,以便其他就緒狀態(tài)的進(jìn)程有機(jī)會(huì)執(zhí)行。這可以是出于合作性多任務(wù)處理的目的,進(jìn)程知道它已經(jīng)執(zhí)行了足夠的時(shí)間,并主動(dòng)讓出CPU。
  • 進(jìn)程在執(zhí)行期間需要等待某些事件的發(fā)生,如等待I/O操作完成。在這種情況下,進(jìn)程可能會(huì)主動(dòng)掛起自己,以便其他任務(wù)可以繼續(xù)執(zhí)行。

自愿上下文切換通常是進(jìn)程協(xié)作和多任務(wù)處理的一部分,它有助于提高系統(tǒng)的效率和公平性。

(2) 非自愿上下文切換(Non-Voluntary Context Switches):

非自愿上下文切換是由操作系統(tǒng)強(qiáng)制執(zhí)行的上下文切換,進(jìn)程或線(xiàn)程被掛起并切換到就緒狀態(tài)的其他進(jìn)程或線(xiàn)程。它通常發(fā)生在以下情況下:

  • 進(jìn)程的時(shí)間片(CPU分配的時(shí)間段)已經(jīng)用盡,操作系統(tǒng)需要將CPU分配給其他進(jìn)程。
  • 進(jìn)程需要等待某些資源的可用性,如等待磁盤(pán)I/O、等待網(wǎng)絡(luò)數(shù)據(jù)等。在這種情況下,進(jìn)程被掛起,直到資源可用。

非自愿上下文切換是操作系統(tǒng)的一種管理方式,以確保多任務(wù)系統(tǒng)中的進(jìn)程或線(xiàn)程都有機(jī)會(huì)獲得CPU時(shí)間,防止某個(gè)任務(wù)長(zhǎng)時(shí)間獨(dú)占CPU。

總結(jié)起來(lái),自愿上下文切換是由進(jìn)程自身控制和觸發(fā)的上下文切換,而非自愿上下文切換是由操作系統(tǒng)強(qiáng)制執(zhí)行的,通常是為了分配資源和提高系統(tǒng)的效率。了解這兩種上下文切換類(lèi)型有助于理解多任務(wù)操作系統(tǒng)如何管理和調(diào)度進(jìn)程,以確保資源的合理分配和性能的優(yōu)化。

總結(jié)

系統(tǒng)上下文切換是多任務(wù)操作系統(tǒng)的核心功能之一,它確保了資源的公平分配和高效的多任務(wù)處理。通過(guò)使用vmstat工具,可以監(jiān)視系統(tǒng)上下文切換的性能統(tǒng)計(jì)信息,以便更好地了解系統(tǒng)性能瓶頸問(wèn)題。

責(zé)任編輯:趙寧寧 來(lái)源: 囧囧妹
相關(guān)推薦

2019-05-06 14:36:48

CPULinux寄存器

2020-09-28 08:44:17

Linux內(nèi)核

2022-04-24 15:37:26

LinuxCPU

2022-09-26 23:36:33

Linux系統(tǒng)CPU

2022-04-25 11:27:34

LinuxCPU

2024-08-27 09:46:39

Go協(xié)程效率

2021-05-25 11:10:36

GitLinux

2022-09-05 08:02:10

上下文切換服務(wù)器

2024-11-06 12:59:42

多線(xiàn)程銷(xiāo)毀線(xiàn)程切換

2009-12-17 11:24:56

Linux Fedor

2024-03-19 09:15:12

服務(wù)器CPUI/O

2010-01-06 16:37:02

Linux操作系統(tǒng)

2019-05-07 10:03:47

Linux系統(tǒng)發(fā)行版

2015-09-21 11:28:57

使用Linux系統(tǒng)

2020-07-24 10:00:00

JavaScript執(zhí)行上下文前端

2013-10-09 11:07:31

日志文件系統(tǒng)

2020-02-21 10:09:06

調(diào)度進(jìn)程線(xiàn)程

2009-12-22 14:08:38

2017-05-11 14:00:02

Flask請(qǐng)求上下文應(yīng)用上下文

2023-12-10 13:37:23

Python編程上下文管理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)