Как включить Receive Side Scaling (RSS) на сетевом интерфейсе
Добрый день! Уважаемые читатели и гости IT блога Pyatilistnik.org. В прошлый раз мы с вами разобрали, как производится чистая установка Windows 12 с последующей настройкой. Идем далее и сегодня я хочу с вами разобрать одну интересную опцию, которая присутствует на современных сетевых картах, призванную сильно повысить производительность скачивания данных. Речь пойдет про Receive Side Scaling (RSS) или как его еще называют в российской локализации "Состояние масштабирования на стороне приема". Уверен, будет интересно, я покажу когда вас может сильно выручать данный функционал.
Что такое Receive Side Scaling (RSS)
Receive-Side Scaling (RSS) State, или состояние масштабирования на стороне приема, является функцией сетевых адаптеров и операционных систем, которая позволяет распределить обработку входящих сетевых пакетов по нескольким ядрам процессора. Это позволяет повысить производительность сетевой обработки и улучшить масштабируемость системы.
RSS State применяется в высоконагруженных сетевых средах, где требуется обработка большого количества входящих сетевых пакетов. В таких сценариях одно ядро процессора может стать узким местом и ограничивать пропускную способность сети. RSS State позволяет распределить нагрузку на несколько ядер процессора, что позволяет более эффективно использовать ресурсы и повысить производительность. Это может привести к улучшению задержки, более низким значениям процентов использования процессора и более высокой скорости передачи данных. По сути пакеты дробятся на потоки и за каждый поток отвечает свой ЦП.
Однако следует отметить, что эффективность RSS State может зависеть от конкретной сетевой архитектуры и настроек системы. В некоторых случаях, когда сетевые пакеты приходят в неупорядоченном порядке или требуют обработки на одном ядре процессора (например, для обеспечения целостности данных), RSS State может не давать значительного прироста производительности.
Примеры использования RSS
Представим себе обычное, рабочее окружение, где есть лес Active Directory и виртуальная инфраструктура. На части виртуальных машин было замечено:
- Высокая загрузка CPU
- Низкая производительность сети и/или большое время отклика на пинг
- Могут наблюдаться тайм-ауты и сбои подключения.
- Количество виртуальных и физических сетевых карт на этот вопрос не влияет
- Эта проблема возникает с различными типами виртуальных сетевых адаптеров (E1000, VMXNET2 и VMXNET3)
Как проверить и включить RSS через графический интерфейс
Самый понятный для большинства метод определения текущего состояния Receive Side Scaling на вашем сетевом интерфейсе, это использование оснастки "Диспетчера устройств". Его можно запустить кликнув правой кнопкой мыши по кнопке "Пуск".
Или же можно нажать сочетание клавиш WIN + R и запустить окно "Выполнить". В нем ввести:
В итоге у вас откроется окно со списком всех ваших устройств. Вам необходимо найти пункт "Сетевые адаптеры". В списке выберите необходимый сетевой интерфейс и откройте его свойства. Перейдите на вкладку "Дополнительно". В поле свойство найдите строку Receive Side Scaling. Выбрав ее вы увидите текущее значений. В моем случае видно, что она активирована.
Если у вас стоит "Disable" и вы хотите ее активировать, то выставите значение "Enable". Обратите внимание, что если вы используете в данный момент подключение по удаленному рабочему столу, то оно может отвалиться на секунд 5. В некоторых случаях, чтобы применилось чтобы изменения вступили в силу, может потребоваться перезагрузка.
Как проверить и включить RSS через командную строку
Сразу оговорюсь, что это настройка глобальная для операционной системы Windows и если она активна, это не означает, что на уровне отдельной сетевой карты RSS не отключен, я приведу такой пример, когда буду описывать PowerShell.
Для того, чтобы проверить текущие, глобальные настройки вам необходимо открыть cmd от имени администратора. Далее введите:
Тоже самое можно посмотреть и для списка удаленных серверов. Для этого достаточно иметь список имен и воспользоваться PowerShell. Вот пример скрипта:
# Путь к файлу со списком серверов
$serverListPath = "C:\Temp\servers.txt"
# Чтение списка серверов из файла и помещение их в переменную
$servers = Get-Content $serverListPath
# Цикл для выполнения команды на каждом сервере
foreach ($server in $servers) {
# Выполнение команды netsh на сервере и сохранение вывода в переменную
$output = Invoke-Command -ComputerName $server -ScriptBlock {
netsh int tcp show global
}
# Парсинг вывода команды для получения строки с Receive-Side Scaling State
$receiveSideScalingState = $output | Where-Object { $_ -like "*Receive-Side Scaling State*" }
# Вывод результата в виде имя сервера, имя сетевого интерфейса и строки с Receive-Side Scaling State
$receiveSideScalingState | ForEach-Object {
#$interfaceName = ($_ -split ":\s+")[0]
$state = ($_ -split ":\s+")[1]
Write-Host "Сервер: $server, Receive-Side Scaling State: $state"
}
}
Теперь, чтобы включить глобально Receive Side Scaling (RSS), вам нужно выполнить вот такую команду:
Для выключения:
Как видите все прекрасно работает и состояние масштабирования на стороне приема поменяло статус.
Как проверить и включить Receive Side Scaling с помощью PowerShell
Для того, чтобы получить статус RSS по всем сетевым интерфейсам, вы должны открыть PowerShell от имени администратора и ввести вот такую команду:
📌За место "*" вы можете указать точное имя сетевого интерфейса, тогда информация будет только по нему.
Как видно в моем примере, состояние масштабирования на стороне приема имеет значение "False". Значит оно выключено.
Если вы хотите массово проверить большой список серверов на состояние Receive Side Scaling, то подготовьте список в отдельном текстовом файле, где каждая строка это отдельное имя. После этого выполните данный скрипт.
# Указываем путь к файлу, содержащему список серверов
$serverListFile = "C:\Temp\servers.txt"
# Читаем список серверов из файла и помещаем их в переменную
$servers = Get-Content $serverListFile
# Проходимся по каждому серверу в списке
foreach ($server in $servers) {
# Получаем состояние работы RSS на сервере
$rssStatus = Get-NetAdapterRss -CimSession $server
# Проходимся по каждому сетевому интерфейсу на сервере
foreach ($interface in $rssStatus) {
# Выводим результат в виде имени сервера, имени сетевого интерфейса и состояния работы RSS
Write-Host "Сервер: $server, Интерфейс: $($interface.Name), Состояние RSS: $($interface.Enabled)"
}
}
На выходе получаем вот такую таблицу.
Для включения RSS есть командлет Enable-NetAdapterRss. Чтобы активировать данный функционал, выполните.
В данном примере RSS будет активирован на всех сетевых картах, если хотите выполнить на определенной сетевой карте, то команда будет такой:
Вот еще дополнительные команды, которые могут пригодится.
- ✅Показать все свойства RSS для указанного сетевого адаптера
- ✅Вывести все сетевые адаптеры с поддержкой RSS и его включенным состоянием
- Чтобы выключить Receive Side Scaling вам необходимо воспользоваться командлетом Disable-NetAdapterRss. В данном примере я отключу RSS на всех сетевых интерфейсах.
RSS-очереди
RSS-очереди (RSS queues) - это механизм, используемый для организации и обработки потоков данных в асинхронной системе. Они представляют собой специальные структуры данных, которые позволяют эффективно управлять и распределять задачи между различными компонентами системы.
Основная идея RSS-очередей заключается в том, что они служат промежуточным хранилищем для задач, ожидающих выполнения. Когда задача поступает в систему, она помещается в очередь, где ожидает своей очереди на обработку. Затем компоненты системы могут извлекать задачи из очереди и выполнять их в соответствии с определенными правилами и логикой.
По умолчанию количество NumberOfReceiveQueues равно, количеству ваших сокетов.
Поменять "Maximum Number of RSS Queues" можно через диспетчер устройств.
Или же через PowerShell. Чтобы изменить количество очередей RSS на адаптере сетевой карты, используйте команду Set-NetAdapterRss с параметром -NumberOfReceiveQueues
Чтобы указать диапазон CPU, который сетевой адаптер может использовать для RSS, используйте команду Set-NetAdapterRss с параметрами -BaseProcessorNumber и -MaxProcessorNumber, чтобы указать нижний и верхний пределы диапазона CPU. Изменение диапазона эффективно изменяет количество ядер CPU, используемых сетевой картой для RSS.
В случаях, когда использование всех доступных CPU нежелательно, пользователь может ограничить количество одновременно используемых ЦП. По сути, этот параметр изменяет количество одновременно используемых очередей RSS, оставляя некоторые очереди неиспользуемыми.
Дополнительные ссылки
- https://kb.vmware.com/s/article/2008925
- http://forum.oszone.net/post-925527-22.html
- https://learn.microsoft.com/en-us/powershell/module/netadapter/get-netadapterrss
- https://learn.microsoft.com/en-us/powershell/module/netadapter/enable-netadapterrss
- https://www.broadcom.com/support/knowledgebase/