Delimitar a alocação de volumes no Espaços de Armazenamento DiretosDelimit the allocation of volumes in Storage Spaces Direct

Aplica-se a: Windows Server 2019Applies to: Windows Server 2019

O Windows Server 2019 apresenta uma opção para delimitar manualmente a alocação de volumes no Espaços de Armazenamento Diretos.Windows Server 2019 introduces an option to manually delimit the allocation of volumes in Storage Spaces Direct. Isso pode aumentar significativamente a tolerância a falhas sob determinadas condições, mas impõe algumas considerações e complexidade de gerenciamento adicionais.Doing so can significantly increase fault tolerance under certain conditions, but imposes some added management considerations and complexity. Este tópico explica como ele funciona e fornece exemplos no PowerShell.This topic explains how it works and gives examples in PowerShell.

Importante

Esse recurso é novo no Windows Server 2019.This feature is new in Windows Server 2019. Ele não está disponível no Windows Server 2016.It is not available in Windows Server 2016.

Pré-requisitosPrerequisites

Ícone de marca de seleção verde. Considere o uso desta opção se:Consider using this option if:

Ícone de X vermelho. Não use esta opção se:Do not use this option if:

EntenderUnderstand

Revisão: alocação regularReview: regular allocation

Com o espelhamento de três vias regular, o volume é dividido em muitas "Slabs" pequenas que são copiadas três vezes e distribuídas uniformemente em cada unidade em cada servidor no cluster.With regular three-way mirroring, the volume is divided into many small "slabs" that are copied three times and distributed evenly across every drive in every server in the cluster. Para obter mais detalhes, leia este blog aprofundado.For more details, read this deep dive blog.

Diagrama que mostra o volume que está sendo dividido em três pilhas de Slabs e distribuída uniformemente em todos os servidores.

Essa alocação padrão maximiza leituras e gravações paralelas, levando a um melhor desempenho e é atraente em sua simplicidade: cada servidor está igualmente ocupado, cada unidade está igualmente cheia e todos os volumes permanecem online ou ficam offline juntos.This default allocation maximizes parallel reads and writes, leading to better performance, and is appealing in its simplicity: every server is equally busy, every drive is equally full, and all volumes stay online or go offline together. Cada volume tem a garantia de sobreviver a duas falhas simultâneas, como mostram esses exemplos .Every volume is guaranteed to survive up to two concurrent failures, as these examples illustrate.

No entanto, com essa alocação, os volumes não podem sobreviver a três falhas simultâneas.However, with this allocation, volumes can't survive three concurrent failures. Se três servidores falharem ao mesmo tempo ou se as unidades em três servidores falharem ao mesmo tempo, os volumes se tornarão inacessíveis porque pelo menos alguns Slabs eram (com probabilidade muito alta) alocados às três unidades ou servidores exatos que falharam.If three servers fail at once, or if drives in three servers fail at once, volumes become inaccessible because at least some slabs were (with very high probability) allocated to the exact three drives or servers that failed.

No exemplo a seguir, os servidores 1, 3 e 5 falham ao mesmo tempo.In the example below, servers 1, 3, and 5 fail at the same time. Embora muitos Slabs tenham cópias sobreviventes, alguns não:Although many slabs have surviving copies, some do not:

Diagrama mostrando três de seis servidores realçados em vermelho e o volume geral é vermelho.

O volume fica offline e se torna inacessível até que os servidores sejam recuperados.The volume goes offline and becomes inaccessible until the servers are recovered.

Novo: alocação delimitadaNew: delimited allocation

Com a alocação delimitada, você especifica um subconjunto de servidores a serem usados (mínimo três para espelhamento triplo).With delimited allocation, you specify a subset of servers to use (minimum three for three-way mirror). O volume é dividido em Slabs que são copiados três vezes, como antes, mas em vez de alocar em cada servidor, os Slabs são alocados somente para o subconjunto de servidores que você especificar.The volume is divided into slabs that are copied three times, like before, but instead of allocating across every server, the slabs are allocated only to the subset of servers you specify.

Diagrama que mostra o volume que está sendo dividido em três pilhas de Slabs e é distribuído somente para três de seis servidores.

