婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 基于SQL Server OS的任務調度機制詳解

基于SQL Server OS的任務調度機制詳解

熱門標簽:慶陽地圖標注 電銷外呼系統軟件功能 承德地圖標注公司名需要花錢嗎 美團地圖標注商戶認證注冊 浙江穩定外呼系統供應商 北京400電話辦理多少錢 咸陽電腦外呼系統運營商 榕城市地圖標注 怎么給高德做地圖標注
簡介

     SQL Server OS是在Windows之上,用于服務SQL Server的一個用戶級別的操作系統層次。它將操作系統部分的功能從整個SQL Server引擎中抽象出來,單獨形成一層,以便為存儲引擎提供服務。SQL Server OS主要提供了任務調度、內存分配、死鎖檢測、資源檢測、鎖管理、Buffer Pool管理等多種功能。本篇文章主要是談一談SQL OS中所提供的任務調度機制。

搶占式(Preemptive)調度與非搶占式(non-Preemptive)調度

    數據庫層面的任務調度的起源是ACM上的一篇名為“Operating System Support for Database Management”。但是對于Windows來說,在操作系統層面專門加入支持數據庫的任務調度,還不如在SQL Server中專門抽象出來一層進行調度,既然可以抽象出來一層進行數據庫層面的任務調度,那么何不在這個抽象層進行內存和IO等的管理呢?這個想法,就是SQL Server OS的起源。

    在Windows NT4之后,Windows任務調度是搶占式的,也就是說Windows任務是根據任務的優先級和時間片來決定。如果一個任務的時間片用完,或是有更高優先級的任務正在等待,那么操作系統可以強制剝奪正在運行的線程(線程是任務調度的基本單位)所占用的CPU,將CPU資源讓給其它線程。

    但是對于SQL Server來說,這種非合作式的、基于時間片的任務調度機制就不那么合適了。如果SQL Server使用Windows內的任務調度機制來進行任務調度的話,Windows不會根據SQL Server的調度機制進行優化,只是根據時間片和優先級來中斷線程,這會導致如下兩個缺陷:

Windows不會知道SQL Server中任務(也就是SQL OS中的Task,會在文章后面講到)的最佳中斷點,這勢必會造成更多的Context Switch(Context Switch代價非常非常高昂,需要線程字用戶態和核心態之間轉換),因為Windows調度不是線程本身決定是否該出讓CPU,而是由Windows決定。Windows并不會知道當前數據庫中對應的線程是否正在做關鍵任務,只會不分青紅皂白的奪取線程的CPU。 連入SQL Server的連接不可能一直在執行,每一個Batch之間會有大量空閑時間。如果每個連接都需要單獨占用一個線程,那么SQL Server維護這些線程就需要消耗額外的資源,這是很不明智的。

     而對于SQL Server OS來說,線程調度采用的合作模式而不是搶占模式。這是因為這些數據庫內的任務都在SQL Server這個SandBox之內,SQL Server充分相信其內線程,所以除非線程主動放棄CPU,SQL Server OS不會強制剝奪線程的CPU。這樣一來,雖然Worker之間的切換依然是通過Windows的Context Switch進行,但這種合作模式會大大減少所需Context Switch的次數。

    SQL Server決定哪一個時間點哪一個線程運行,是通過一個叫Scheduler的東西進行的,下面讓我們來看Scheduler。

