Windows 存储空间分层存储不使用 nvme 驱动器?

Windows 存储空间分层存储不使用 nvme 驱动器?

我正在尝试运行以太坊完整节点 (geth v1.10),并进行大数据分析存档。完全同步后,存储需求预计为 8TB。

我有一台 Synology NAS,它通过 iScsi 提供 8TB LUN(最大吞吐量约为 ~120 MB/s)我的 HyperV Windows 服务器(2019 v1809)有一个 1TB 本地连接的 NVMe 驱动器。我将 1 TB NVME 与 8TB iscsi 结合使用,使用带分层的存储空间(不是直接存储空间),没有镜像或任何数据冗余。使用分层存储池中的两个磁盘(iscsi 8TB HDD + 1TB NVME),我创建了一个 8TB 虚拟磁盘并在 Linux VM 中使用它。

我的目标是通过分层存储 NVME 加速相关近期热数据的 I/O,而 8TB HDD 则加速容量和较冷的数据。

当查看 Windows 性能监视器时,我注意到我的 SSDTier 似乎没有被读取或写入? 此外,存储空间写入缓存为 1GB,读写绕过率 >90%。不确定缓存具体是什么(SSD 层?还是其他内部缓存?)

使用 dd 的内部测试似乎显示大约 380MB/s,但我认为缓存以某种方式受到了影响。

user1@ether:/eth1/bin$ dd if=/dev/zero of=/eth1/temp oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 11.3336 s, 379 MB/s

同样的测试,但使用 urandom

user1@ether:/eth1$ dd if=/dev/urandom of=/eth1/temp oflag=direct bs=128k count=32k
32768+0 records in
32768+0 records out
4294967296 bytes (4.3 GB, 4.0 GiB) copied, 64.8097 s, 66.3 MB/s

缓存未被使用?

