Оптимизация и offloading сети

Тут мы поговорим о различных техниках и механизмах, призванных оптимизировать или улучшить использование сети виртуальными машинами.

TCP Segmentation Offload (TSO, LSO)

Когда хосту ESXi или виртуальной машине необходимо передать большой пакет данных в сеть, пакет должен быть разбит на более мелкие сегменты, которые могут пройти через все физические коммутаторы и возможные маршрутизаторы в сети на пути к месту назначения пакета. TSO позволяет стеку TCP/IP передавать кадры большего размера, даже до 64 КБ, если максимальный размер передаваемого блока (MTU) интерфейса настроен для меньших кадров. Затем сетевая карта делит большой кадр на кадры размером MTU и добавляет скорректированную копию начальных заголовков TCP / IP. То есть дробление на сегменты происходит средствами NIC, а не CPU, тем самым экономя его ресурсы. Обычно TSO включено по умолчанию на физических сетевых адаптерах. Стоит включить TSO на vNIC внутри гостевой системы, по-другому называется еще Large Send Offload. Так же стоит использовать TCO и на уровне VMKERNEL для нужд гипервизора:

esxcli network nic software set --ipv4tso=1 -n vmnicX
esxcli network nic software set –-ipv6tso=1 –n vmnicX

Large Receive Offload (LRO)

Large Receive Offload (LRO) можно рассматривать как функцию, прямо противоположную TSO / LSO. Это метод, который объединяет несколько входящих сетевых пакетов из одного потока в более крупные пакеты и передает полученные в результате более крупные, но меньшее количество пакетов в сетевой стек TCP-стека гостевой ОС хоста или виртуальной машины. Этот процесс приводит к меньшей нагрузке на ЦП, поскольку ЦП имеет меньше пакетов для обработки по сравнению с отключенным LRO. Но эта функция увеличивает задержку сетевых пакетов, так как они находятся некоторое время в буфере NIC. Данная функция противопоказана чувствительным к задержке приложениям и системам. Как и в случае с TSO / LSO, чтобы полностью использовать функциональность LRO, она должна быть включена на всем пути данных, то есть на физическом адаптере, ESXi хосте и на vNIC. Узнаем включена ли она в ESXi:

esxcli system settings advanced list -o /Net/TcpipDefLROEnabled

Так же можно корректировать размер буфера с помощь настройки:

esxcli system settings advanced list -o /Net/VmxnetLROMaxLength 

(максимально 65535 байт или 64 KB)

Уменьшение размера буфера может уменьшить сетевые задержки. Функция LRO работает для гостевых систем только на VMXNET3 адаптере и может быть включена настройкой Receive Side Coalescing (RSC).

TCP Checksum Offloading (TCO)

Checksum Offload (CSO) or TCP Checksum Offloading (TCO). Проверка 16-ти битного заголовка у сетевого пакета выполняется на NIC вместо CPU, тем самым разгружая последний. Бывает RX и TX разгрузка. В зависимости от потока трафика, возможностей CSO и конфигурации всех задействованных компонентов расчет контрольной суммы будет выполняться на разных уровнях в цепочке связи. Компонент может быть гостевой ОС, vNIC или pNIC. Например, если виртуальная машина взаимодействует с другой виртуальной машиной на другом хосте ESXi, вычисление контрольной суммы передачи (Tx) выполняется как на pNIC, так и на vNIC, при условии, что у обоих включен CSO. Если CSO не включен на vNIC, расчет контрольной суммы всегда будет выполняться гостевой ОС. Однако, если у pNIC отключен CSO, но он включен на vNIC, вычисление контрольной суммы будет выполнено в ядре виртуальной машины. Контрольная сумма приема (Rx) в идеале будет обрабатываться pNIC на хосте ESXi, где находится принимающая виртуальная машина, если она включена. Поскольку это освободит циклы центрального процессора ESXi, имеет смысл всегда включать CSO на pNIC, если он поддерживается.

Receive Side Scaling

Или RSS, если кратко. RSS имеет те же базовые функции, что и (Dynamic) NetQueue, оно обеспечивает балансировку нагрузки при обработке полученных сетевых пакетов. RSS устраняет узкое место в одном потоке, позволяя получать сетевые пакеты от pNIC совместно с несколькими ядрами ЦП. Если простыми словами, то, входящий траффик в сетевой интерфейс по умолчанию обрабатывается одним потоком (Netpoll), который конечно может исполняться в пределах только одного ядра CPU и соответственно ограничен его ресурсами, что влечет за собой падение производительности NIC при большом объеме траффика и, если сам NIС имеет большую пропускную способность, например, 40GE. Настраивается RRS в драйвере NIC ESXi хоста. И чтобы иметь полную выгоду от RSS, стоит настроить его на всем пути следования сетевого траффика в ESXi, то есть и в гостевой системе тоже. RSS доступен на VMXNET3 и HW не ниже 7 версии.

