Вики IT-KB

Пошаговые руководства, шпаргалки, полезные ссылки...

Инструменты пользователя

Инструменты сайта


powershell:count-files-by-size-on-file-server-using-powershell

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 байта.

При этом следует помнить, что по умолчанию в Windows Server при форматировании раздела в NTFS используется размер кластера в 4KB. А для некоторых специфичных вещей есть собственные рекомендации по размеру кластера. Например, для баз данных SQL Server рекомендуемым является 64KB. Эти же 64KB являются рекомендуемым значением для разделов под хранение виртуальных дисков Hyper-V.


Проверено на следующих конфигурациях:

Версия ОС Версия PowerShell
Windows Server 2022 Standard 10.0.20348 5.1.20348.1366

Автор первичной редакции:
Алексей Максимов
Время публикации: 16.06.2023 18:18

Обсуждение

Леонид Леонид , 10.09.2023 13:35
А чем плоха оснастка управления файловым ресурсами (пишу по памяти, могу ошибаться)?
Ваш комментарий:
 
powershell/count-files-by-size-on-file-server-using-powershell.txt · Последнее изменение: 16.06.2023 18:19 — Алексей Максимов

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki