===== PowerShell - Подсчёт файлов по категориям их размера на файловом сервере Windows Server =====
Одним из этапов подготовки нового дискового раздела для файлового сервера на базе **Windows Server** является форматирование раздела. При форматировании раздела важно правильно подобрать __размер кластера__ (**Bytes Per Cluster** / **Allocation unit size**). От этого, так или иначе, зависит дальнейший уровень производительности и утилизации дисковой ёмкости дискового раздела. Чтобы определить правильный размер кластера, можно отталкиваться от файлового контента, который планируется записать на дисковый раздел.
Предположим, у нас есть некий файловый сервер с уже имеющимся файловым контентом, где хранится множество файлов разного размера. Мы планируем подключить к файловому серверу новый дисковый раздел, отформатировать его в **NTFS** и перенести на этот раздел имеющийся файловый контент. Чтобы определить то, с каким размером кластера лучше провести форматирование нового размера, мы можем предварительно проанализировать то, какое количество файлов входит в разные категории по размеру.
Простой пример **PowerShell**-кода, который позволит выполнить подсчёт файлов и рассортировать их по количеству на разные размерные группы:
$path = 'D:\';
$TooSmall = $2K = $4K = $8K = $16K = $32K = $64K = $128K = $256K = $TooBig = 0
$files = Get-ChildItem $path -Recurse -File
ForEach ($file in $files) {
$size=0;
$size=$file.Length
If ($size -le 2048) {$TooSmall = $TooSmall + 1}
ElseIf (($size -ge 2049) -and ($size -le 4096)) {$4K = $4K + 1}
ElseIf (($size -ge 4097) -and ($size -le 8192)) {$8K = $8K + 1}
ElseIf (($size -ge 8193) -and ($size -le 16384)) {$16K = $16K + 1}
ElseIf (($size -ge 16385) -and ($size -le 32768)) {$32K = $32K + 1}
ElseIf (($size -ge 32769) -and ($size -le 65536)) {$64K = $64K + 1}
ElseIf (($size -ge 65537) -and ($size -le 131072)) {$128K = $128K + 1}
ElseIf (($size -ge 131072) -and ($size -le 262144)) {$256K = $256K + 1}
ElseIf ($size -ge 262145) {$TooBig = $TooBig + 1}
}
write ("Files up to 2K : " + $TooSmall)
write ("Files from 2K to 4K : " + $4K)
write ("Files from 4K to 8K : " + $8K)
write ("Files from 8K to 16K : " + $16K)
write ("Files from 16K to 32K : " + $32K)
write ("Files from 32K to 64K : " + $64K)
write ("Files from 64K to 128K : " + $128K)
write ("Files from 128K to 256K : " + $256K)
write ("Files from 256K to large : " + $TooBig)
Пример вывода скрипта:
Files up to 2K : 41032
Files from 2K to 4K : 3632
Files from 4K to 8K : 3507
Files from 8K to 16K : 5816
Files from 16K to 32K : 6606
Files from 32K to 64K : 6410
Files from 64K to 128K : 4319
Files from 128K to 256K : 2426
Files from 256K to large : 4703
Из этого вывода следует, что наш файловый контент имеет больше всего маленьких файлов размером до 2KB.
При условии того, что весь контент используется с приблизительно одинаковой интенсивностью, можно прийти к выводу, что оптимальным размером кластера для дискового радела под такой контент будет - 2048 байта.
{{ :powershell:pasted:20230616-181403.png }}
При этом следует помнить, что по умолчанию в **Windows Server** при форматировании раздела в **NTFS** используется размер кластера в **4KB**. А для некоторых специфичных вещей есть собственные рекомендации по размеру кластера. Например, для баз данных **SQL Server** [[1c:setting-up-microsoft-sql-server-for-1c-enterprise-8-3:preparing-disk-subsystem-for-sql-server-database-files|рекомендуемым является]] **64KB**. Эти же **64KB** являются рекомендуемым значением для разделов под хранение виртуальных дисков **Hyper-V**.
----
Проверено на следующих конфигурациях:
^ Версия ОС ^ Версия PowerShell ^
| Windows Server 2022 Standard 10.0.20348 | 5.1.20348.1366 |
----
{{:user:blogroot.png?50&nolink |}} Автор первичной редакции:\\ [[user:blogroot|Алексей Максимов]] \\ Время публикации: 16.06.2023 18:18
{{tag>PowerShell "File Server" "Windows Server 2022" "Bytes Per Cluster" "Allocation unit size" BlockSize}}
~~DISCUSSION~~