Низкая производительность сети с KVM (драйверы virtio) - Обновление: с vhost_net
Я настраивал несколько сетей на основе KVM раньше и никогда не сталкивался с этой проблемой, не могу даже подумать, что я настроил бы по-другому ранее.
Настроить
По сути, у меня есть и полностью Dell Stack:
- 2x Dell N2024 (стекированные гигабитные коммутаторы)
- Несколько Dell R720 для гипервизоров KVM
- 2x Dell R320 для шлюзов / брандмауэров
Все машины работают под управлением CentOS6.5, гипервизоров, в основном стандартной установки с несколькими настройками sysctl.
На данный момент у меня есть несколько тестовых настроек виртуальных машин, с настройками, аналогичными их мастерам (CentOS 6.X, базовая установка с базовой конфигурацией, управляемой марионетками). Все виртуальные машины:
- Соединен с одной из двух физически разделенных сетей (т. Е. Каждый гипервизор имеет два Ethernet-соединения, одно для общедоступной /DMZ-сети, другое, частное)
Все виртуальные машины используют virtio для сетевых, блочных устройств (в основном это стандартный результат выполнения команды virt-install) - например (пример конфигурации libvirt)
<interface type='bridge'> <mac address='52:54:00:11:a7:f0'/> <source bridge='dmzbr0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
и все виртуальные машины имеют доступ к от 2 до 8 VCPU и от 8 до 64 ГБ ОЗУ, а их диски являются томами LVM на хост-машине
Некоторые простые копии файлов в ВМ и тесты dd дают совершенно приемлемые результаты (300 МБ / с - 800 МБ / с в этих небольших синтетических тестах)
Производительность сети между физическими машинами
Я оставил конфигурации Jumbo Frame/MTU на данный момент, и передача с сервера на сервер вполне удастся максимально увеличить гигабитное соединение (или около того) (100 МБ / с -> 118 МБ / с на нескольких тестах больших файлов с каждой машины).)
Производительность сети между физической машиной и виртуальной машиной (и виртуальной машиной к виртуальной машине)
Передача Rsync/SSH постоянно меняется (нестабильно), но всегда между 24 МБ / с и максимумом около 38 МБ / с.
Я выполнил несколько других тестов: - между IP-адресом физических машин на одном мосту с виртуальной машиной (на другом мосте) - между IP-адресом физических машин на одном мосту с виртуальной машиной (на том же мосте) - попытался запустить виртуальную машину с помощью e1000 драйверы устройств вместо virtio
Кажется, ничего не сработало, кто-нибудь сталкивался с таким значительным снижением производительности раньше? Я только что проверил мою старую сеть (размещенную на другом DC), и кроме того факта, что он использует другой коммутатор (очень дешевый старый PowerConnect 2824), производительность сети виртуальных машин кажется ближе к 80-90% от чистой сети производительность (не менее половины)
Если я могу предоставить какие-либо настройки / конфигурации или дополнительную информацию, я более чем рад!
Обновление (14/08/2014)
Пробовал несколько вещей:
- Включение Jumbo frames/MTU 9000 на мосту хоста и адаптере и виртуальных машинах (незначительное улучшение производительности (в среднем выше 30 МБ / с)
- Протестировано GSO,LRO,TSO вкл / вкл на хосте (без заметного эффекта)
- Опробована дальнейшая оптимизация sysctl (настройка rmem/wmem, с устойчивым увеличением производительности на 1-2%)
- Протестированный драйвер vhost_net (небольшое увеличение производительности)
- Драйвер vhost_net включен (как указано выше) с теми же оптимизациями sysctl (как минимум, повышение производительности на 10-20% ранее)
- согласно руководству по оптимизации производительности Redhat, которое они упоминали, включение многозадачности может помочь, хотя я не заметил никакой разницы.
Кажется, что хост находится на 125% CPU (для процесса хоста), может ли это иметь какое-то отношение к назначению слишком большого количества VCPU для гостевой системы или привязки CPU/Numa?
Однако, после всего этого, я, кажется, увеличил среднюю поддерживаемую скорость от 25-30 МБ / с до 40-45 МБ / с. Это приличное улучшение, но я уверен, что смогу приблизиться к голой металлической производительности (в настоящий момент это еще чуть меньше половины).
Есть другие идеи?
1 ответ
Ваши экземпляры KVM должны быть в состоянии насыщать ваше сетевое соединение хостов без проблем.
Моя первая рекомендация - обновить ядро хоста и гостя. Стандартное ядро CentOS 6.5 не имеет большой производительности для KVM. Я бы предложил kernel-lt от ELRepo (или kernel-ml, если вы чувствуете себя смелым). Это должно дать вам приличное повышение производительности сразу.
Затем попробуйте выполнить тестирование с iperf3 (или даже с более старым iperf). Это даст вам как можно более чистое сетевое соединение. Ваши тесты rsync/ssh на самом деле не действительны, потому что они определенно попадают на диск. RSync особенно может не выполнять последовательный ввод-вывод, например, тест dd (попробуйте вместо этого использовать fio).
Интересно, что трафик между виртуальными машинами и виртуальными машинами фактически не попадет в сетевой контроллер. Это будет сделано исключительно на хосте, поэтому остальная часть вашей сети (и различные параметры разгрузки) на самом деле не имеют никакого значения.
Еще одна вещь, чтобы проверить: ваш сервер снизил нагрузку на процессоры? У нас было несколько компьютеров Dell, которые думали, что они простаивают, и начали запускать процессор значительно медленнее, чем следовало бы. Система энергосбережения не всегда хорошо распознает нагрузку на сервер.
Вы определенно хотите, чтобы virtio здесь, даже не тратьте свое время на тестирование любого из эмулируемых вариантов.
Вы не упомянули об этом, но если на вашем сервере установлены сетевые карты i350, вы можете посмотреть SR-IOV (при условии, что вы хотите <= 7 виртуальных машин на машину). Это дает ВМ прямой доступ к физическому NIC (за счет потери функциональности, такой как отсутствие поддержки nwfilter), и будет более эффективным. Вам не нужно это, чтобы получить полные гигабитные скорости, хотя.