[料理佳餚] 在 Windows Server 2016/2019 建立 RAM Disk

在雲端上的虛擬機器,其磁碟機會是個瓶頸,以 GCE 為例,如果應用程式需要讀寫大量的小檔,就會發現磁碟機的 IOPS 不太夠用,這時候就要增加磁碟機空間或是增加 CPU 的核心數,磁碟機的 IOPS 才會隨之增加,但是為此所增加的磁碟機空間或是 CPU 的核心數,我們根本就用不了那麼多,所以我就想說建立 RAM Disk,檔案從裡面存取,在離峰時間才執行指令將檔案備份到永久磁碟去,Windows Server 上有方法可以建立 RAM Disk,我們來看看怎麼做?

我操作用的 Windows Server 版本是 2016,而 2019 也適用。

安裝 iSCSI Target Server

我們在 Server Manager,點擊「Manage」->「Add Roles and Features」。

勾選「iSCSI Target Server」安裝起來

允許 iSCSI Service 通過防火牆

在「Windows Firewall」的設定中,點選「Allow an app or feature through Windows Firewall」。

勾選「iSCSI Service」及想要通過的網路類型

確認 iSCSI Target 的 AllowLoopback 值為 1

打開 Registry Editor,確認 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\iSCSI Target 底下 AllowLoopback 的值要為 1。

新增 RAM Disk

打開 PowerShell 執行下面指令,新增 RAM Disk。

New-IscsiVirtualDisk -Path "ramdisk:WIM-RAMDisk.vhdx" -Size 1GB -ComputerName "XXX"

  • -Path:格式為 "ramdisk:xxx.vhdx"
  • -Size:容量大小
  • -ComputerName:NetBIOS 的電腦名稱

NetBIOS 的電腦名稱可以從下圖的設定畫面中找得到

新增 iSCSI Target

執行下面指令,新增 iSCSI Target

New-IscsiServerTarget -TargetName targetRAMDisk -InitiatorIds @("IPAddress:X.X.X.X") -ComputerName "XXX"

  • -TargetName:自訂的 iSCSI Target 名稱
  • IPAddress:填入目前本機的 IP 位址

連結 iSCSI Target 及 RAM Disk

執行下面指令,將 iSCSI Target 及 RAM Disk 連結起來

Add-IscsiVirtualDiskTargetMapping -TargetName targetRAMDisk -DevicePath "ramdisk:WIM-RAMDisk.vhdx" -ComputerName "XXX"

連線 iSCSI Target

在 Server Manager,點擊「Tools」->「iSCSI Initiator」。

Target 輸入剛剛新增的 iSCIS Target IP 位址,點擊「Quick Connect...」。

沒意外的話,應該會出現我們剛剛新增的 iSCSI Target,點擊「Done」。

最後,打開「Disk Management」應該就可以看到一個還未被分配的磁碟機,我們就可以拿它來建立 Volume。

結論

雖然我們經歷這麼多步驟,把 RAM Disk 建立起來,但是結果是不理想的,因為它是走的是 iSCSI 介面,網路硬體不夠快的話,它的效能就不好,在我們家的環境底下,比起用像是 SoftPerfect RAM Disk 這類第三方軟體建立起來的 RAM Disk,效能只有十分之一,所以想要用這種方法建立 RAM Disk 起來用的朋友,請三思。

參考資料

C# 指南 ASP.NET 教學 ASP.NET MVC 指引
Azure SQL Database 教學 SQL Server 教學 Xamarin.Forms 教學