原文出處:Increased SOS_SCHEDULER_YIELD waits on virtual machines 註: 原文的用詞是Increased,想譯作增強(增長),或者加強,這麼譯起來是褒義詞,而原文要表達的Increased並沒有褒義的含義,最起碼是一個中性的含義,想來想起用一個“ ...
原文出處:Increased SOS_SCHEDULER_YIELD waits on virtual machines
註:
原文的用詞是Increased,想譯作增強(增長),或者加強,這麼譯起來是褒義詞,而原文要表達的Increased並沒有褒義的含義,
最起碼是一個中性的含義,想來想起用一個“滋長”偏編譯的含義還是比較合適的,感覺還是有點過於貶義了,還是用最通俗的增多吧。
個人英語水平有限,另外就是對於文中提到的“rdtsc周期”也不是非常清楚,翻譯的也不是很清楚,權當是自娛自樂。
總是原文的意思就是虛擬環境下:因為虛擬CPU與物理CPU之間的調度關係(而不是SQLOS直接調度物理CPU),因此在虛擬環境下,sqlserver的SOS_SCHEDULER_YIELD等待類型會出現的機會將會更多。
譯文:
當我在幾個月之前講授等待統計(wait statistics)的時候,被問到sqlserver運行在虛擬機上的時候,是否存在與預期不同的等待統計(waits stats )
我的答案為“是”,如果某種因素妨礙了虛擬機運行的情況下,有可能會看到更長的等待時間,
由於等待時間是基於rdtsc計數器(本質上是處理器的處理器時鐘周期數)在等待開始和結束時間的不同。
因為虛擬主機基於物理硬體的CPU被超額“虛擬化”,VM必須等待虛擬CPU的調度,在SQL Server中所記錄到的實際資源等待時間將包括VM無法運行的時間,
因此等待時間將會比VM沒有被延遲的時間長。
這一點是否存在疑問是非常有意思的,但是我的觀點是,為此可以導致一些人去調整sqlserver性能問題(譯註:認為是SQL Server自身調度所導致的SOS_SCHEDULER_YIELD),
而事實上是虛擬機性能問題,註意:這不是虛擬層的問題,而是因為虛擬機環境的錯誤配置。
不管怎麼說,課程結束後,我開始考慮通一個VM上的線程調度的普遍性存在的問題,它周期性地被延遲運行是否會對等待統計數據產生其他有趣的影響。
尤其是,我之前會關註有關於SOS_SCHEDULER_YIELD 的等待,這是一種典型的等待,
當一個線程能夠使用4ms的CPU時間(稱之為線程時間片)不需要暫停等待不可用的資源,
簡單地說就是,一個線程必須經常調用SQLOS層,以檢查它是否已經耗盡了線程的時間片,如果是這樣的話,它必須主動地放棄處理器,
當這種情況發生時,一個上下文的切換就發生了,此時一個等待類型必須被等級下來:SOS_SCHEDULER_YIELD,
對這種等待類型的更深層次的解釋是在我這裡(here)等待文章中。
我的推測就是:
如果一個虛擬機被阻止運行幾毫秒或更多,這可能意味著一個正在執行的線程可能會耗盡它的線程時間片而不會得到4ms的CPU時間,
因此讓出處理器導致一個SOS_SCHEDULER_YIELD 類型的等待被記錄
如果這種情況發生了很多,它可能會生成一組等待的統計數據,這些統計數據顯示有大量的 SOS_SCHEDULER_YIELD產生,
而實際上,這實際上是一個VM性能問題,而 SOS_SCHEDULER_YIELD等待實際上是“假的”。
我與來自SQL產品組的好朋友Bob Ward討論這個問題,在進行了一些內部討論之後,
他們同意這是一種可能,因為線程的時間片耗盡時間是線上程開始執行時使用rdtsc進行計算的,所以VM運行的任何延遲都可能產生我所建議的效果。
鑒於我是一個虛擬機新手,我讓Jonathan 去執行一些我們虛擬機實驗室環境內部去觀察他是否能發生這個問題,
他運行了我們在浸入式事件中使用的已知工作負載,以演示主機過度訂閱(譯者註:可以理解為一臺物理機虛擬出來過多的虛擬機)的性能影響,促使虛擬機被延遲,
看吧,對比在相同的VM上運行相同的工作負載而不需要任何延遲的條件下,(虛擬機被延遲的情況下)他看到了大量的SOS_SCHEDULER_YIELD等待(大約20倍多)的工作負載水平。
在我們的超v實驗室環境中重覆了同樣的測試,在硬體和VM配置中都是一樣的,在VMware環境中也一樣,類似的多發性的SOS_SCHEDULER_YIELD等待也被看到,
因此,這個問題肯定不是特定於任何給定的虛擬層或者虛擬平臺,這完全與主機承受的工作負載有關,而SQL Server VM必須等待CPU資源繼續執行。
這裡我有意不展示Jonathan的測試結果,
因為我不具備解釋VMware esxtop輸出或Hyper-V性能計數器值以及它們如何與SSOS_SCHEDULER_YIELD數據產生的結果相關聯來揭示問題的關聯性,
Jonathan將在接下來的一兩周內做一篇後續文章,從虛擬化的角度來解釋這些結果。
儘管如此,通過一組簡單的測試,我們可以通過運行延遲的VM來顯示SQL Server工作負載可以顯示更高的SOS_SCHEDULER_YIELD 等待,因為使用rdtsc來計算線程的時間片耗盡時間。
這是非常有趣的,因為這是一個VM性能問題,導致等待類型出現,而不僅僅是導致等待時間更長。
如果你正在研究多發性的SOS_SCHEDULER_YIELD 等待,你一定要考慮這個現象,一個工作負載性能問題,並且你的工作組是運行在虛擬機上,
在下一篇文章中,我將在它發佈時鏈接到這裡,Jonathan將解釋如何將這些等待與VM性能問題的跡象相關聯。
希望有所幫助。