Начинаем небольшой цикл статей, посвященных тюнингу производительности сервера Windows и его типовых ролей. Материал будет полезен как при попытке выжать из старого сервера максимум (помимо покраски в красный цвет), так и при планировании новых высоконагруженных систем без покупки топовых серверов (как это советуют интеграторы).
Общие рекомендации по железу
Процессор ― он как сердце сервера, поэтому от него зависит очень много в плане производительности. Благодаря маркетологам мы знаем ― чем больше ядер и мегагерцев, тем круче. На самом деле всё не совсем так:
-
Выбирайте 64-битный процессор. Современные серверные Windows не поддерживают 32-битные процессоры, да и памяти он может адресовать намного больше.
-
Количество ядер не имеет большого значения. Не все приложения и сервисы могут использовать несколько ядер, и в общем случае одно ядро с большой частотой будет эффективнее, чем два с меньшей.
-
Hyperthreading ― гиперпоточность ― когда одно физическое ядро процессора определяется как два логических. Функция процессора позволяет обрабатывать два разных потока на одном ядре, что в общем случае увеличивает производительность. Но бывает, что производительность наоборот снижается из-за того, что кэш процессорного ядра один.
-
Кэш процессора. Тут все просто: чем он больше, тем лучше, и часто больший кэш дает большую производительность, чем частота процессора.
-
Не нужно сравнивать процессоры разных поколений и производителей по частоте: скорость обработки данных зависит и от многих других факторов вроде кэша и частоты шины.
- Для Hyper-V важно, чтобы процессор поддерживал SPLAT (Second Level Address Translation). В терминологии Intel возможность называется Extended Page Tables (EPT), у AMD ― Nested Page Tables (NPT). Проверить наличие этой функции процессора можно с помощью утилиты systeminfo.exe.
Проверка процессора под требования Hyper-V.
С оперативной памятью все довольно просто: чем она больше и быстрее, тем лучше. Чуть интереснее становится, если оперативной памяти недостаточно и системе необходимо использовать файл подкачки. Тут можно ограничиться следующими рекомендациями:
-
файл подкачки стоит положить на отдельный физический диск. Чем он быстрее, тем лучше. Если такой возможности нет, то лучше разместить его на диске, к которому меньше файловых обращений;
- лучше не хранить файл подкачки на отказоустойчивом массиве вроде RAID1― он проигрывает по скорости одному диску. Хорошей идеей будет поместить файл подкачки на RAID0 или несколько файлов подкачки на разных физических дисках.
Размещение файла подкачки на системном диске ― не лучший вариант.
Теперь о сетевых адаптерах. Из интересных особенностей можно отметить:
-
Только адаптеры с поддержкой 64-разрядных систем имеют DMA (Direct Memory Access) ― технологию прямого доступа к памяти по сети. Если нужна действительно быстрая сеть между нодами кластера ― на это стоит обратить внимание.
- Многопортовые адаптеры удобны для распределения нагрузки и отказоустойчивости. Но 2 адаптера с одним портом будут быстрее, чем один адаптер с 2 портами. Также нужно иметь в виду, что устанавливать больше сетевых адаптеров, чем ядер в сервере чревато падением быстродействия.
HPE ProLiant DL360 Gen7 обладает изначально четырьмя сетевыми портами.
На этом закончу небольшую вводную и перейду непосредственно к оптимизации ролей сервера. Начнем с самого простого ― с файлового сервера.
Файловый сервер
Обычно при установке и работе файлового сервера вопрос быстродействия не стоит. Но только до тех пор, пока на обычной файлопомойке на заводятся базы данных, чудовищные файлы Excel и им подобные «интересные» вещи. Расскажу про параметры, которые могут улучшить или ухудшить быстродействие SMB.
Отдельно отмечу вопрос быстродействия сервера, который обрабатывает не только клиентов внутри локальной сети, но и удаленных ― например, по VPN. Лично я сталкивался с ситуацией, когда в сети на Windows XP2003 начали появляться компьютеры на Windows 72008. Тогда мы столкнулись с тем, что быстродействие сети новых компьютеров оставляет желать лучшего при общении со старыми ОС. Начитавшись интернетов, выполнили на новых машинах следующий скрипт:
netsh int tcp set global autotuning=disabled
netsh int tcp set global autotuninglevel=disabled
netsh int tcp set global rss=disabled chimney=disabled
Сеть заработала, скрипт был добавлен в разворачиваемые образа систем.
И все было хорошо, пока в сети не появился удаленный сегмент с повышенным требованием к скорости работы сети. Файлы передавались по VPN не быстрее 2 Мб/с. Проблему локализовали: оказалось, что специально для работы в LANWAN сетях в новых операционных системах добавили функцию autotuning. С помощью нее системы определяют скорость соединения и договариваются о размерах кадра TCP для оптимального быстродействия. Чтобы VPN работала быстро, и сервера не тормозили при обращениях к WIndows 2003, достаточно было не отключать autotuning, а ограничить его командой:
netsh int tcp set global autotuninglevel=highlyrestricted
Но перейдем к более специализированным параметрам.
Помним, что изменения параметров реестра и настроек служб могут привести к чему угодно. Поэтому делаем все аккуратно.
Начнем с тюнинга клиентов файловых серверов. За подключение к серверу SMB отвечает служба LanmanWorkstation. Большинство параметров находятся в следующей ветке реестра:
HKLMSystemCurrentControlSetServicesLanmanWorkstationParameters
В большинстве своем параметры имеют тип REG_DWORD. В современных Windows управление частью настроек возможно через командлет Set-SmbClientConfiguration. Просмотреть текущие значения ― соответственно, Get-SmbClientConfiguration.
Значения параметров клиента SMB.
Параметры, на которые стоит обратить внимание в первую очередь при вопросах быстродействия:
Имя параметра | Значение по умолчанию | Варианты значений | За что отвечает | Комментарий |
DisableBandwidthThrottling | 0 | 0―1 | Включение ― отключение троттлинга для сетей с высокой задержкой | Включение параметра может повысить пропускную способность сетей с высокой задержкой (WAN) |
FileInfoCacheEntriesMax | 64 | 1―65536 | Максимальное количество значений в кэше метаданных файлов | Увеличение параметра уменьшает трафик и повышает пропускную способность сети при обращении к большому количеству файлов |
DirectoryCacheEntrySizeMax | 64 | 1―65536 | Максимальный размер кэша для каталогов | Измеряется в килобайтах |
FileNotFoundCacheEntriesMax | 128 | 1―65536 | Максимальное количество значений в кэше информации о файлах | Увеличение параметра уменьшает трафик и повышает пропускную способность сети при обращении к большому количеству файлов |
MaxCmds | 50 | 1―65536 | Максимальное количество команд в сеансе | Увеличение параметра увеличит расход памяти, но поднимет быстродействие. Только для SMB v1 |
DormantFileLimit | 1023 | 1―65536 | Максимальное количество файлов, которые могут быть открыты, после того как «отпущены» приложением | |
ScavengerTimeLimit | 10 | 0―127 | Как часто запускается «мусорщик», очищающий кэш дескрипторов файлов | Измеряется в секундах, актуально для Windows XP2003 |
В качестве примера тюнинга, можно привести следующие значения:
-
DisableBandwidthThrottling = 1;
-
FileInfoCacheEntriesMax = 32768;
-
DirectoryCacheEntriesMax = 4096;
-
FileNotFoundCacheEntriesMax = 32768;
-
MaxCmds = 32768;
-
DormantFileLimit = 32768;
- ScavengerTimeLimit = 60.
Разумеется, конкретно эти значения ― не панацея. Параметры должны подбираться индивидуально.
Параметры, настраиваемые через powershell и реестр:
Имя параметра | Значение по умолчанию | Варианты значений | За что отвечает | Комментарий |
ConnectionCountPerNetworkInterface | 1 | 1―16 | Максимальное количество подключений к серверу с интерфейсом без поддержки RSS | MS не рекомендует изменять значение по умолчанию |
ConnectionCountPerRssNetworkInterface | 4 | 1―16 | Максимальное количество подключений к серверу с интерфейсом c поддержкой RSS | |
ConnectionCountPerRdmaNetworkInterface | 2 | 1―16 | Максимальное количество подключений к серверу с интерфейсом с поддержкой RDMA | |
MaximumConnectionCountPerServer | 32 | 1―64 | Максимальное количество подключений к одному серверу | |
DormantDirectoryTimeout | 600 | Максимальное количество времени обработки каталога | Измеряется в секундах | |
FileInfoCacheLifetime | 10 | Время хранения информации о файле в кэше | ||
DirectoryCacheLifetime | 10 | Время хранения метаданных каталога в кэше | ||
FileNotFoundCacheLifetime | 5 | Время хранения кэша не найденных файлов | ||
CacheFileTimeout | 10 | Время хранения кэша для файла, после того как файл «отпущен» приложением | ||
DisableLargeMtu | 0 (Win8) | 0―1 | Включение―отключение большого размера MTU | С включенным параметром размер запроса ограничен 64 КБ, с включенным ― 1 МБ. |
RequireSecuritySignature | 0 | 0―1 | Включение―отключение обязательной подписи SMB | Включение этого параметра замедляет скорость работы, но повышает защиту от атаки MITM |
DirectoryCacheEntriesMax | 16 | 1―4096 | Максимальное количество значений в кэше информации о каталогах | Увеличение параметра уменьшает трафик и повышает пропускную способность сети при обращении к большим каталогам |
MaxCredits | 128 | Максимальное количество команд в сеансе | Тоже самое, что и MaxCmds, но для SMB v2 |
Параметры, настраиваемые через powershell:
EnableMultiChannel | 1 | 0―1 | Включение―отключение использования нескольких физических адаптеров | |
EnableByteRangeLockingOnReadOnlyFiles | True | TrueFalse | Включение―отключение блокировки файлов «только для чтения» | |
EnableInsecureGuestLogons | True | TrueFalse | Включение―отключение гостевого входа на ресурс | Отключение не позволит заходить без авторизации на расшаренные для всех папки на недоменном сервере (NAS) |
EnableLoadBalanceScaleOut | True | TrueFalse | Включение―отключение поддержки распределения нагрузки при подключении к кластеру | |
EnableSecuritySignature | True | TrueFalse | Включение―отключение возможности подписи SMB | |
ExtendedSessionTimeout | 1000 | Время ожидания ответа от сервера | Измеряется в секундах | |
KeepConn | 600 | Время до закрытия неактивной сессии | Измеряется в секундах, применимо только к SMB v1 | |
OplocksDisabled | False | TrueFalse | Переключается автоматически в зависимости от значения параметра UseOpportunisticLocking | |
SessionTimeout | 60 | Время до закрытия неактивной сессии | Измеряется в секундах | |
UseOpportunisticLocking | True | TrueFalse | Включение―отключение режима гибких блокировок (oplock) файлов с их буферизацией | Включенный механизм сильно увеличивает быстродействие, но в ненадежных сетях может привести к повреждению файлов |
WindowSizeThreshold | 1 для серверных систем, 8 для клиентских | Минимальный размер окна до включения режима Multichannel |
Если же говорить уже непосредственно про файловый сервер, то вот несколько общих рекомендаций:
-
Для лучшего быстродействия не используйте ненужные функции вроде мини-фильтров файловой системы, IPSec, шифрование и сжатие NTFS, шифрование SMB и другие. Включение антивируса может существенно подпортить быстродействие, и если периметр сети защищен, лучше его и не устанавливать.
-
Регулярно стоит проверять актуальность драйверов, особенно на сетевые карты. Встречались ситуации, когда из-за кривых драйверов сетевая карта стабильно работала только при принудительном выставлении сто мегабит. И только с выходом свежих драйверов удалось выжать полноценный гигабит.
- Копирование файлов ― довольно регулярная операция для файлового сервера. При копировании по сети предпочтительнее использовать утилиту robocopy.exe с ключом /mt, включающим многопоточность для большого количества мелких файлов. Немного быстродействия добавит и отсутствие вывода в консоль ― ключ /log для robocopy и /q для xcopy.
Для оценки быстродействия работы протокола SMB можно использовать счетчики производительности, которые существуют как для сервера, так и для клиента.
Тут поможет утилита perfmon.exe. После запуска удобно переключить отображение в режим «отчет»:
Потом необходимо добавить нужные счетчики производительности. Для примера добавим счетчик «Общие ресурсы SMB сервера», нажав на зеленый плюс, выбрав нужный нам счетчик и общий ресурс:
И наслаждаемся результатом:
Более полно с процедурой использования счетчиков производительности, сбора и анализа результата рекомендую ознакомиться в блоге Microsoft.
Перейдем к тюнингу. За работу сервера SMB отвечает служба Lanmanserver, поэтому часть параметров можно изменить в соответствующей ветке реестра:
HKLMSystemCurrentControlSetServicesLanmanServerParameters.
Удобнее, конечно, использовать командлет Set-SmbServerConfiguration.
Вывод значений параметров с помощью командлета Get-SmbServerConfiguration.
Параметры, на которые стоит обратить внимание в первую очередь:
Имя параметра | Значение по умолчанию | Тип параметра | За что отвечает | Комментарий |
Smb2CreditsMax | 8192 | uint32 | Максимальное количество команд SMB v2 | Эти два параметра позволяют динамически распределять нагрузку. Иногда при использовании скоростных каналов с высокой задержкой (WAN) изменение этих параметров увеличит скорость. Посмотреть, есть ли проблемы, поможет счетчик производительности «Общие ресурсы SMBклиента ― Задержек кредита/c» |
Smb2CreditsMin | 512 | uint32 | Минимальное количество команд SMB v2 | |
MaxThreadsPerQueue | 20 | unit32 | Максимальное количество потоков сервера при обработке одновременных запросов | Увеличение параметра влияет на аппаратную загрузку, но увеличивает производительность. Показателем к изменению параметра может служить значение счетчика производительности «Рабочие очереди сервера ― Длина очереди ― SMB2 NonBlocking» становится больше 100. |
AsynchronousCredits | 512 | uint32 | Максимальное количество одновременных асинхронных команд в одной сессии | В ряде случаев, например, при использовании нагруженного веб-сервера, увеличение значения параметра увеличивает производительность |
MaxMpxCt | 50 | uint32 | Максимальное количество невыполненных клиентских запросов для каждого клиента | Влияет только на клиентов SMB v1 |
Существует еще один параметр реестра, не контролируемый командлетом powershell:
-
путь: HKLMSystemCurrentControlSetControlSession ManagerExecutive;
-
параметр: REG_DWORD c именем AdditionalCriticalWorkerThreads;
- значение по умолчанию: 0.
Этот параметр отвечает за дополнительные рабочие процессы, отвечающие за процедуры записи и чтения в системном кэше файловой системы. По умолчанию дополнительных процессов нет, и изменение этого параметра может существенно ускорить работу файлового сервера. Особенно при наличии многоядерных процессоров и производительной дисковой системы. Задумываться об увеличении этого параметра можно при росте счетчика производительности «Кэш ― «Грязные» страницы».
В качестве примера тюнинга можно привести следующие значения параметров:
-
AdditionalCriticalWorkerThreads = 64;
-
MaxThreadsPerQueue = 64;
- MaxMpxCt = 32768.
Значения также должны подбираться индивидуально.
Имя параметра | Значение по умолчанию | Тип параметра | За что отвечает | Комментарий |
AnnounceComment | null | string | Представление сервера | |
AnnounceServer | False | boolean | Включение ― отключение представления сервера | |
AuditSmb1Access | False | boolean | Включение ― отключение аудита доступа по протоколу SMB v1 | Параметр появился только в Windows 102016 |
AutoDisconnectTimeout | 15 | uint32 | Время, после которого отключается неактивная сессия | |
AutoShareServer | True | boolean | Включение ― отключение сетевых ресурсов сервера по умолчанию | |
AutoShareWorkstation | True | boolean | Включение ― отключение сетевых ресурсов рабочей станции по умолчанию | |
CachedOpenLimit | 10 | uint3 | Максимальное количество открытых файлов в кэше | |
DurableHandleV2TimeoutInSeconds | 180 | uint32 | Время отключения неактивного дескриптора | |
EnableAuthenticateUserSharing | False | boolean | Включение ― отключение возможности общего доступа к соединению | |
EnableDownlevelTimewarp | False | boolean | Включение ― отключение низкоуровневого искажения времени | |
EnableForcedLogoff | True | boolean | Включение ― отключение принудительного выхода | |
EnableLeasing | True | boolean | Включение ― отключение аренды | |
EnableMultiChannel | True | boolean | Включение ― отключение использования нескольких физических адаптеров | |
EnableOplocks | True | boolean | Включение ― отключение гибких блокировок (oplock) | |
EnableSecuritySignature | False | boolean | Включение ― отключение возможности подписи SMB | |
EnableSMB1Protocol | True | boolean | Включение ― отключение протокола SMB v1 | |
EnableSMB2Protocol | True | boolean | Включение ― отключение протокола SMB v2+ | |
EnableStrictNameChecking | True | boolean | Включение ― отключение проверки имени входящего подключения | |
EncryptData | False | boolean | Включение ― отключение поддержки шифрования данных | |
IrpStackSize | 15 | unit32 | Размер стека IRP (запросов ввода ― вывода) | |
KeepAliveTime | 2 | unit32 | Частота TCP запросов keepalive для подключения SMB | |
MaxChannelPerSession | 32 | unit32 | Количество каналов в одной сессии | |
MaxMpxCount | 50 | unit32 | Максимальное количество команд в сессии | Параметр должен быть настроен так же, как и параметр MaxCmds клиента |
MaxSessionPerConnection | 16384 | unit32 | Максимальное количество сессий в одном соединении | |
MaxWorkItems | 1 | uint32 | Максимальное количество рабочих элементов | Параметр влияет только на SMB v1 |
NullSessionPipes | null | string | Каналы, доступные в нулевой сессии | |
NullSessionShares | null | string | Сетевые ресурсы, доступные в нулевой сессии | |
OplockBreakWait | 35 | uint32 | Время ожидания до прерывания блокировки | |
PendingClientTimeoutInSeconds | 120 | uint32 | Время ожидания клиента | |
RejectUnencryptedAccess | True | boolean | Включение ― отключение незашифрованных запросов на доступ | |
RequireSecuritySignature | False | boolean | Включение ― отключение обязательной подписи SMB | Включение этого параметра замедляет скорость работы, но повышает защиту от атаки MITM |
ServerHidden | True | boolean | Включение ― отключение представления сервера | По умолчанию сервер не представляет себя |
SmbServerNameHardeningLevel | 0 | uint32 | Уровень упрощения имени сервера | |
TreatHostAsStableStorage | False | boolean | Включение ― отключение надежного дискового хранилища | Включение этого параметра говорит серверу о надежности дискового хранилища, стоит включать его при работе с диском с энергонезависимым кэшем на запись. Тогда сервер не будет дожидаться подтверждения записи на диск, что ускорит быстродействие. |
ValidateAliasNotCircular | True | boolean | Включение ― отключение использования псевдонимов | |
ValidateShareScope | True | boolean | Включение ― отключение проверки имени ресурсов при создании нового ресурса | |
ValidateShareScopeNotAliased | True | boolean | Включение ― отключение проверки псевдонимов ресурсов при создании нового ресурса | |
ValidateTargetName | True | boolean | Включение ― отключение проверки имени целевого ресурса при создании псевдонима |
Повторюсь: изменение параметров может привести к неработоспособности сервера. Поэтому лучше сначала «потренироваться на кошках». Или хотя бы делать бэкапы.
Перейду к следующей, казалось бы, простой роли ― сервер печати.
Сервер печати
Помимо рекомендаций вида «быстрее, выше, сильнее» в плане аппаратной части, нужно отметить несколько других интересных моментов.
Перенос очереди печати на несистемный диск довольно сильно увеличит производительность сервера. Это делается в свойствах сервера печати, на вкладке «дополнительные параметры».
Настройка размещения очереди печати.
По возможности лучше отрисовывать задачи на клиенте. В таком случае клиент будет сам переводить документ в специальный формат для печати (PDL). Сервер же не будет тратить ресурсы на это преобразование.
По умолчанию эта возможность уже включена, включить―выключить можно групповой политикой для всех принтеров. Индивидуальную настройку принтеров можно провести с помощью команды
printui /Xs /n "printer" ClientSideRender disabled
Отключать отрисовку на клиенте имеет смысл при достаточном запасе производительности сервера печати для разгрузки клиентов.
Принтеры с поддержкой XPS (OpenXPS) меньше нагружают сервер, чем принтеры без нее. Принтеры с поддержкой PCL 6 и Postscript чуть менее эффективны из-за векторного формата. Поэтому при выборе принтера лучше подбирать с поддержкой XPS, и устанавливать соответствующий драйвер.
С выходом Windows 82012 появилась поддержка драйверов печати v4. Драйвера 4-й версии более производительны, но Windows 7 будет печатать на драйвере четвертого типа, отрисовывая задачи на клиенте. Поэтому если в сети еще встречаются старые Windows, стоит установить и драйвера третьего типа. Посмотреть на тип драйвера можно в свойствах сервера печати на вкладке «Драйверы»:
Окно установки дополнительных драйверов.
Если говорить о возможностях драйверов четвертого типа, то к ним можно отнести:
-
использование видеокарты для отрисовки задач печати. Да, теперь для повышения быстродействия при отрисовке задач на сервере можно установить в принтсервер видеокарту;
- упрощенная система подключения «расшаренного» принтера: теперь не нужно ставить драйвера под разные архитектуры процессора.
Заслуживает внимания и технология Branch Office. С ее помощью клиент работает с принтером напрямую, минуя какую-либо обработку на сервере печати. Правда, понадобятся принтеры с поддержкой TCPIP или WSD. Подробнее ознакомиться с технологией можно на сайте Microsoft, а включить или отключить для конкретного принтера можно с помощью командлета powershell:
Set―Printer ―name <printername> ―ComputerName <computername> ―RenderingMode BranchOffice
Технология не работает, если используется обработка печати на сервере.
Для диагностики узких мест при печати обратите внимание на три процесса:
-
Spoolsv.exe;
-
Printfilterpipelinesvc.exe;
- Printisolationhost.exe;
А также смотрите на расход этими процессами памяти, процессора и нагрузки на жесткий диск. Для более тонкого поиска узких мест помогут специальные счетчики производительности.
Набор типовых счетчиков производительности подсистемы печати.
Название | Описание |
Всего заданий напечатано | Количество напечатанных заданий |
Всего напечатано страниц | Количество напечатанных страниц |
Вызовов добавления сетевого принтера | Количество подключений к расшаренному принтеру с момента последнего перезапуска службы |
Заданий | Количество напечатанных заданий с момента последнего перезапуска службы |
Заданий, обрабатываемых диспетчером печати | Текущее количество заданий в службе печати |
Максимум заданий, обрабатываемых диспетчером | Максимальное количество заданий в службе печати |
Максимум ссылок | Максимальное количество обращений к очереди печати |
Ошибок заданий | Количество ошибок заданий |
Ошибок «Отсутствует бумага» | Количество ошибок, вызванных отсутствием бумаги |
Ошибок «Принтер не готов» | Количество ошибок принтера |
Печатаемых байт/c | Скорость текущей печати в байтах, позволяет приблизительно оценить время занятости принтера |
Ссылок | Текущее количество обращений к очереди печати |
В общем, подобрав параметры под конкретную ситуацию, можно повысить производительность этих простых ролей до 50%. А refurbished сервер еще даст прикурить современным монстрам с настройками «по умолчанию».
Расскажите в комментариях, про повышение быстродействия каких ролей Windows вам было бы интересно почитать. Приходилось ли вам заниматься тюнингом ролей и сервисов? Каких результатов достигли?
Автор: Сервер Молл