VantagensAdvantages

Com essa alocação, o volume provavelmente sobreviver a três falhas simultâneas: na verdade, sua probabilidade de sobrevivência aumenta de 0% (com alocação regular) para 95% (com alocação delimitada) nesse caso!With this allocation, the volume is likely to survive three concurrent failures: in fact, its probability of survival increases from 0% (with regular allocation) to 95% (with delimited allocation) in this case! Intuitivamente, isso ocorre porque ele não depende dos servidores 4, 5 ou 6, portanto, ele não é afetado por suas falhas.Intuitively, this is because it does not depend on servers 4, 5, or 6 so it is not affected by their failures.

No exemplo acima, os servidores 1, 3 e 5 falham ao mesmo tempo.In the example from above, servers 1, 3, and 5 fail at the same time. Como a alocação delimitada garantiu que o servidor 2 contém uma cópia de cada laje, cada laje tem uma cópia sobrevivente e o volume permanece online e acessível:Because delimited allocation ensured that server 2 contains a copy of every slab, every slab has a surviving copy and the volume stays online and accessible:

Diagrama mostrando três de seis servidores realçados em vermelho, mas o volume geral está verde.

A probabilidade de sobrevivência depende do número de servidores e outros fatores – consulte análise para obter detalhes.Survival probability depends on the number of servers and other factors – see Analysis for details.

DesvantagensDisadvantages

A alocação delimitada impõe algumas considerações e complexidade de gerenciamento adicionais:Delimited allocation imposes some added management considerations and complexity:

  1. O administrador é responsável por delimitar a alocação de cada volume para balancear a utilização de armazenamento entre os servidores e defender a alta probabilidade de sobrevivência, conforme descrito na seção práticas recomendadas .The administrator is responsible for delimiting the allocation of each volume to balance storage utilization across servers and uphold high probability of survival, as described in the Best practices section.

  2. Com a alocação delimitada, Reserve o equivalente de uma unidade de capacidade por servidor (sem máximo) .With delimited allocation, reserve the equivalent of one capacity drive per server (with no maximum). Isso é mais do que a recomendação publicada para alocação regular, que maximizar em quatro unidades de capacidade total.This is more than the published recommendation for regular allocation, which maxes out at four capacity drives total.

  3. Se um servidor falhar e precisar ser substituído, conforme descrito em remover um servidor e suas unidades, o administrador será responsável por atualizar a deslimitação dos volumes afetados adicionando o novo servidor e removendo o que falhou um – exemplo abaixo.If a server fails and needs to be replaced, as described in Remove a server and its drives, the administrator is responsible for updating the delimitation of affected volumes by adding the new server and removing the failed one – example below.

Uso no PowerShellUsage in PowerShell

Você pode usar o New-Volume cmdlet para criar volumes em espaços de armazenamento diretos.You can use the New-Volume cmdlet to create volumes in Storage Spaces Direct.

Por exemplo, para criar um volume de espelhamento de três vias regular:For example, to create a regular three-way mirror volume:

New-Volume -FriendlyName "MyRegularVolume" -Size 100GB

Criar um volume e delimitar sua alocaçãoCreate a volume and delimit its allocation

Para criar um volume de espelho de três vias e delimitar sua alocação:To create a three-way mirror volume and delimit its allocation:

  1. Primeiro, atribua os servidores no cluster à variável $Servers:First assign the servers in your cluster to the variable $Servers:

    $Servers = Get-StorageFaultDomain -Type StorageScaleUnit | Sort FriendlyName
    

    Dica

    No Espaços de Armazenamento Diretos, o termo "unidade de escala de armazenamento" refere-se a todo o armazenamento bruto conectado a um servidor, incluindo unidades conectadas diretamente e compartimentos externos conectados diretamente a unidades.In Storage Spaces Direct, the term 'Storage Scale Unit' refers to all the raw storage attached to one server, including direct-attached drives and direct-attached external enclosures with drives. Nesse contexto, ele é o mesmo que ' Server '.In this context, it's the same as 'server'.

  2. Especifique quais servidores usar com o novo -StorageFaultDomainsToUse parâmetro e indexação em. $ServersSpecify which servers to use with the new -StorageFaultDomainsToUse parameter and by indexing into $Servers. Por exemplo, para delimitar a alocação para o primeiro, o segundo e o terceiro servidores (índices 0, 1 e 2):For example, to delimit the allocation to the first, second, and third servers (indices 0, 1, and 2):

    New-Volume -FriendlyName "MyVolume" -Size 100GB -StorageFaultDomainsToUse $Servers[0,1,2]
    

