2016-06-22 1 views
3

Ich habe über Leistungsoptimierung von Linux gelesen, um die schnellsten Paketverarbeitungszeiten beim Empfangen von Finanzmarktdaten zu erhalten. Ich sehe, dass, wenn die NIC ein Paket empfängt, es es über DMA in den Speicher legt und dann eine HardIRQ auslöst - was wiederum einige NAPI-Einstellungen setzt und einen SoftIRQ auslöst. Der SoftIRQ verwendet dann NAPI/Gerätetreiber, um Daten von den RX-Puffern über Abruf zu lesen, aber dies wird nur für eine begrenzte Zeit ausgeführt (net.core.netdev_budget, standardmäßig auf 300 Pakete gesetzt). Diese sind in Bezug auf einen realen Server ubuntu, mit einem Solarflare NIC Meine Fragen sind unten ausgeführt wird:SoftIRQs und schnelle Paketverarbeitung auf Linux-Netzwerk

  1. Wenn jeder HardIRQ eine Softirq erhöht, und der Gerätetreiber liest mehrere Pakete in 1 unterwegs (netdev_budget), was passiert, zu den SoftIRQs, die von jedem der Pakete, die aus dem RX-Puffer ausgelaufen sind, ausgelöst werden (jedes erhaltene Paket wird einen harten und dann einen weichen IRQ auslösen)? Sind diese in der Warteschlange?

  2. Warum verwendet der NAPI die Abfrage, um den RX_Buffer zu entladen? Das System hat gerade einen SoftIRQ generiert und liest den RX-Puffer, warum dann das Polling?

  3. Vermutlich wird das Ablaufen des RX_Buffer über den Softirq nur von einem bestimmten RX_Buffer und nicht von mehreren RX_Buffers erfolgen? Wenn dies der Fall ist, kann das Erhöhen des netdev_budget die Verarbeitung/Entleerung anderer RX_Buffer verzögern? Oder kann dies gemildert werden, indem verschiedene RX_Buffer verschiedenen Kernen zugewiesen werden?

  4. Es gibt Einstellungen, um sicherzustellen, dass HardIRQs sofort ausgelöst und behandelt werden. SoftIRQs können jedoch zu einem späteren Zeitpunkt verarbeitet werden. Gibt es Einstellungen/Konfigurationen, um sicherzustellen, dass SoftIRQs, die sich auf den Netzwerkempfang beziehen, ebenfalls mit höchster Priorität und ohne Verzögerungen behandelt werden?

+0

Dies könnte besser für eine der Linux/Ubuntu Stack Exchange-Sites geeignet sein. –

Antwort

3

Ich schrieb einen umfassenden Blog-Post, die Antworten auf Ihre Fragen und alles andere über Tuning zu erklären, die Optimierung, Profilierung und das Verständnis der gesamten Linux-Netzwerk-Stack here.

Antworten auf Ihre Fragen:

  1. sofirqs durch den Fahrer erhöht, während ein Softirq nichts tun Verarbeitung ist. Dies liegt daran, dass der NAPI-Hilfscode zuerst überprüft, ob NAPI bereits ausgeführt wird, bevor versucht wird, den Softirq zu erhöhen. Auch wenn der NAPI nicht überprüft hat, können Sie see from the softirq source Softirqs als Bit-Vektor implementieren. Dies bedeutet, dass ein Softirq nur 1 (ausstehend) oder 0 (nicht ausstehend) sein kann. Während es auf 1 festgelegt ist, haben zusätzliche Aufrufe, es auf 1 festzulegen, keine Auswirkung.

  2. Der Softirq wird verwendet, um die NAPI-Poll-Schleife zu starten und die NAPI-Abfrage zu steuern, so dass sie nicht 100% der CPU-Auslastung verbraucht. Die NAPI-Poll-Schleife ist nur eine For-Schleife, und der Softirq-Code verwaltet, wie viel Zeit er ausgeben kann und wie viel Budget er hat.

  3. Jede CPU, die Pakete verarbeitet, kann das volle Budget ausgeben. Wenn das Budget auf 300 eingestellt ist und Sie über 2 CPUs verfügen, kann jede CPU 300 Pakete verarbeiten, insgesamt also 600. Dies trifft nur zu, wenn Ihre NIC mehrere RX-Warteschlangen unterstützt und Sie die IRQs an separate CPUs verteilt haben wird bearbeitet. Wenn Ihre Netzwerkkarte dies nicht tut, können Sie mit Packet Steering helfen (RPS). Weitere Informationen finden Sie in meinem Blogpost oben.

  4. Nein, dafür gibt es keine Einstellungen. Beachten Sie, dass die Softirqs auf der gleichen CPU laufen, die sie angehoben hat. Wenn Sie also Ihren hardirq-Handler für die RX-Warteschlange 1 auf CPU 16 setzen, wird der Softirq auf der CPU 16 ausgeführt.Eine Sache, die Sie tun können, ist: Stellen Sie Ihre hardirqs zu bestimmten CPUs und legen Sie die Anwendung fest, die diese Daten zu denselben CPUs verwendet. Alle anderen Anwendungen (wie Cron-Jobs, Hintergrund-Tasks usw.) an andere CPUs anheften - dies stellt sicher, dass nur der Hardirq-Handler, Softirq und die Anwendung, die die Daten verarbeitet, ausgeführt werden können.

Wenn Sie extrem niedrige Latenz Netzwerkpaket liest wünschen, sollten Sie versuchen, einen neuen Linux-Kernel-Funktion busy polling genannt Vernetzung. Es kann verwendet werden, um die Latenz der Netzwerkpaketverarbeitung zu minimieren und zu reduzieren. Mit dieser Option wird die CPU-Auslastung erhöht.

+0

Danke @ Joe-Damato. Dein Blogbeitrag war sehr hilfreich. Als Follow-up - Ich habe eine Solarflare NIC mit gepaarten RX und TX-Warteschlangen (8 Sätze, 8-Kern-Maschine) und jeder Satz teilt eine IRQ-Nummer. Ich habe smp_affinity verwendet, um festzulegen, welche irqs von welchem ​​Kern verarbeitet werden. Dies würde dann jedoch auch sicherstellen, dass die Sende (tx) -Interrupts ebenfalls von demselben Kern behandelt werden. Wie wird das mit xps funktionieren? Gibt es auch eine Möglichkeit zu sehen, welche TX-Warteschlange für eine bestimmte App/TCP-Verbindung verwendet wird? – Nidhi

+0

Hi @Nidhi hört sich so an, als würde ich eine komplett andere Frage stellen, anstatt einen Kommentar zu schreiben :) Gibt es etwas, das in meiner Antwort fehlt, damit es akzeptiert wird? –

Verwandte Themen