下面是我运行的脚本,用于设置存储池、存储层并在 hyperv 主机上创建虚拟驱动器

    # RUN AS ADMINISTRATOR
    # https://nils.schimmelmann.us/post/153541254987/intel-smart-response-technology-vs-windows-10
    #Tested with one SSD and two HDD
    #
    #Pool that will suck in all drives
    $StoragePoolName = "ETH-Data-Pool"
    #Tiers in the storage pool
    $SSDTierName = "SSDTier"
    $HDDTierName = "HDDTier"
    #Virtual Disk Name made up of disks in both tiers
    $TieredDiskName = "ETH-Data-Disk"
    
    #Simple = striped.  Mirror only works if both can mirror AFIK
    #https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/dn387076(v=ws.11)
    $DriveTierResiliency = "Simple"
    
    #Change to suit - drive later and the label name
    $TieredDriveLetter = "K"
    $TieredDriveLabel = "Data_Tiered"
    
    #Override the default sizing here - useful if have two different size SSDs or HDDs - set to smallest of pair
    #These must be Equal or smaller than the disk size available in that tier SSD and HDD
    #SSD:cache  -    HDD:data
    #set to null so copy/paste to command prompt doesn't have previous run values
    $SSDTierSize = $null
    $HDDTierSize = $null
    #Drives cannot always be fully allocated - probably broken for drives < 10GB
    $UsableSpace = 0.99
    
    #Uncomment and put your HDD type here if it shows up as unspecified with "Get-PhysicalDisk -CanPool $True
    #    If your HDDs show up as Unspecified instead of HDD
    $UseUnspecifiedDriveIsHDD = "Yes"
    
    #List all disks that can be pooled and output in table format (format-table)
    Get-PhysicalDisk -CanPool $True | ft FriendlyName, OperationalStatus, Size, MediaType
    
    #Store all physical disks that can be pooled into a variable, $PhysicalDisks
    #    This assumes you want all raw / unpartitioned disks to end up in your pool - 
    #    Add a clause like the example with your drive name to stop that drive from being included
    #    Example  " | Where FriendlyName -NE "ATA LITEONIT LCS-256"
    if ($UseUnspecifiedDriveIsHDD -ne $null){
        $DisksToChange = (Get-PhysicalDisk -CanPool $True | where MediaType -eq Unspecified)
        Get-PhysicalDisk -CanPool $True | where MediaType -eq Unspecified | Set-PhysicalDisk -MediaType HDD
        # show the type changed
        Get-PhysicalDisk -CanPool $True | ft FriendlyName, OperationalStatus, Size, MediaType
    }
    $PhysicalDisks = (Get-PhysicalDisk -CanPool $True | Where MediaType -NE UnSpecified)
    if ($PhysicalDisks -eq $null){
        throw "Abort! No physical Disks available"
    }       
    
    #Create a new Storage Pool using the disks in variable $PhysicalDisks with a name of My Storage Pool
    $SubSysName = (Get-StorageSubSystem).FriendlyName
    New-StoragePool -PhysicalDisks $PhysicalDisks -StorageSubSystemFriendlyName $SubSysName -FriendlyName $StoragePoolName
    #View the disks in the Storage Pool just created
    Get-StoragePool -FriendlyName $StoragePoolName | Get-PhysicalDisk | Select FriendlyName, MediaType
    
    #Set the number of columns used for each resiliency - This setting assumes you have at least 2-SSD and 2-HDD
    # Get-StoragePool $StoragePoolName | Set-ResiliencySetting -Name Simple -NumberOfColumnsDefault 2
    # Get-StoragePool $StoragePoolName | Set-ResiliencySetting -Name Mirror -NumberOfColumnsDefault 1
    
    #Create two tiers in the Storage Pool created. One for SSD disks and one for HDD disks
    $SSDTier = New-StorageTier -StoragePoolFriendlyName $StoragePoolName -FriendlyName $SSDTierName -MediaType SSD
    $HDDTier = New-StorageTier -StoragePoolFriendlyName $StoragePoolName -FriendlyName $HDDTierName -MediaType HDD
    
    #Calculate tier sizes within this storage pool
    #Can override by setting sizes at top
    if ($SSDTierSize -eq $null){
        $SSDTierSize = (Get-StorageTierSupportedSize -FriendlyName $SSDTierName -ResiliencySettingName $DriveTierResiliency).TierSizeMax
        $SSDTierSize = [int64]($SSDTierSize * $UsableSpace)
    }
    if ($HDDTierSize -eq $null){
        $HDDTierSize = (Get-StorageTierSupportedSize -FriendlyName $HDDTierName -ResiliencySettingName $DriveTierResiliency).TierSizeMax 
        $HDDTierSize = [int64]($HDDTierSize * $UsableSpace)
    }
    Write-Output "TierSizes: ( $SSDTierSize , $HDDTierSize )"
    
    # you can end up with different number of columns in SSD - Ex: With Simple 1SSD and 2HDD could end up with SSD-1Col, HDD-2Col
    New-VirtualDisk -StoragePoolFriendlyName $StoragePoolName -FriendlyName $TieredDiskName -StorageTiers @($SSDTier, $HDDTier) -StorageTierSizes @($SSDTierSize, $HDDTierSize) -ResiliencySettingName $DriveTierResiliency -AutoWriteCacheSize -AutoNumberOfColumns
    
    # initialize the disk, format and mount as a single volume
    Write-Output "preparing volume"
    Get-VirtualDisk $TieredDiskName | Get-Disk | Initialize-Disk -PartitionStyle GPT
    # This will be Partition 2.  Storage pool metadata is in Partition 1
    Get-VirtualDisk $TieredDiskName | Get-Disk | New-Partition -DriveLetter $TieredDriveLetter -UseMaximumSize
    Initialize-Volume -DriveLetter $TieredDriveLetter -FileSystem NTFS -Confirm:$false -NewFileSystemLabel $TieredDriveLabel
    Get-Volume -DriveLetter $TieredDriveLetter
    
    Write-Output "Operation complete"

答案1

该问题与 NTFS 格式的虚拟磁盘有关。我进行了一些测试,使用 NTFS 分层存储空间在 WS2019 上不使用热层。您应该使用 ReFS 对其进行格式化或使用 Windows Server 2016。

相关内容