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