Frage Schlechte Netzwerkleistung mit KVM (Virtio-Treiber) - Update: mit vhost_net


Ich habe schon mehrere KVM-basierte Netzwerke eingerichtet, und dieses Problem ist mir noch nie begegnet, ich kann nicht für das Leben von mir denken, was ich vorher anders eingerichtet hätte.

Konfiguration

Im Grunde habe ich und ganz Dell Stack:

  • 2x Dell N2024 (gestapelte Gigabit-Switches)
  • Mehrere Dell R720 für KVM Hypervisor
  • 2x Dell R320 für Gateway / Firewalls

Alle Rechner laufen mit CentOS6.5, den Hypervisoren, die im Prinzip mit einigen sysctl Tweaks installiert werden.

Im Moment habe ich ein paar Test-VM-Setups mit ähnlichen Einstellungen wie bei ihren Mastern (CentOS 6.X, Basisinstallation mit einfacher marionettengesteuerter Konfiguration). Alle VMs sind:

  • Überbrückt mit einem von zwei physisch getrennten Netzwerken (d. H. Jeder Hypervisor hat zwei Ethernet-Verbindungen, eine für ein öffentliches / DMZ-überbrücktes LAN, die andere, eine private)
  • Alle VMs verwenden virtio für Netzwerk-, Block-Geräte (im Grunde Standard-Ergebnis des virt-install-Befehls) - Beispiel (Beispiel libvirt config)

    <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>
    
  • und alle VMs haben Zugriff auf 2 bis 8 VCPUs und 8 und 64 GB RAM, und ihre Laufwerke sind LVM-Volumes auf dem Host-Rechner

Einige einfache Dateikopien innerhalb der VM und dd-Tests liefern vollkommen akzeptable Ergebnisse (300 MB / s - 800 MB / s in diesen kleinen synthetischen Tests)

Netzwerkleistung zwischen physischen Maschinen

Ich habe Jumbo Frame / MTU-Konfigurationen für jetzt verlassen, und Server-zu-Server-Transfer wird ziemlich glücklich die Gigabit-Verbindung (oder dort über) (100 MB / s -> 118 MB / s flach über mehrere große Dateitests zu / von jeder Maschine)

Netzwerkleistung zwischen einem physischen Computer und einer VM (und VM zu VM)

Rsync / SSH-Übertragung ändert sich ständig (instabil) aber immer zwischen 24 MB / s und maximal 38 MB / s

Ich habe mehrere andere Tests durchgeführt:  - Zwischen einer physischen Maschinen-IP auf einer Brücke zur VM (auf einer anderen Brücke)  - Zwischen einer physischen Maschinen-IP auf einer Brücke zur VM (auf derselben Brücke)  - Versucht, die VM zu starten e1000 Gerätetreiber statt Virtio

Nichts scheint zu funktionieren, hat jemand schon so viel von einer Leistungsverschlechterung erfahren? Ich habe gerade mein älteres Netzwerk (gehostet in einem anderen DC) überprüft, und abgesehen davon, dass es einen anderen Switch (einen sehr viel billigeren alten PowerConnect 2824) verwendet, scheint die VM-Netzwerkleistung näher bei 80-90% des rohen Netzwerks zu liegen Leistung (nicht weniger als die Hälfte)

Wenn ich irgendwelche Einstellungen / Konfigurationen oder zusätzliche Informationen bereitstellen kann, bin ich mehr als glücklich!

Update (14.08.2014)