Ver uma alocação delimitadaSee a delimited allocation

Para ver como myvolume é alocado, use o Get-VirtualDiskFootprintBySSU.ps1 script no Apêndice:To see how MyVolume is allocated, use the Get-VirtualDiskFootprintBySSU.ps1 script in Appendix:

PS C:\> .\Get-VirtualDiskFootprintBySSU.ps1

VirtualDiskFriendlyName TotalFootprint Server1 Server2 Server3 Server4 Server5 Server6
----------------------- -------------- ------- ------- ------- ------- ------- -------
MyVolume                300 GB         100 GB  100 GB  100 GB  0       0       0      

Observe que somente Server1, server2 e Server3 contêm Slabs de myvolume.Note that only Server1, Server2, and Server3 contains slabs of MyVolume.

Alterar uma alocação delimitadaChange a delimited allocation

Use os novos Add-StorageFaultDomain cmdlets e Remove-StorageFaultDomain para alterar como a alocação é delimitada.Use the new Add-StorageFaultDomain and Remove-StorageFaultDomain cmdlets to change how the allocation is delimited.

Por exemplo, para mover myvolume por um servidor:For example, to move MyVolume over by one server:

  1. Especifique que o quarto servidor pode armazenar Slabs de myvolume:Specify that the fourth server can store slabs of MyVolume:

    Get-VirtualDisk MyVolume | Add-StorageFaultDomain -StorageFaultDomains $Servers[3]
    
  2. Especifique que o primeiro servidor não pode armazenar Slabs de myvolume:Specify that the first server cannot store slabs of MyVolume:

    Get-VirtualDisk MyVolume | Remove-StorageFaultDomain -StorageFaultDomains $Servers[0]
    
  3. Equilibre o pool de armazenamento para que a alteração entre em vigor:Rebalance the storage pool for the change to take effect:

    Get-StoragePool S2D* | Optimize-StoragePool
    

Diagrama que mostra a Slabs migrar en-Mass dos servidores 1, 2 e 3 para os servidores 2, 3 e 4.

Você pode monitorar o progresso do rebalanceamento com Get-StorageJob.You can monitor the progress of the rebalance with Get-StorageJob.

Após a conclusão, verifique se myvolume foi movido executando Get-VirtualDiskFootprintBySSU.ps1 novamente.Once it is complete, verify that MyVolume has moved by running Get-VirtualDiskFootprintBySSU.ps1 again.

PS C:\> .\Get-VirtualDiskFootprintBySSU.ps1

VirtualDiskFriendlyName TotalFootprint Server1 Server2 Server3 Server4 Server5 Server6
----------------------- -------------- ------- ------- ------- ------- ------- -------
MyVolume                300 GB         0       100 GB  100 GB  100 GB  0       0      

Observe que Server1 não contém mais Slabs de myvolume – em vez disso, Server04.Note that Server1 does not contain slabs of MyVolume anymore – instead, Server04 does.

Práticas recomendadasBest practices

Aqui estão as práticas recomendadas a serem seguidas ao usar a alocação de volume delimitada:Here are the best practices to follow when using delimited volume allocation:

Escolher três servidoresChoose three servers

Delimite cada volume de espelho de três vias a três servidores, e não mais.Delimit each three-way mirror volume to three servers, not more.

Balancear o armazenamentoBalance storage

Equilibre a quantidade de armazenamento alocada para cada servidor, a contabilização do tamanho do volume.Balance how much storage is allocated to each server, accounting for volume size.

Cada alocação delimitada exclusivaEvery delimited allocation unique

