控制 tempdb 活動在驅動器之間的拆分方式(固態驅動器和旋轉驅動器上的 tempdb)
我在一小時內看到以下 tempdb I/O 行為:
機器上執行的多個 DW 工作負載會產生相當多的磁碟 I/O,其中一些無法容納分配給 SQL 的約 280GB 記憶體。有趣的一個方面是,如此多的 I/O 集中在旋轉磁碟驅動器 (E) 上,而不是更有效地處理 I/O 的固態驅動器(F 和 G)。
我們已將 F 和 G 驅動器上的全部 300GB(總共 600GB)預分配給 tempdb(使用 12 個文件),我們已將 1.3TB 預分配給 E 驅動器上的 tempdb(目前為 1 個文件)。上面的 I/O 數據表明 tempdb 的使用是根據文件的目前大小分佈在文件中的。我無法找到這方面的文件,但我還執行瞭如下查詢以進一步調查:
-- While running this query, writes to tempdb are distributed to E/F/G drives -- in proportion to their current size. This was shown by both -- sys.dm_io_virtual_file_stats and the space used on the tempdb files before and after SELECT TOP 100000000 * INTO #temp FROM [A_Really_Big_Table]
理想的行為是 F 和 G 被獨占使用,除非它們都已滿,在這種情況下,旋轉磁碟驅動器應提供額外的 tempdb 空間,以便偶爾處理非常大的工作負載而不會耗盡 tempdb 空間。
我們是否在觀察 tempdb 使用量是根據文件的目前大小分佈在文件之間的正確軌道?看到這種類型的分佈而不是看到每個文件的平等使用有點令人驚訝(這可能是任何人設置此硬體並決定只分配一個到旋轉磁碟上的 tempdb 的假設)。
根據 Paul White 對此問題的回應,我們正在考慮以下方法:
- 收縮旋轉磁碟上的 tempdb 文件。根據我們的初始測試,這應該會將目前的工作分配更多地轉移到固態驅動器上
- 配置固態 tempdb 文件以預先分配它們的空間(就像我們現在所做的那樣)
- 將旋轉磁碟 tempdb 文件配置為無分配啟動。確保即時文件初始化已打開。Tempdb 只會根據需要在旋轉磁碟上增長(可能最多每週一次)。
- 創建一個維護計劃,在峰值負載時間後縮小旋轉磁碟上的 tempdb 文件,使分發重新有利於固態 tempdb 文件。
這看起來合理嗎?是否有任何替代方法或潛在問題需要考慮?我們顯然會盡可能地測試該方法,但無法在完全等效的測試硬體上這樣做。
文件寫入根據文件組中每個文件的目前大小按比例分佈在同一文件組中的文件中。這被稱為“比例填充算法” - 查看http://sqlserver-performance-tuning.net/?p=2552了解一些有趣的細節。
tempdb
只能有一個文件組。如果您嘗試在其中創建文件組,tempdb
則會得到以下資訊:Msg 1826, Level 16, State 1, Line 1 User-defined filegroups are not allowed on "tempdb".
如果您打開了跟踪標誌 1117,組中的文件將在文件組中的文件之間同時自動增長,對於目前未達到最大大小且磁碟上存在空間的每個文件。
您的實例是否打開了跟踪標誌 1117?即使“最佳實踐”通常表明已啟用此功能,您也可能希望在此特定情況下將其關閉。Microsoft Connect 上有一個項目要求有這樣的設置,可以在每個數據庫的基礎上啟用/禁用,這裡: https ://connect.microsoft.com/SQLServer/feedback/details/781198/trace-flag -1117-autogrowth-of-data-files-is-instance-wide-would-like-a-flag-for-just-tempdb
假設 SSD 專用於 tempdb,我同意您的斷言,並建議將 SSD 上的 tempdb 盡可能大(不是 100% 的驅動器,可能留出 10% 的空閒空間)。使磁碟上的 tempdb 文件盡可能小,比如 1MB,具有自動增長功能,並且最大文件大小盡可能大。監控 HDD 上的 tempdb 文件增長情況,如果您認為公司會從中受益,請提出購買更大 SSD 的理由。
ALTER DATABASE ... ADD FILE
根據文件,可以在語法中僅使用分區的驅動器號在原始分區(尚未格式化的分區)上創建 SQL Server 文件。這顯然消除了增大或縮小文件的需要,因為它根據需要固有地使用整個原始分區。我不確定這是否會對您的情況有所幫助;只是想我會把它作為一個有趣的事實扔出去。請參閱“如果文件位於原始分區上,則 os_file_name 必須僅指定現有原始分區的驅動器號。每個原始分區上只能放置一個文件。”