Versuchte ein paar Dinge:

  • Aktivierte Jumbo-Frames / MTU 9000 auf Host Bridge und Adapter und VMs (marginale Performance-Verbesserung (Durchschnitt über 30MB / s)
  • Geprüfte GSO, LRO, TSO aus / auf dem Host (kein merklicher Effekt)
  • Getestet weitere sysctl-Optimierungen (Optimierung von rmem / wmem, mit anhaltender 1-2% Performance-Steigerung)
  • Getesteter vhost_net-Treiber (geringe Leistungssteigerung)
  • vhost_net-Treiber aktiviert (wie oben) mit den gleichen sysctl-Optimierungen (mindestens 10-20% Performance-Sprung vorher)
  • Wie in redhats Performance Optimization Guide erwähnt, könnten Multiqueue helfen, obwohl ich keinen Unterschied bemerkte.

Der Host scheint bei 125% CPU zu sitzen (für den Host-Prozess), könnte dies etwas damit zu tun haben, zu viele VCPUs der Gast- oder CPU / Numa-Affinität zuzuweisen?

Nach alldem habe ich jedoch die durchschnittliche Dauerrate von 25-30 MB / s auf 40-45 MB / s erhöht. Es ist eine ordentliche Verbesserung, aber ich bin mir sicher, dass ich der Bare-Metal-Performance näher kommen kann (im Moment ist es immer noch ein fairer Weg unter der Hälfte).

Irgendwelche anderen Ideen?


5
2017-08-13 09:29


Ursprung


Sie haben Jumbo-Frames erwähnt, sind sie auf dem gesamten Netzwerk-Stack und in den VMs eingerichtet? - dyasny
Ich habe sie bisher noch gar nicht aktiviert, nicht auf dem Switch oder irgendeiner der Maschinen - kwiksand
Ok, ich würde damit anfangen ethtool -k und beginnen mit dem Deaktivieren von TSO, LRO, GSO - dyasny
Ich habe sie gerade in einem Test ausgeschaltet, aber bisher noch nicht geholfen. Weitere Informationen zum "Spielen" mit ihnen? Ändere ich den Bridged Ethernet Port auf dem Host? Der Ethernet-Anschluss? Oder nur der eth0 Adapater in jedem Gast? - kwiksand
der ethX-Adapter unter der Bridge auf dem Host tatsächlich - dyasny


Antworten:


Ihre KVM-Instanzen sollten in der Lage sein, die Netzwerkverbindung Ihres Hosts problemlos zu sättigen.

Meine erste Empfehlung lautet hier, sowohl den Host- als auch den Gast-Kernel zu aktualisieren. Der auf Lager befindliche CentOS 6.5 Kernel hat keine großartige Leistung für KVM. Ich würde kernel-lt von ELRepo vorschlagen (oder kernel-ml, wenn Sie sich mutig fühlen). Dies sollte Ihnen auf Anhieb einen anständigen Leistungsschub geben.

Versuchen Sie es als nächstes mit iperf3 (oder sogar dem älteren iperf). So erhalten Sie eine möglichst reine Netzwerkverbindung. Ihre rsync / ssh-Tests sind nicht wirklich gültig, da sie definitiv auf die Festplatte treffen. RSync kann insbesondere keine sequentielle IO wie Ihren dd-Test ausführen (versuchen Sie stattdessen, fio zu verwenden).

Das Interessante daran ist, dass der VM-zu-VM-Verkehr den Netzwerkcontroller nicht wirklich trifft. Dies wird rein auf dem Host geschehen, so dass der Rest Ihres Netzwerks (und die verschiedenen Offload-Einstellungen) hier keine wirkliche Bedeutung haben.

Eine andere Sache zu überprüfen: Hat Ihr Server die CPUs gedrosselt? Wir hatten eine Reihe von Dell-Rechnern, die glauben, sie wären im Leerlauf und starten die CPU deutlich langsamer, als sie eigentlich hätten sein sollen. Das Energiesparen erkennt Server-Workloads nicht immer gut.

Sie wollen auf jeden Fall virtio, verschwenden Sie nicht einmal Ihre Zeit damit, die emulierten Optionen zu testen.

Sie haben es nicht erwähnt, aber wenn Ihr Server die i350-basierten NICs hat, können Sie in SR-IOV schauen (vorausgesetzt, Sie möchten nur <= 7 VMs pro Maschine). Dadurch erhält die VM direkten Zugriff auf die physische NIC (auf Kosten des Funktionsverlusts, z. B. keine nwfilter-Unterstützung) und ist effizienter. Sie benötigen dies jedoch nicht, um volle Gigabit-Geschwindigkeiten zu erhalten.


1
2017-08-23 00:15



Vielen Dank Devicenull, sehr hilfreich! Das Testen mit iperf scheint sofort Gigabit-Geschwindigkeiten zu liefern, also war es vielleicht ein bisschen dumm von mir zu denken, dass ich dieselbe Leistung aus rsync / scp herausholen würde. - kwiksand
Als weiteren Test habe ich versucht, den Komprimierungstyp der SSH-Verbindung (Arcfour) zu ändern und die Geschwindigkeit zu erhöhen (bis zu etwa 65 MB / s). In diesem Fall klingt es sehr nach CPU-Throttling, wie Sie sagten, oder zumindest, dass es CPU-gebunden ist. Seltsam, dass die älteren Dell-Server nicht das gleiche Problem zu haben scheinen, aber die gleichen Software / Kernel-Versionen ausführen. Danke nochmal, werde deine anderen Vorschläge jetzt ausprobieren. - kwiksand