Scheduler

    SQL Server中每一個邏輯CPU都有一個與之對應的Scheduler,只有拿到Scheduler所有權的任務才允許被執行,Scheduler可以看做一個隊SQLOS來說的邏輯CPU。您可以通過sys.dm_os_schedulers這個DMV來看系統中所有的Scheduler,如圖1所示。
 

    圖1.查看sys.dm_os_schedulers

   我的筆記本是一個i7四核8線程的CPU,對應的,可以看到除了DAC和運行系統任務的HIDDEN Scheduler,剩下的Scheduler一共8個,每個對應一個邏輯CPU,用于處理內部Task。當然,您也可以通過設置Affinity來將某些Scheduler Offline,如圖2所示。注意,這個過程是在線的,無需重啟SQL Server就能實現。

    圖2.設置Affinity

    此時,無需重啟實例就能看到4個Scheduler被Offline,如圖3所示:
 

    圖3.在線Offline 4個Scheduler

    一般來說,除非您的服務器上運行其他實例或程序,否則不需要控制Affinity。

    在圖1中,我們還注意到,除了Visible的Scheduler之外,還有一些特殊的Scheduler,這些Scheduler的ID都大于255,這類Scheduler都用于系統內部使用,比如說資源管理、DAC、備份還原操作等。另外,雖然Scheduler和邏輯CPU的個數一致,但這并不意味著Scheduler和固定的邏輯CPU相綁定,而是Scheduler可以在任何CPU上運行,只有您設置了Affinity Mask之后,Scheduler才會被固定在某個CPU上。這樣的一個好處是,當一個Scheduler非常繁忙時,可能不會導致只有一個物理CPU繁忙,因為Scheduler會在多個CPU之間移動,從而使得CPU的使用傾向于平均。

    這意味著對于一個比較長的查詢,可以前半部分在CPU0上執行,而后半部分在CPU1上執行。

    另外,在每一個Scheduler上,同一時間只能有一個Worker運行,所有的資源都就緒但沒有拿到Scheduler,那么這個Worker就處于Runnable狀態。下面讓我們來看一看Worker。

Worker

    每一個Worker可以看做是對應一個線程(或纖程),Scheduler不會直接調度線程,而是調度Worker。Worker會隨著負載的增加而增加,換句話說,Worker是按需增加,直到增加到最大數字。在SQL Server中,默認的Worker最大數是由SQL Server進行管理的。根據32位還是64位,以及CPU的數量來設置最大Worker,具體的計算公式,您可以參閱BOL:http://msdn.microsoft.com/zh-cn/library/ms187024(v=sql.105).aspx。當然您也可以設置最大Worker數量,如圖4所示。

   

    圖4.設置最大Worker數量  

    如果是自動配置,那么SQL Server的最大工作線程數量可以在sys.dm_os_sys_info中看到,如圖5所示。

     

     圖5.查看自動配置的最大Worker數量

    一般來說,這個值您都無需進行設置,但也有一些情況,需要設置這個值。那就是Worker線程用盡,此時除了DAC之外,您甚至無法連入SQL Server。

    Worker實際上會對應Windows上的一個線程,并與某個特定Scheduler綁定,每一個Worker只要開始執行Task,除非Task完成,否則Worker永遠不會放棄這個Task,如果一個Task在運行過程由于鎖、IO等陷入等待,那么實際上Worker就會陷入等待。

    此外,同一個連接內的多個Batch之間傾向于使用同一個Worker,比如第一個Batch使用了Worker 100,那么第二個Batch也同樣傾向于是用Worker 100,但這并不絕對。

    正在運行的任務所是用的Worker,我們可以通過DMV sys.dm_exec_requests查看正在運行的任務,其中的Task_Address列可以看到正在運行的Task,再通過sys.dm_os_tasks的Worker_Address來查看對應的Worker。

    SQL Server會為每一個Worker保留大約2M左右的內存,對于每一個Scheduler上所能有的Worker數量是服務器的最大Worker數量/在線的Scheduler,每一個Scheduler所綁定的Worker會形成Worker池,這意味著每一個Scheduler需要Worker時,首先在Worker池中中查找空閑的Worker,如果沒有空閑的Worker時,才會創建新的Worker。這個行為會和連接池類似。

    那么當一個Scheduler空閑超過15分鐘,或是Windows面臨內存壓力時。SQL Server就會嘗試Trim這個Worker池來釋放被Worker所占用的內存。

Task

    Task是Worker上運行的最小任務單元。只能拿到Worker的Task才能夠運行。我們可以看下面一個簡單的例子,如代碼1所示。