Para maximizar a tolerância a falhas, torne a alocação de cada volume exclusiva, o que significa que ele não compartilha todos os seus servidores com outro volume (alguma sobreposição está ok).To maximize fault tolerance, make each volume's allocation unique, meaning it does not share all its servers with another volume (some overlap is okay). Com N servidores, há "N escolher 3" combinações exclusivas – aqui está o que significa para alguns tamanhos de cluster comuns:With N servers, there are "N choose 3" unique combinations – here's what that means for some common cluster sizes:

Número de servidores (N)Number of servers (N) Número de alocações delimitadas exclusivas (N escolha 3)Number of unique delimited allocations (N choose 3)
66 2020
88 5656
1212 220220
1616 560560

Dica

Considere essa revisão útil do combinatorics e escolha a notação.Consider this helpful review of combinatorics and choose notation.

Veja um exemplo que maximiza a tolerância a falhas – cada volume tem uma alocação delimitada exclusiva:Here's an example that maximizes fault tolerance – every volume has a unique delimited allocation:

alocação exclusiva

Por outro lado, no próximo exemplo, os três primeiros volumes usam a mesma alocação delimitada (para os servidores 1, 2 e 3) e os últimos três volumes usam a mesma alocação delimitada (para os servidores 4, 5 e 6).Conversely, in the next example, the first three volumes use the same delimited allocation (to servers 1, 2, and 3) and the last three volumes use the same delimited allocation (to servers 4, 5, and 6). Isso não maximiza a tolerância a falhas: se três servidores falharem, vários volumes poderão ficar offline e ficar inacessíveis ao mesmo tempo.This doesn't maximize fault tolerance: if three servers fail, multiple volumes could go offline and become inaccessible at once.

alocação não exclusiva

AnalisaAnalysis

Esta seção deriva a probabilidade matemática de que um volume permaneça online e acessível (ou, de forma equivalente, a fração esperada do armazenamento geral que permanece online e acessível) como uma função do número de falhas e do tamanho do cluster.This section derives the mathematical probability that a volume stays online and accessible (or equivalently, the expected fraction of overall storage that stays online and accessible) as a function of the number of failures and the cluster size.

Observação

Esta seção é leitura opcional.This section is optional reading. Se você estiver pronto para ver a matemática, continue lendo!If you're keen to see the math, read on! Mas se não, não se preocupe: O uso no PowerShell e nas práticas recomendadas é tudo o que você precisa para implementar a alocação delimitada com êxito.But if not, don't worry: Usage in PowerShell and Best practices is all you need to implement delimited allocation successfully.

Até duas falhas é sempre OkUp to two failures is always okay

Cada volume de espelho de três vias pode sobreviver a duas falhas ao mesmo tempo, como esses exemplos ilustram, independentemente de sua alocação.Every three-way mirror volume can survive up to two failures at the same time, as these examples illustrate, regardless of its allocation. Se duas unidades falharem, ou se dois servidores falharem, ou um de cada, cada volume de espelho de três vias permanecerá online e acessível, mesmo com a alocação regular.If two drives fail, or two servers fail, or one of each, every three-way mirror volume stays online and accessible, even with regular allocation.

Mais da metade o cluster está falhando nunca muito bemMore than half the cluster failing is never okay

Por outro lado, no caso extremo de que mais da metade de servidores ou unidades no cluster falham ao mesmo tempo, o quorum é perdido e cada volume de espelho de três vias fica offline e se torna inacessível, independentemente de sua alocação.Conversely, in the extreme case that more than half of servers or drives in the cluster fail at once, quorum is lost and every three-way mirror volume goes offline and becomes inaccessible, regardless of its allocation.

E o que há entre?What about in between?

Se três ou mais falhas ocorrerem ao mesmo tempo, mas pelo menos metade de servidores e unidades ainda estiverem ativos, os volumes com alocação delimitada poderão permanecer online e acessíveis, dependendo de quais servidores têm falhas.If three or more failures occur at once but at least half of servers and drives are still up, volumes with delimited allocation may stay online and accessible, depending on which servers have failures. Vamos executar os números para determinar as chances exatas.Let's run the numbers to determine the precise odds.