Netpoll Thread Scaling

Какждый физический NIC (pNIC) экипирован по умолчанию одним процессом Netpoll. Процесс Netpoll занимается приемом входящего в pNIC траффика или I/O и «пропихиванием» его в виртуальную машину. По умолчанию такой процесс один для каждого pNIC, но использование таких функций как NetQueue или RSS увеличивает количество Netpoll процессов, для каждой очереди свой Netpoll процесс, что положительно сказывается на пропускной способности сетевой подсистемы ESXi и сетевых задержках.

NetWorld Thread Scaling

По умолчанию каждая виртуальная машина оснащена только одним потоком Tx (NetWorld-VM-XXX). Поскольку сетевые пакеты передаются от виртуальной машины к уровню pNIC через VMkernel, ESXi потребляет циклы ЦП. Эти циклы или время ЦП также будут учитываться самой виртуальной машиной, но не будут учтены как %SYS. Опять же, по умолчанию запускается только один поток Tx. Это коррелирует с одним ядром процессора. Вот почему NetWorld не превысит 100%%USED. Для улучшения этой ситуации существует настройка ethernetX.ctxPerDev. Возможно выставить количество NetWorld процессов для каждого vNIC (Не для машины целиком, а для vNIC). Можно добавить для каждого vNIC свой собственный поток или же добавить на каждый vNIC несколько потоков.

SplitRx Mode

SplitRx Mode — это технология, которая позволяет виртуальной машине использовать несколько ядер ЦП для обработки входящих сетевых пакетов, которые обрабатываются одной очередью. Возможность использовать несколько ядер ЦП позволяет виртуальной машине потреблять больше процессорного времени и, тем самым, значительно улучшать производительность входящей сети. Однако улучшение SplitRx Mode потенциально применимо только к определенным рабочим нагрузкам. Он в основном используется в сценариях, связанных с многоадресным сетевым трафиком, как в примере с несколькими виртуальными машинами, которые работают на одном хосте ESXi и все получают многоадресный трафик из одного источника.

Режим SplitRx был представлен в ESXi 5.0 и включен по умолчанию для требуемого виртуального сетевого адаптера VMXNET3, начиная с ESXi 5.1. Он сработает автоматически, когда ESXi обнаружит, что одна сетевая очередь на pNIC чрезмерно загружена и обрабатывает более 10 000 широковещательных или многоадресных пакетов в секунду (PPS).

У вас есть свобода выбора отключить режим SplitRx для всего хоста ESXi. Вы можете сделать это, настроив следующие расширенные настройки на уровне хоста ESXi; NetSplitRxMode = «0»

Если рабочая нагрузка может выиграть от режима SplitRx, его можно включить для определенных виртуальных сетевых адаптеров внутри виртуальной машины, даже если параметр хоста ESXi для использования режима SplitRx отключен. Все, что вам нужно сделать, это добавить расширенный параметр в конфигурацию виртуальной машины, который включит режим SplitRx для определенного vNIC:

ethernetX.emuRxMode = "1"

«X» обозначает виртуальный сетевой адаптер. Помните, что этот параметр не вступит в силу до перезапуска виртуальной машины или повторного подключения vNIC.

SplitTx Mode

Режим SplitTx позволяет создать два отдельных потока для одного потока для распараллеливания обработки vNIC и физического NIC:

  • обработка vNIC-to-virtual switch
    •  Виртуальный переход к обработке физических NIC

Режим SplitTx должен быть включен для каждого хоста с помощью следующей команды хоста:

vsish –e set / net / pNics / vmnicX / sched / txMode 1


Использование двух потоков значительно увеличивает скорость прохождения трафика через уровень ядра.

Сравнительная таблица

ФункцияВлияние на задержкиВлияние на CPUУровни настрокиТребуемый vNIC
TSO/LSOУменьшение нагрузкиpNIC, ESXi, vNICVMXNET3
LROувеличиваетУменьшение нагрузкиpNIC, ESXi, vNICVMXNET3
TCOУменьшение нагрузкиpNIC, ESXi, vNICVMXNET3
RSSуменьшаетУвеличение нагрузкиpNIC, ESXi, vNIC 
Netpoll scalingуменьшаетУвеличение нагрузкиpNIC, ESXi (NetQueue или RSS) 
NetWorld scalingуменьшаетУвеличение нагрузкиESXi 
SplitRXУменьшает (если много мультикаста/броадкаста)Увеличение нагрузкиvNICVMXNET3

Таблица заполнялась на основе Host Resources Deep Dive.