Die Rate, mit der mein Server neue eingehende TCP-Verbindungen akzeptieren kann, ist unter Xen wirklich schlecht. Der gleiche Test auf Bare-Metal-Hardware zeigt 3-5-fache Geschwindigkeitssteigerungen.
- Wieso ist das unter Xen so schlimm?
- Können Sie Xen optimieren, um die Leistung für neue TCP-Verbindungen zu verbessern?
- Gibt es andere Virtualisierungsplattformen, die für diese Art von Anwendungsfällen besser geeignet sind?
Hintergrund
In letzter Zeit habe ich einige Leistungsengpässe eines eigens entwickelten Java-Servers unter Xen untersucht. Der Server spricht HTTP und beantwortet einfache TCP-Verbindungs- / Anforderungs- / Antwort- / Trennungsanrufe.
Aber selbst wenn eine Schiffsladung Verkehr an den Server gesendet wird, können nicht mehr als ~ 7000 TCP-Verbindungen pro Sekunde akzeptiert werden (auf einer 8-Core-EC2-Instanz, c1.xlarge mit Xen). Während des Tests zeigt der Server auch ein merkwürdiges Verhalten, bei dem ein Kern (nicht unbedingt CPU 0) zu mehr als 80% ausgelastet ist, während die anderen Kerne fast untätig bleiben. Dies lässt mich glauben, dass das Problem mit dem Kernel / der zugrunde liegenden Virtualisierung zusammenhängt.
Wenn ich dasselbe Szenario auf einer nicht virtualisierten Bare-Metal-Plattform teste, erhalte ich Testergebnisse, die TCP-Accept () - Raten über 35.000 / Sekunde anzeigen. Dies auf einer Core i5 4 Core-Maschine, auf der Ubuntu ausgeführt wird, wobei alle Kerne fast voll ausgelastet sind. Für mich scheint diese Art von Figur ungefähr richtig zu sein.
Auf der Xen-Instanz habe ich erneut versucht, fast alle Einstellungen in sysctl.conf zu aktivieren / optimieren. Einschließlich der Aktivierung von Receive Packet Steering und Receive Flow Steering sowie des Fixierens von Threads / Prozessen auf CPUs, jedoch ohne erkennbare Vorteile.
Ich weiß, dass eine verminderte Leistung zu erwarten ist, wenn virtualisiert ausgeführt wird. Aber bis zu diesem Punkt? Ein langsamerer Bare-Metal-Server, der die Leistung von virt übertrifft. 8-Kern um den Faktor 5?
- Ist das wirklich erwartetes Verhalten von Xen?
- Können Sie Xen optimieren, um die Leistung für neue TCP-Verbindungen zu verbessern?
- Gibt es andere Virtualisierungsplattformen, die für diese Art von Anwendungsfällen besser geeignet sind?
Reproduzieren dieses Verhaltens
Als ich dies weiter untersuchte und das Problem herausfand, stellte ich fest, dass das netperf- Leistungstest-Tool das ähnliche Szenario simulieren könnte, das ich erlebe. Mit dem TCP_CRR-Test von netperf habe ich verschiedene Berichte von verschiedenen Servern (sowohl virtualisiert als auch nicht virtuell) gesammelt. Wenn Sie mit einigen Ergebnissen beitragen oder meine aktuellen Berichte einsehen möchten , lesen Sie bitte https://gist.github.com/985475
Woher weiß ich, dass dieses Problem nicht auf schlecht geschriebene Software zurückzuführen ist?
- Der Server wurde auf Bare-Metal-Hardware getestet und sättigt fast alle verfügbaren Kerne.
- Bei der Verwendung von Keep-Alive-TCP-Verbindungen wird das Problem behoben.
Warum ist das wichtig?
Bei ESN (meinem Arbeitgeber) bin ich Projektleiter von Beaconpush , einem in Java geschriebenen Comet / Web Socket-Server. Obwohl es sehr performant ist und unter optimalen Bedingungen nahezu jede Bandbreite auslasten kann, ist es immer noch darauf beschränkt, wie schnell neue TCP-Verbindungen hergestellt werden können. Das heißt, wenn Sie eine große Benutzerabwanderung haben, bei der Benutzer sehr oft kommen und gehen, müssen viele TCP-Verbindungen eingerichtet / abgebaut werden. Wir bemühen uns, diese Probleme so lange wie möglich zu lösen. Aber am Ende ist es die accept () - Performance, die unsere Kerne davon abhält, sich zu drehen, und das gefällt uns nicht.
Update 1
Jemand hat diese Frage in Hacker News gestellt , es gibt dort auch einige Fragen / Antworten. Aber ich werde versuchen, diese Frage mit Informationen auf dem neuesten Stand zu halten, die ich im Laufe der Zeit finde.
Hardware / Plattformen, auf denen ich das getestet habe:
- EC2 mit Instanztypen c1.xlarge (8 Kerne, 7 GB RAM) und cc1.4xlarge (2x Intel Xeon X5570, 23 GB RAM). Die verwendeten AMIs waren ami-08f40561 bzw. ami-1cad5275. Jemand wies auch darauf hin, dass die "Sicherheitsgruppen" (dh die EC2-Firewall) ebenfalls Auswirkungen haben könnten. Aber für dieses Testszenario habe ich nur auf localhost versucht, externe Faktoren wie diese zu eliminieren. Ein weiteres Gerücht, das ich gehört habe, ist, dass EC2-Instanzen nicht mehr als 100.000 PPS übertragen können.
- Zwei private virtualisierte Server, auf denen Xen ausgeführt wird. Man hatte vor dem Test keine Last, machte aber keinen Unterschied.
- Privater dedizierter Xen-Server bei Rackspace. Über die gleichen Ergebnisse gibt.
Ich bin dabei, diese Tests erneut auszuführen und die Berichte unter https://gist.github.com/985475 auszufüllen. Wenn Sie helfen möchten, tragen Sie Ihre Zahlen ein. Es ist einfach!
(Der Aktionsplan wurde in eine separate, konsolidierte Antwort verschoben.)