Para simplificar, suponha que os volumes sejam independentes e distribuídos de forma idêntica (IID) de acordo com as práticas recomendadas acima, e que as combinações exclusivas suficientes estejam disponíveis para que cada alocação de volume seja exclusiva.For simplicity, assume volumes are independently and identically distributed (IID) according to the best practices above, and that enough unique combinations are available for every volume's allocation to be unique. A probabilidade de que qualquer volume determinado sobreviver também é a fração esperada do armazenamento geral que sobrevive pela linearidade da expectativa.The probability that any given volume survives is also the expected fraction of overall storage that survives by linearity of expectation.

Considerando os N servidores dos quais o F tem falhas, um volume alocado para três deles ficará offline se-e-somente-se todos os 3 estiverem entre o F com falhas.Given N servers of which F have failures, a volume allocated to 3 of them goes offline if-and-only-if all 3 are among the F with failures. (N escolha F) maneiras de ocorrerem falhas de f , das quais (F escolha 3) resultam no volume ficar offline e ficando inacessível.There are (N choose F) ways for F failures to occur, of which (F choose 3) result in the volume going offline and becoming inaccessible. A probabilidade pode ser expressa como:The probability can be expressed as:

P_offline = Fc3/NcF

Em todos os outros casos, o volume permanece online e acessível:In all other cases, the volume stays online and accessible:

P_online = 1 – (Fc3/NcF)

As tabelas a seguir avaliam a probabilidade de alguns tamanhos de cluster comuns e até 5 falhas, revelando que a alocação delimitada aumenta a tolerância a falhas em comparação com a alocação regular em todos os casos considerados.The following tables evaluate the probability for some common cluster sizes and up to 5 failures, revealing that delimited allocation increases fault tolerance compared to regular allocation in every case considered.

Com 6 servidoresWith 6 servers

AlocaçãoAllocation Probabilidade de sobrevivente 1 falhaProbability of surviving 1 failure Probabilidade de sobreviventes 2 falhasProbability of surviving 2 failures Probabilidade de sobreviventes 3 falhasProbability of surviving 3 failures Probabilidade de sobreviver 4 falhasProbability of surviving 4 failures Probabilidade de sobreviventes 5 falhasProbability of surviving 5 failures
Regular, espalhada entre todos os 6 servidoresRegular, spread across all 6 servers 100%100% 100%100% 00% 00% 00%
Delimitado a 3 servidores somenteDelimited to 3 servers only 100%100% 100%100% 95,0%95.0% 00% 00%

Observação

Após mais de três falhas de 6 servidores no total, o cluster perde quorum.After more than 3 failures out of 6 total servers, the cluster loses quorum.

Com 8 servidoresWith 8 servers

AlocaçãoAllocation Probabilidade de sobrevivente 1 falhaProbability of surviving 1 failure Probabilidade de sobreviventes 2 falhasProbability of surviving 2 failures Probabilidade de sobreviventes 3 falhasProbability of surviving 3 failures Probabilidade de sobreviver 4 falhasProbability of surviving 4 failures Probabilidade de sobreviventes 5 falhasProbability of surviving 5 failures
Regular, espalhada entre todos os 8 servidoresRegular, spread across all 8 servers 100%100% 100%100% 00% 00% 00%
Delimitado a 3 servidores somenteDelimited to 3 servers only 100%100% 100%100% 98,2%98.2% 94,3%94.3% 00%

Observação

Após mais de 4 falhas de 8 servidores no total, o cluster perde quorum.After more than 4 failures out of 8 total servers, the cluster loses quorum.

Com 12 servidoresWith 12 servers

AlocaçãoAllocation Probabilidade de sobrevivente 1 falhaProbability of surviving 1 failure Probabilidade de sobreviventes 2 falhasProbability of surviving 2 failures Probabilidade de sobreviventes 3 falhasProbability of surviving 3 failures Probabilidade de sobreviver 4 falhasProbability of surviving 4 failures Probabilidade de sobreviventes 5 falhasProbability of surviving 5 failures
Regular, espalhada entre todos os 12 servidoresRegular, spread across all 12 servers 100%100% 100%100% 00% 00% 00%
Delimitado a 3 servidores somenteDelimited to 3 servers only 100%100% 100%100% 99,5%99.5% 99,2%99.2% 98,7%98.7%

