DFSR: determining minimum staging area (via PowerShell)

При настройке репликации папок по умолчанию Staging Quota равна 4G. Во многих случаях так можно и оставить. Но не всегда. Как определить минимальный/оптимальный размер?

Рекомендаций на этот счет достаточно много, ну хотя бы эти:

How to Determine the Minimum Staging Area DFSR Needs for a Replicated Folder

taging Folder Guidelines for DFS Replication

Если резюмировать, то:

  1. Минимальный размер для Staging Quota однозначно должен быть больше, чем суммарный объем N наибольших файлов, которые будут реплицироваться. В зависимости от автора рекомендаций N варьируется от 4-5 до 32. По своему опыту – 4-5 это жесткий минимум, меньше которого репликация нормально работать не будет. При 4-х она работает, но в логах довольно частый гость будет сообщение об ошибке репликации больших файлов.
  2. Максимальный размер – не имеет смысла делать Staging Quota значительно больше суммарного размера реплицируемой папки.
  3. Оптимальный – где-то между 1 и 2, и определяется опытным путем.

При этом имеем в виду, что если Staging files и сами реплицируемые папки находятся на одном диске, то на этом диске должно быть достаточно место, чтобы вместить и то, и другое. Иначе можем попасть на эффект, когда репликация остановится, так как на диске недостаточно места (при этом очистки папки с Staging files не произойдет, так как не будет достигнут верхний лимит Staging Quota).

В общем, в любом случае имеет смысл определить, а сколько места занимают N самых больших файлов в реплицируемой папке.

Для этого я использую простенький скрипт PowerShell:

[CmdletBinding()] 
Param(
 [String]$Path = '.', 
 [Int]$Top = 32
)
$verbose=$VerbosePreference -eq 'Continue'

$paramsCount=$args.Count+$PSBoundParameters.Count

if($paramsCount -eq 0) {
 Get-Help $MyInvocation.MyCommand.Definition
 Write-Output "Examples:"
 Write-Output "$($MyInvocation.MyCommand) d:\"
 Write-Output "$($MyInvocation.MyCommand) -Path d:\ -v"
 Write-Output "$($MyInvocation.MyCommand) -Path d:\ -Top 10 -Verbose"
 return
}

$files = Get-ChildItem $Path -recurse | Sort-Object length -descending | select-object FullName, Name, Length -first $Top

if($verbose) {
 $files | ft @{Label='Size, MB'; Expression={"{0:N0}" -f ($_.Length/1MB)}; align="left"},FullName -wrap –auto
}

$res = $files | measure-object -property length –sum

Write-Output "Total: $([math]::Round($res.Sum/1gb,2)) Gb"

Вызов без параметров выдает краткую справку:

get-biggestFiles.ps1 [[-Path] <string>] [[-Top] <int>] [<CommonParameters>]
Examples:
get-biggestFiles.ps1 d:\
get-biggestFiles.ps1 -Path d:\ -v
get-biggestFiles.ps1 -Path d:\ -Top 10 -Verbose

Чтобы узнать, сколько занимают в сумме 10 самых больших файлов в папках начиная с d:\Shares\Data, выполняем:

get-biggestFiles.ps1 d:\shares\data -Top 10

На экран будет выведен суммарный результат. Если нас интересует еще и список самих файлов – то добавляем ключ -v (-Verbose):

get-biggestFiles.ps1 d:\shares\data -Top 10 -v

Ну и дальше смотрим, если самый большой файл превышает Staging Quota – однозначно Satging Quota править, иначе часть файлов точно не будет реплицироваться.

Также проверяем, если сумма наибольших, например, 10 файлов превышает Staging Quota – увеличиваем Staging Quota до нового значения.