国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
當前位置: 首頁 - 科技 - 知識百科 - 正文

SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中)

來源:懂視網(wǎng) 責編:小采 時間:2020-11-09 07:02:42
文檔

SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中)

SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中): 通過上篇文章給大家介紹了SqlServer應用之sys.dm_os_waiting_tasks 引發(fā)的疑問(上) ,說了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在獲取并行等待的時候得不同結(jié)果,這一篇我們談論下我的第二個疑問:為什么一個并行計劃(4線程)卻一下出現(xiàn)
推薦度:
導讀SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中): 通過上篇文章給大家介紹了SqlServer應用之sys.dm_os_waiting_tasks 引發(fā)的疑問(上) ,說了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在獲取并行等待的時候得不同結(jié)果,這一篇我們談論下我的第二個疑問:為什么一個并行計劃(4線程)卻一下出現(xiàn)

 通過上篇文章給大家介紹了SqlServer應用之sys.dm_os_waiting_tasks 引發(fā)的疑問(上) ,說了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在獲取并行等待的時候得不同結(jié)果,這一篇我們談論下我的第二個疑問:為什么一個并行計劃(4線程)卻一下出現(xiàn)了那么多等待,SQL的并行到底是怎么執(zhí)行的!!!!

    先貼以下上篇sys.dm_os_waiting_tasks 的結(jié)果圖:

     我們分析一下這個結(jié)果的task_address 可以看出去掉重復其實只有9個,也就是說一個并行(4線程,配置不同,情況也不同)會有9個task。 又是線程,又是task ,還有worker,schedulers 這些都是什么? 這個有必要先說一下,因為這篇博客前我也是亂亂的。

 scheduler

對于每個邏輯CPU,SQLSERVER會有一個scheduler與之對應,在SQL層面上代表CPU對象,只有拿到scheduler所有權(quán)的任務worker才能在這個邏輯CPU上運行

所謂邏輯CPU,就是SQLSERVER從Windows層面上看到的CPU數(shù)目,如果是一個雙核的CPU,那么一個物理CPU在SQL看來就是兩個邏輯CPU。如果系統(tǒng)還使用了

超線程hyper-threaded ,那對SQLSERVER來講就是4個邏輯CPU

規(guī)則: 每個scheduler上的最大worker數(shù)目等于SQLSERVER的最大線程數(shù)除以scheduler的數(shù)目 ,在同一個時間點,只能有一個擁有scheduler的worker處于運行狀態(tài),其他worker都必須處于等待狀態(tài)。這樣能降低每個邏輯CPU上的處于正在運行狀態(tài)的線程數(shù)目,降低context switch,提供可擴展性scheduler是SQLSERVER的一個邏輯概念,他不與物理CPU相綁定。也就是說,一個scheduler可以被Windows安排一會兒在這個CPU上,一會兒在那個CPU上。

 但是,如果在sp_configure里設置了CPU affinity mask,那么scheduler就會固定在某個特定的CPU上

worker

每個worker跟一個線程(或纖程fiber)相對應,是SQLSERVER任務的執(zhí)行單位。SQLSERVER不直接調(diào)度線程/纖程,而是調(diào)度worker,使得SQLSERVER能夠控制

任務調(diào)度

規(guī)則: 每個worker會固定代表一個線程(或纖程),并且和一個scheduler相綁定。如果scheduler是固定在某個CPU上的(通過設置CPU affinity mask),那么worker也會固定在某個CPU上每個scheduler有worker的上限值,并且可以根據(jù)SQLSERVER工作負荷創(chuàng)建或釋放worker,每次worker都會去運行一個完整的任務(task)。在任務做完之前不會退出,除非這個任務主動進入等待狀態(tài)。

scheduler只在有新任務要運行,而當前沒有空閑的worker的情況下,才會創(chuàng)建新的worker。

某個worker空閑超過15分鐘,scheduler可能會刪除這個worker,以及其對應的線程。當SQLSERVER遇到內(nèi)存壓力的時,也會大量刪除處于空閑狀態(tài)的worker,以節(jié)省multi-page的內(nèi)存開銷各種CPU和SQLSERVER版本組合自動配置的最大工作線程數(shù)CPU數(shù)                 32位計算機                        64位計算機
<=4                     256                                  512
8                          288                                  576
16                        352                                  704
32                        480                                  960

task

在worker上運行的最小任務單元。最簡單的task就是一個簡單batch。例如,客戶發(fā)過來下面的請求:

 SELECT @@SERVERNAME
 GO
 SELECT GETDATE()
 GO 

那么這兩個batch就分別是兩個task。SQLSERVER會先分配給第一個batch(select @@servername)一個worker,將結(jié)果返回給客戶端,再分配第二個batch

