===== 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~~