Com 16 servidoresWith 16 servers

AlocaçãoAllocation Probabilidade de sobrevivente 1 falhaProbability of surviving 1 failure Probabilidade de sobreviventes 2 falhasProbability of surviving 2 failures Probabilidade de sobreviventes 3 falhasProbability of surviving 3 failures Probabilidade de sobreviver 4 falhasProbability of surviving 4 failures Probabilidade de sobreviventes 5 falhasProbability of surviving 5 failures
Regular, espalhada por todos os 16 servidoresRegular, spread across all 16 servers 100%100% 100%100% 00% 00% 00%
Delimitado a 3 servidores somenteDelimited to 3 servers only 100%100% 100%100% 99,8%99.8% 99,8%99.8% 99,8%99.8%

Perguntas frequentesFrequently asked questions

Posso delimitar alguns volumes, mas não outros?Can I delimit some volumes but not others?

Sim.Yes. Você pode escolher por volume se deseja ou não delimitar a alocação.You can choose per-volume whether or not to delimit allocation.

A alocação delimitada muda a forma como a substituição da unidade funciona?Does delimited allocation change how drive replacement works?

Não, é o mesmo que com a alocação regular.No, it's the same as with regular allocation.

Consulte tambémSee also

AnexoAppendix

Esse script ajuda a ver como os volumes são alocados.This script helps you see how your volumes are allocated.

Para usá-lo conforme descrito acima, copie/cole e salve Get-VirtualDiskFootprintBySSU.ps1como.To use it as described above, copy/paste and save as Get-VirtualDiskFootprintBySSU.ps1.

Function ConvertTo-PrettyCapacity {
    Param (
        [Parameter(
            Mandatory = $True,
            ValueFromPipeline = $True
            )
        ]
    [Int64]$Bytes,
    [Int64]$RoundTo = 0
    )
    If ($Bytes -Gt 0) {
        $Base = 1024
        $Labels = ("bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB")
        $Order = [Math]::Floor( [Math]::Log($Bytes, $Base) )
        $Rounded = [Math]::Round($Bytes/( [Math]::Pow($Base, $Order) ), $RoundTo)
        [String]($Rounded) + " " + $Labels[$Order]
    }
    Else {
        "0"
    }
    Return
}