(select getdate())一個worker。這兩個worker可能是不同的worker,甚至在不同的scheduler上只要一個task開始運行,他就不會從這個worker上被移出。例如,如果一個select語句被其他連接阻塞住,worker就不能繼續(xù)運行,只能進入等待狀態(tài)。但是這個select task 不會將這個worker釋放,讓他做其他任務。所以結(jié)果是這個worker所對應的線程會進入等待狀態(tài)

yielding

 SQLOS的任務調(diào)度算法的核心,就是所有在邏輯scheduler上運行的worker都是非搶占式的 (non-preemptive)。worker始終在scheduler上運行,直到他運行結(jié)束,或者主動將scheduler讓出給其他worker為止。這個“讓出”scheduler的動作,我們叫yieding每個scheduler都會有一個runnable列表,所有等待CPU運行的worker都會在這個列表里排隊,以先進先出的算法,等待SQL分配給他scheduler運行SQLSERVER定義了很多yieding的規(guī)則,約束一個task在scheduler運行的時間。如果task比較復雜,不能很快完成,會保證task在合適的時間點做yieding,不至于占用scheduler太多時間。

常見時間點:

1、當worker每次要去讀數(shù)據(jù)頁的時候,SQLSERVER會檢查這個worker已經(jīng)在scheduler上運行了多久,如果已經(jīng)超過4ms,就做yielding

2、每做64KB的結(jié)果集排序,就會做一次yielding

3、在做語句編譯compile的過程中(這個過程比較占CPU資源),經(jīng)常會有yieding

4、如果客戶端不能及時把結(jié)果集取走,worker就會做yieding

5、一個batch里的每一句話做完,都會做一次yieding

正常來講,哪怕一個task要做很久,他使用的worker是會經(jīng)常做yieding的,不會長時間占用CPU不放。如果在一個scheduler上同時有很多worker要運行,SQLSERVER通過worker自動yielding的方式調(diào)度并發(fā)運行。這個比Windows用上下文切換context switch更有效

    另附一張手繪圖

    另外推薦一篇 SQL SERVER SQLOS的任務調(diào)度 微軟亞太的官方博客

    我們大概了解了一下SQL SERVER SQLOS的任務調(diào)度 我們回到我們的并行話題看一下這個并行執(zhí)行的調(diào)度情況: 


    一個并行處理分配給了9個task,同時也啟用了9個worker,由4個scheduler調(diào)度,每個scheduler分別由一個申請數(shù)據(jù),另一個等待。那么申請數(shù)據(jù)的是可以理解的,等待的是干什么的呢?個人理解和當前的執(zhí)行計劃有關(guān),4個線程取得數(shù)據(jù)后要做匯總的操作SQL不會等待數(shù)據(jù)獲取以后再開啟線程接收,而是接收線程在獲取數(shù)據(jù)的時候等待。

     

 疑問得到解決了么?因為已經(jīng)標記為中篇,可見還是有疑問呀!!!!我們繼續(xù)下一篇吧....

您可能感興趣的文章:

  • SqlServer應用之sys.dm_os_waiting_tasks 引發(fā)的疑問(上)
  • SQL Server 2016里的sys.dm_exec_input_buffer的問題
  • 聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中)

    SqlServer應用之sys.dm_os_waiting_tasks引發(fā)的疑問(中): 通過上篇文章給大家介紹了SqlServer應用之sys.dm_os_waiting_tasks 引發(fā)的疑問(上) ,說了一下sys.dm_exec_requests 和 sys.dm_os_waiting_tasks 在獲取并行等待的時候得不同結(jié)果,這一篇我們談論下我的第二個疑問:為什么一個并行計劃(4線程)卻一下出現(xiàn)
    推薦度:
    標簽: os 疑問 sqlserver
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 欧美极品第一页 | 久久久91精品国产一区二区 | 日韩中文在线观看 | 国产在线视欧美亚综合 | 国产一区二区三区夜色 | 91综合| 在线观看欧美国产 | 国产九九精品 | 久久亚洲精品国产精品婷婷 | 久久婷婷影院 | 91久久精品国产亚洲 | 欧美日韩精品在线播放 | 特黄一级毛片 | 美日韩精品 | 国产一区二区三区在线视频 | 国产视频资源在线观看 | 国产伦精品一区二区三区高清 | 日本一区二区三区高清在线观看 | 日韩亚洲视频 | 足交在线观看 | 美女视频黄全免费的 | 国产精品免费观在线 | 在线欧美精品二区三区 | 国产 欧美 日本 | 九九久久99综合一区二区 | 欧美色图一区二区 | 黄色一级视频免费看 | 精品久久久一二三区 | 91在线精品亚洲一区二区 | 97精品国产97久久久久久 | 美日韩在线 | 国模冰冰双人炮gogo | 另类欧美亚洲 | 精品久久亚洲一级α | 欧美日韩一区二区在线 | 日韩 欧美 综合 在线 制服 | 亚洲一区二区三区久久久久 | 国产高清视频免费在线观看 | 成人三级在线观看 | 亚洲精品成人久久久影院 | 国产精品1000部在线观看 |