SELECT @@VERSION goSELECT @@SPID go

    代碼1.一個連接上的兩個Batch

    代碼1中的兩個Batch屬于一個連接,每一個Batch中都是一個簡單的Task,如我們前面所說,這兩個Task更傾向于復用同一個Worker,因為他們屬于同一個連接。但也有可能,這兩個Task使用了不同的Worker,甚至是不同的Scheduler。

    除了用戶所用的Task之外,還有一些永久的系統Task,這類Task會永遠占據Worker,這些Task包括死鎖檢測、Lazy Writer等。

Task在Scheduler上的平均分配

    新的Task還會嘗試在Scheduler之間平均分配,可以通過sys.dm_os_schedulers來看到一個load_factor列,這列的值就是用于供Task向Scheduler進行分配時,用來參考。

    每次一個新的Task進入Node時,會選擇負載最少的的Scheduler。但是,如果每次都來做一次選擇,那么就會在Task入隊時造成瓶頸(這個瓶頸類似于TempDB SGAM頁爭搶)。因此SQL OS對于每一個連接,都會記住上次運行的Scheduler ID,在新的Task進入時作為提示(Hint)。但如果一個Scheduler的負載大于所有Scheduler平均值的20%,則會忽略這個提示。負載可以通過上面提到的load_factor列來看,對于某個Task運行的時間比較長,則很有可能造成Scheduler上Task分配的不均勻。

Worker的Yield

    由于SQL Server是非搶占式調度,那么就不能為了完成某個Task,讓Worker占據Scheduler一直運行。如果是這樣,那么處于Runnable的Worker將會饑餓,這不利于大量并發,也違背了SQL OS調度的初衷。

    因此,在合適的時間點讓出Scheduler就是關鍵。Worker讓出CPU使得其它Worker可以運行的過程稱之為yield。yield大體可分為兩種,一種是所謂的“natural yield”,這種方式是Worker在運行過程中被鎖或是某些資源阻塞,此時,該Worker就會讓出Scheduler來讓其它Worker運行。另外一種情況是Worker沒有遇到阻塞,但在時間片到了之后,主動讓出Scheduler,這就是所謂的“voluntarily yield”,這也就是SOS_SCHEDULER_YIELD等待類型的由來,一個Worker由RUNNING狀態轉到WAITING狀態的過程被稱之為switching。SQL OS的一個基本思想就是,要多進行switching,來保證高并發。下面我們來看幾種常見的yield場景:

基于時間片的voluntarily yield大概使得Worker每4秒yield一次。這個值可以通過sys.dm_os_schedulers的quantum_length_us列看到。
每64K結果集排序,就做一次yield。
語句complie,會做yield。
讀取數據頁時
batch中每一句話做完,就會做一次yield。
如果客戶端不能及時取走數據,worker也會做yield。

SQL Server OS中的搶占式任務調度
    對于一些代碼來說,SQL Server會存在一些搶占式代碼。如果您在等待類型中看到“PREEMPTIVE_*”類型的等待,說明這里面的代碼正在運行在搶占式任務調度模式。這類任務包括擴展存儲過程、調用Windows API、日志增長(日志填0)。我們知道,合作式的任務調度需要任務本身Yield,但這類代碼在SQL Server 之外,如果讓他們運行在合作式任務調度這個SandBox之內,這類代碼如果不yield,則會永遠占用Scheduler。這是非常危險的。

    因此,在進入搶占式模式之前,首先需要將Scheduler的控制權交給在Runable隊列中的下一個Worker。此時,搶占式模式運行的代碼不再由SQL OS控制,轉而由Windows任務調度系統控制。因此一個Task的生命周期如果再加上轉到搶占式任務調度模式,則會如圖6所示

  
 圖6.一個Task完整的生命周期

每一個Scheduler的任務調度

    對于每一個Scheduler的調度,一個簡單的模型如圖7所示。   

圖7.一個Scheduler的調度周期模型