Function Get-VirtualDiskFootprintByStorageFaultDomain {

    ################################################
    ### Step 1: Gather Configuration Information ###
    ################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Gathering configuration information..." -Status "Step 1/4" -PercentComplete 00

    $ErrorCannotGetCluster = "Cannot proceed because 'Get-Cluster' failed."
    $ErrorNotS2DEnabled = "Cannot proceed because the cluster is not running Storage Spaces Direct."
    $ErrorCannotGetClusterNode = "Cannot proceed because 'Get-ClusterNode' failed."
    $ErrorClusterNodeDown = "Cannot proceed because one or more cluster nodes is not Up."
    $ErrorCannotGetStoragePool = "Cannot proceed because 'Get-StoragePool' failed."
    $ErrorPhysicalDiskFaultDomainAwareness = "Cannot proceed because the storage pool is set to 'PhysicalDisk' fault domain awareness. This cmdlet only supports 'StorageScaleUnit', 'StorageChassis', or 'StorageRack' fault domain awareness."

    Try  {
        $GetCluster = Get-Cluster -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetCluster
    }

    If ($GetCluster.S2DEnabled -Ne 1) {
        throw $ErrorNotS2DEnabled
    }

    Try  {
        $GetClusterNode = Get-ClusterNode -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetClusterNode
    }

    If ($GetClusterNode | Where State -Ne Up) {
        throw $ErrorClusterNodeDown
    }

    Try {
        $GetStoragePool = Get-StoragePool -IsPrimordial $False -ErrorAction Stop
    }
    Catch {
        throw $ErrorCannotGetStoragePool
    }

    If ($GetStoragePool.FaultDomainAwarenessDefault -Eq "PhysicalDisk") {
        throw $ErrorPhysicalDiskFaultDomainAwareness
    }

    ###########################################################
    ### Step 2: Create SfdList[] and PhysicalDiskToSfdMap{} ###
    ###########################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Analyzing physical disk information..." -Status "Step 2/4" -PercentComplete 25

    $SfdList = Get-StorageFaultDomain -Type ($GetStoragePool.FaultDomainAwarenessDefault) | Sort FriendlyName # StorageScaleUnit, StorageChassis, or StorageRack

    $PhysicalDiskToSfdMap = @{} # Map of PhysicalDisk.UniqueId -> StorageFaultDomain.FriendlyName
    $SfdList | ForEach {
        $StorageFaultDomain = $_
        $_ | Get-StorageFaultDomain -Type PhysicalDisk | ForEach {
            $PhysicalDiskToSfdMap[$_.UniqueId] = $StorageFaultDomain.FriendlyName
        }
    }

    ##################################################################################################
    ### Step 3: Create VirtualDisk.FriendlyName -> { StorageFaultDomain.FriendlyName -> Size } Map ###
    ##################################################################################################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Analyzing virtual disk information..." -Status "Step 3/4" -PercentComplete 50

    $GetVirtualDisk = Get-VirtualDisk | Sort FriendlyName

    $VirtualDiskMap = @{}

    $GetVirtualDisk | ForEach {
        # Map of PhysicalDisk.UniqueId -> Size for THIS virtual disk
        $PhysicalDiskToSizeMap = @{}
        $_ | Get-PhysicalExtent | ForEach {
            $PhysicalDiskToSizeMap[$_.PhysicalDiskUniqueId] += $_.Size
        }
        # Map of StorageFaultDomain.FriendlyName -> Size for THIS virtual disk
        $SfdToSizeMap = @{}
        $PhysicalDiskToSizeMap.keys | ForEach {
            $SfdToSizeMap[$PhysicalDiskToSfdMap[$_]] += $PhysicalDiskToSizeMap[$_]
        }
        # Store
        $VirtualDiskMap[$_.FriendlyName] = $SfdToSizeMap
    }

    #########################
    ### Step 4: Write-Out ###
    #########################

    Write-Progress -Activity "Get-VirtualDiskFootprintByStorageFaultDomain" -CurrentOperation "Formatting output..." -Status "Step 4/4" -PercentComplete 75

    $Output = $GetVirtualDisk | ForEach {
        $Row = [PsCustomObject]@{}

        $VirtualDiskFriendlyName = $_.FriendlyName
        $Row | Add-Member -MemberType NoteProperty "VirtualDiskFriendlyName" $VirtualDiskFriendlyName

        $TotalFootprint = $_.FootprintOnPool | ConvertTo-PrettyCapacity
        $Row | Add-Member -MemberType NoteProperty "TotalFootprint" $TotalFootprint

        $SfdList | ForEach {
            $Size = $VirtualDiskMap[$VirtualDiskFriendlyName][$_.FriendlyName] | ConvertTo-PrettyCapacity
            $Row | Add-Member -MemberType NoteProperty $_.FriendlyName $Size
        }

        $Row
    }

    # Calculate width, in characters, required to Format-Table
    $RequiredWindowWidth = ("TotalFootprint").length + 1 + ("VirtualDiskFriendlyName").length + 1
    $SfdList | ForEach {
        $RequiredWindowWidth += $_.FriendlyName.Length + 1
    }

    $ActualWindowWidth = (Get-Host).UI.RawUI.WindowSize.Width

    If (!($ActualWindowWidth)) {
        # Cannot get window width, probably ISE, Format-List
        Write-Warning "Could not determine window width. For the best experience, use a Powershell window instead of ISE"
        $Output | Format-Table
    }
    ElseIf ($ActualWindowWidth -Lt $RequiredWindowWidth) {
        # Narrower window, Format-List
        Write-Warning "For the best experience, try making your PowerShell window at least $RequiredWindowWidth characters wide. Current width is $ActualWindowWidth characters."
        $Output | Format-List
    }
    Else {
        # Wider window, Format-Table
        $Output | Format-Table
    }
}

Get-VirtualDiskFootprintByStorageFaultDomain