Azure - 在 Azure SQL Server VM 上使用 Temporary Disk
前言
最近在 Azure 上重建自己的 Azure DevOps Server 2019 的環境,然後既赫然發現,VM 出到 V4 的版本了,當然,V4 不算是什麼大新聞,畢竟隨著時間,一路出,出到 V8 到 XG 都有可能呢 ( 謎之聲 : XG 是啥鬼 ),不過在看 V4 的時候,發現了幾個有趣的東西,第一個,當然就是 AMD 的 CPU 規格的 Da 系列 ( DaV4 和支援 SSD 的 DasV4 ),畢竟現在 AMD 如日中天,連 Linux 之父,還有好朋友安神,都開始使用 AMD 呢,當然,除了 AMD 外,還有 Intel 規格的 Dd 系列 ( DdV4 和支援 SSD 的 DdsV4 ),不過這一樣也不意外,畢竟 Intel CPU 從以前到現在,已經很多代了。那最讓人意外的就是 Dv4 系列 那著個系列有什麼特別的呢,是的,他預設沒有包含 Temporary Disk..,換言之開啟這系列後,那預設的不能存東西的謎之 D 槽,就不會出現了!!當然,沒有 Temporary Disk 也比較便宜。
Note : V3 之前,Dv3 或是 Dsv3 都包含 Temporary Disk 的,但 V4 開始, Dv4 和 Dsv4 卻不包含,然後有包含的名稱改為 Ddv4 和 Ddsv4 ( 搞得我好混亂啊!! )
好,也因為新出的版本,有不包含 Temporary Disk 版本,所以小弟就特別跑去問了一下 Dino 哥,為什麼要出這個版本和使用情境,總而言之,就是 沒有 Temporary Disk 的比較便宜,而有很多情況下,大家也不一定會使用到 Temporary Disk。
而有些追求效能者,就可能會把一些暫存的東西放到 Temporary Disk 裡面去,例如下載檔案時,可能動態產生的暫存檔,又或是 SQL Server 的 TempDB 等等。
所以,這篇主要就以 SQL Server 為範例,將 TempDB 放到 Temporary Disk 來提升效能。
效能與限制
沒錯,放到 Temporary Disk 上,效能會比較好喔,但,為什麼?放到 C 不是也應該一樣快嗎,其實 Azure VM 上的 Disk,為了讓 VM 升級,關機等等動作,還能保留原本的檔案,所以掛載上去的 C,其實就是 Azure Storage ( 也不意外啦,大家應該也都知道了 ),但畢竟 Storage 不是在本機 VM 上,而 Temporary Disk 則是直接從實體的那台機器開出來的 D 槽,所以效能來說,Temporary Disk 是會比較快的。
但也因為是從實體開出來的 D 槽,所以當你的 VM 關閉、升級等等情況,D 槽的東西,自然也就會不見了,畢竟 VM 換位置了嘛,也因此,Temporary Disk 適合這種暫存的這種情境。
接下來,就是簡單的 SQL Server on Azure VM 調整方案。
將 TempDB 轉移到 D
第一步驟很簡單,就只是將 TempDB 轉到 D,我們可以透過 SSMS 等工具,執行底下的指令。 當然,前提要先在 D 建立 SQLTemp,或是大家喜歡的目錄。
USE MASTER
GO
ALTER DATABASE tempdb MODIFY FILE (NAME= tempdev, FILENAME= 'D:\SQLTemp\tempdb.mdf')
GO
ALTER DATABASE tempdb MODIFY FILE (name = templog, filename = 'D:\SQLTemp\templog.ldf')
GO
在 SSD 中配置緩衝池擴展
完成後,繼續設定,這邊要設定 Buffer Pool Extension,這邊的大小,建議是 VM Ram 的 4~6 倍。
ALTER SERVER CONFIGURATION
SET BUFFER POOL EXTENSION ON
( FILENAME = 'D:\SQLTemp\ExtensionFile.BPE' , SIZE = 128 GB )
將 SQL Server 服務從自動改成手動
因為關機後, D:\SQLTemp 就會消失,而 SQL Server 不會自己建立此目錄,而此時若 SQL Server 啟動後,就會 GG 了,所以我們要將 SQL Server 改為手動啟用,當我們把 D:\SQLTemp 準備好後,再啟動 SQL Server。
建立 PS 檔案
接下來,我們要建立一個 PowerShell 的檔案,這個檔案會幫我們建立 D:\SQLTemp,而且還會啟動 SQL Server。
我們就建立在 C:\ 下吧,就把它叫做 SQLServerInit.ps1。
$SQLService="SQL Server (MSSQLSERVER)"
$SQLAgentService="SQL Server Agent (MSSQLSERVER)"
$tempfolder="D:\SQLTemp"
if (!(test-path -path $tempfolder)) {
New-Item -ItemType directory -Path $tempfolder
}
Start-Service $SQLService
Start-Service $SQLAgentService
完成之後,我們要修改一下執行 PowerShell 的權限,執行底下指令,這樣剛剛的 SQLServerInit.ps1 才能順利執行。
Set-ExecutionPolicy RemoteSigned
加上開機啟動排程
最後一步驟,我們只要在 Windows Server 上,打開工作排程器,並建立一個基本工作,如下圖,讓他開機的時候,能執行我們上述的 Init。
另外,也別忘記調整成,不需要此帳號登入,就會執行。
完成後,就是重開機試試看了,順利的話,就會使用 D:\SQLTemp。
後記
這邊只是簡單的使用 SQL Server TempDB 來當作範例,但其實還是有很多地方的快取可以存放在這邊喔,當然,還是要注意,關機就沒了喔。