小結
    SQL Server OS在Windows之上抽象出一套非搶占式的任務調度機制,從而減少了Context Switch。同時,又有一套線程自己的yield機制,相比Windows隨機搶占數據庫之內的線程而言,讓線程自己來yield則會大量減少Context Switch,從而提升了并發性。

您可能感興趣的文章:
  • SqlServer如何通過SQL語句獲取處理器(CPU)、內存(Memory)、磁盤(Disk)以及操作系統相關信息
  • SQL Server 2008 R2占用cpu、內存越來越大的兩種解決方法
  • SQL Server誤區30日談 第12天 TempDB的文件數和需要和CPU數目保持一致
  • 我的服務器SQL2000的sqlserver占用了90%的cpu,怎么查是那個庫?
  • sql server中的任務調度與CPU深入講解

標簽:新鄉 上海 昭通 重慶 貴州 呼和浩特 拉薩 江蘇

巨人網絡通訊聲明:本文標題《基于SQL Server OS的任務調度機制詳解》,本文關鍵詞  基于,SQL,Server,的,任務,調度,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于SQL Server OS的任務調度機制詳解》相關的同類信息!
  • 本頁收集關于基于SQL Server OS的任務調度機制詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    69堂亚洲精品首页| 蜜桃在线一区二区三区| 国产一区在线视频| 欧美精品视频www在线观看 | 日韩免费电影一区| 一区二区三区在线看| 国产成人综合精品三级| 国产欧美日韩视频一区二区| 91亚洲精品久久久蜜桃网站| 日本一区二区在线不卡| 麻豆精品视频在线观看视频| 国产在线一区二区| 日韩视频在线你懂得| 国产精品18久久久久久久久 | 色婷婷国产精品久久包臀| 欧美国产精品劲爆| 狠狠色丁香久久婷婷综合_中| 精品成人免费观看| 欧美艳星brazzers| 久草在线在线精品观看| 自拍偷拍欧美精品| 日韩一二三四区| 国产精品美女久久久久久2018| 色噜噜狠狠成人中文综合| 亚洲人成亚洲人成在线观看图片 | 大陆成人av片| 亚洲二区在线观看| 欧美激情一区二区三区全黄| 国产91精品免费| 亚洲制服欧美中文字幕中文字幕| 99久久er热在这里只有精品15| 在线不卡中文字幕| 粉嫩一区二区三区在线看| 五月婷婷另类国产| 自拍偷在线精品自拍偷无码专区| 91丨九色丨尤物| 免费在线观看日韩欧美| 亚洲综合无码一区二区| 国产亚洲制服色| 国产精品成人在线观看| 高清beeg欧美| 国产在线一区二区| 久久网站最新地址| 国产91丝袜在线观看| 日本不卡视频一二三区| 亚洲国产精品av| 国产欧美精品一区| 成人av网站在线观看| 国产精品久久久久久久久晋中 | 成人黄色小视频| 日韩欧美一卡二卡| 欧美mv日韩mv亚洲| 亚洲三级久久久| 麻豆久久久久久久| av成人动漫在线观看| 91美女蜜桃在线| 亚洲丝袜另类动漫二区| 日本高清视频一区二区| 色播五月激情综合网| 日韩区在线观看| 日韩色在线观看| 久久精品国产精品青草| 国产激情视频一区二区三区欧美| 日韩女优av电影| 国产剧情一区在线| 911精品产国品一二三产区| 久久精品人人做| 欧美婷婷六月丁香综合色| 欧美久久免费观看| 国产美女精品一区二区三区| 视频一区在线视频| 韩国在线一区二区| 欧美激情一区二区在线| 久久众筹精品私拍模特| 亚洲精品一线二线三线| 一本久久综合亚洲鲁鲁五月天| www.久久久久久久久| 日韩精品电影在线观看| 国产91在线看| 国产精品麻豆久久久| 久久综合精品国产一区二区三区| 91麻豆精品一区二区三区| 高清不卡在线观看| 91在线免费视频观看| 麻豆精品在线看| 国产精品无码永久免费888| 2019国产精品| 欧美日韩在线电影| 911精品产国品一二三产区 | 成人app在线| 午夜电影一区二区| 午夜精品福利一区二区三区av| 欧美一区二区三区在线视频 | 欧美性大战久久久久久久| 国内精品免费在线观看| 一区二区三区欧美激情| 亚洲一二三四区| 日本中文字幕不卡| 亚洲宅男天堂在线观看无病毒| 亚洲精品免费在线播放| 欧美激情一区二区三区在线| 国产精品成人免费| 日韩影院在线观看| 一本大道av伊人久久综合| 91免费观看视频在线| 欧美日韩综合色| 99精品桃花视频在线观看| 一本色道久久综合亚洲91 | 亚洲电影视频在线| 日本中文一区二区三区| 国产精品久久久久aaaa樱花| 亚洲欧美日韩中文播放| 国产三级欧美三级日产三级99 | 日本高清视频一区二区| 成人sese在线| 欧美丝袜第三区| 免费观看在线综合色| 亚洲美女精品一区| 日韩和欧美的一区| 午夜视频一区在线观看| 国产自产视频一区二区三区| 激情小说欧美图片| 成人av片在线观看| 不卡一区二区中文字幕| 精品视频资源站| 性做久久久久久| 国产风韵犹存在线视精品| 欧美中文字幕久久| 欧美性生活久久| 久久免费午夜影院| 午夜国产不卡在线观看视频| 日韩在线一区二区三区| jizzjizzjizz欧美| 中文字幕中文在线不卡住| 欧美日韩国产在线观看| 欧美日韩另类一区| 亚洲蜜臀av乱码久久精品| 午夜精品福利在线| av福利精品导航| 国产欧美精品日韩区二区麻豆天美| 一区二区在线观看视频| 国产一区91精品张津瑜| 欧美蜜桃一区二区三区| 综合激情网...| fc2成人免费人成在线观看播放 | 亚洲国产视频一区二区| 色乱码一区二区三区88| 欧美激情一区二区三区全黄| hitomi一区二区三区精品| 久久亚区不卡日本| 亚洲乱码中文字幕综合| 4438亚洲最大| 国产高清无密码一区二区三区| **欧美大码日韩| 中文字幕在线观看一区| 91麻豆精品国产91久久久使用方法| 久久久久国产精品麻豆ai换脸| 欧美一二三在线| 精品少妇一区二区三区在线播放| 国产喂奶挤奶一区二区三区| 亚洲欧美一区二区不卡| 亚洲国产日韩a在线播放性色| 日韩av在线免费观看不卡| 精品一区二区在线视频| 欧美美女一区二区三区| 一级女性全黄久久生活片免费| 色偷偷一区二区三区| 欧美刺激午夜性久久久久久久| 亚洲影视在线观看| 在线一区二区三区| 亚洲综合免费观看高清完整版在线 | 亚洲一二三专区| 欧美中文字幕一区二区三区| 一区二区国产视频| 欧美三片在线视频观看| 国产亚洲欧美日韩日本| 一区二区三区在线视频免费观看| 99精品久久只有精品| 亚洲欧美国产毛片在线| 91色在线porny| 日韩三级视频在线看| 日本欧美肥老太交大片| 99久久免费精品| 5858s免费视频成人| 日韩精品资源二区在线| 精品国产制服丝袜高跟| 国产精品久久久久久久久晋中| 成人美女在线视频| 日韩精品在线一区二区| 亚洲精品亚洲人成人网在线播放| 97se狠狠狠综合亚洲狠狠| 亚洲综合激情另类小说区| 欧美精品久久一区| 亚洲日本一区二区| 欧美少妇一区二区| 中文字幕亚洲视频| 亚洲午夜一区二区三区| 97久久超碰国产精品| 26uuu亚洲| 日本成人超碰在线观看|