VMWare ESXi. Проблема со скоростью сети
Проблема со скоростью сети в виртуальном окружении VMWare ESXi 5.0 оригинал статьи: http://www.netmate.ru/blogs/communication/30.php
Имеем:
- VMWare ESXi 5.0.0-469512-standart хост
- CentOS 6.2 kernel 2.6.32-220.el6.x86_64 - гостевая система в виртуальной локальной сети (так же есть Windows 7 гость)
- CentOS 6.2 kernel 2.6.32-220.el6.x86_64 - гостевая система-маршрутизатор, обеспечивающая выход в глобальную сеть для других гостевых систем
Пусть маршрутизатор = router, а гостевая система = centos_test.
Router одной сетевой картой подключен к виртуальному свитчу 1, который в свою очередь подключен к wan интерфейсу хост системы. Вторая сетевая карточка подключена к виртуальному свитчу 2, который не подключен к физическому интерфейсу.
Centos_test имеет одну сетевую карту, подключенную к свитчу 2. В качестве сетвой карточки во всех виртуальных системах используется vmxnet3 (при использовании E1000 проблема так же наблюдается).
Таким образом создается DMZ внутри одного ESXi хоста.
В такой конфигурации мы замечаем очень медленную работу с centos_test по сети. Скорость передачи падает чуть ли не до 10 килобайт в секунду. Диагностика с помощью tcpdump обнаруживает следующее:
IP a.b.c.d > x.x.x.x: ICMP y.y.y.y unreachable - need to frag (mtu 1500), length 556
где a.b.c.d - IP router, x.x.x.x - IP centos_test, y.y.y.y - IP назначения потока данных из глобальной сети.
Проанализировав трафик, понимаем - centos_test пытается отправить пакет заметно большей длины, чем MTU, на что и получает ответ о необходимости фрагментации. По каким-то причинам виртуальная сетевая карточка не заботится о максимальном размере пакета, как указано на интерфейсе.
Как решить проблему? Гугл отправляет искать причины в включенном LRO (large receive offload) в ESXi. Однако никакие рекомендованные манипуляции с настройками (Configuration->Advanced settings->Net), связанными с LRO (Net.VmxnetSwLROSL,Net.Vmxnet3SwLRO,Net.Vmxnet3HwLRO,Net.Vmxnet2SwLRO,Net.Vmxnet2HwLRO и другие), не дали результата.
Поиски решения дали понять, что в ESXi есть какие-то ошибки в реализации функциональности LRO и TSO (tcp segmentation offload), которые обнаруживаются в специфичных реализациях. Найти решение на стороне ESXi хоста не удалось, поэтому проблему нужно исправлять на стороне виртуальной машины.
Для этого в гостевой системе нужно отключить поддержку tso (в даном конкретном случае этого достаточно) на сетевой карточке:
ethtool -K eth0 tso off
Либо: ethtool -K eth2 tso off tx on sg on gro off lro off Либо в файле конфигурации адаптера /etc/sysconfig/network-scripts/ifcfg-ethХ: (Mna)
ETHTOOL_OPTS="-K eth0 tso off"
или
ETHTOOL_OPTS="-K eth1 tso off"
и т.д... в каждом конф. файле.
Но в данной конкретной системе (свежая установка Centos 6.2 без апдейта) вместо выключения tso будет ошибка:
Cannot set device tcp segmentation offload settings: Operation not supported
И только после обновления ядра (в моем случае до 2.6.32-220.13.1.el6.x86_64) команда отрабатывает без ошибок.
После этого работа с сетью нормализуется. Чтобы после перезагрузки tso выключалось без вашего вмешательства, добавьте команду в /etc/rc.local (для CentOS). (если отключали не через /etc/sysconfig/network-scripts/ifcfg-ethX)
В гостевой системе Windows 7 нужно зайти в настройки сетевой карточки и выключить опцию:
“IPv4 - разгрузка большой отправки” для Е1000 и “IPv4 Giant TSO Offload” для vmxnet3.
Подобная проблема на Hyper-V: http://www.netmate.ru/blogs/moskalev/marvell-88e8056-i-hyperv.php
(+Mna) Для Ubuntu: Создаем файл /etc/network/if-up.d/ifpatch:
#!/bin/sh # Решение проблемы с большими пакетами в виртуальной среде /sbin/ethtool -K $IFACE tso off tx on sg on gro off lro off
Далее:
chmod+x /etc/network/if-up.d/ifpatch
Наслаждаемся!
Я сказал, НАСЛАЖДАЕМСЯ!!!
(-Mna)