OSBN/Ubuntuusers Planet RHEL / CentOS XING / LinkedIn / Amazon

Persistenter txqueuelen Netzwerk-Parameter mithilfe udev

Einer von vielen konfigurierbaren Netzwerkschnittstellen-Parametern ist txqueuelen. Dieser Parameter definiert die Größe der Warteschlange, in welcher Daten vom Kernel zwischengespeichert werden, bis diese über das Netzwerk versendet wurden. Standardmäßig hat dieser Parameter den Wert 1000 – je nach Anwendung bedarf es hier einer Änderung, die man in aller Regel über ifconfig oder ip setzt:

# ifconfig eth0 txqueuelen 5000
# ip link set eth0 txqueuelen 5000

Das ist keine sonderlich elegante Lösung, da dieses Kommando nach jedem Reboot oder Netzwerk-Neustart erneut abgesetzt werden muss. Natürlich kann man das auch in die /etc/rc.local eintragen – aber das geht auch schöner.. 🙂

Unter Red Hat Enterprise Linux bzw. CentOS soll es gemäß einem Bugfix-Report eine Variable geben, die in der Konfigurationsdatei der Netzwerkschnittstelle hierfür verwendet werden kann – unter RHEL5 und 6 funktionierte das jedoch nicht bei mir:

# vi /etc/sysconfig/network-scripts/ifcfg-eth0
...
IFCONFIG_OPTS="txqueuelen 5000"

ESC ZZ
# ifdown eth0; ifup eth0
# ifconfig eth0|grep txqueuelen
          collisions:0 txqueuelen:1000

Schöner lässt sich das Ganze mit udev lösen. Es genügt einfach eine kleine Regel unter /etc/udev/rules.d/60-custom-txqueuelen.rules anzulegen, die beim Erkennen der Netzwerkkarte das oben genannte ifconfig-Kommando absetzt:

#
# custom txqueuelen parameter value
#
# Sets a custom txqueuelen parameter value for network interfaces.
# This variable sets the length of the transmit queue of a device.
# The default value is 1000 - depending on your application setup you
# might want to increase this value (e.g. 5000)
#

KERNEL=="eth[0,1]", RUN+="/sbin/ifconfig %k txqueuelen 5000"
#KERNEL=="eth[0-9]", RUN+="/sbin/ifconfig %k txqueuelen 5000"

Wer möchte, kann auch gleich das ip-Kommando verwenden – denn ifconfig ist ja bekanntlicherweise obsolet:

...
KERNEL=="eth[0,1]", RUN+="/sbin/ip link set %k txqueuelen 5000"
#KERNEL=="eth[0-9]", RUN+="/sbin/ip link set %k txqueuelen 5000"

Zum Übernehmen genügt eines der folgenden Kommandos:

# udevtrigger
# /sbin/udevadm trigger

Und siehe da – der Wert wurde angepasst:

# ifconfig eth0|grep txqueuelen
          collisions:0 txqueuelen:5000
# ifconfig eth1|grep txqueuelen
          collisions:0 txqueuelen:5000

🙂

Sharing is caring

6 Kommentare Neuen Kommentar hinzufügen

  1. Joerg sagt:

    Toller Beitrag !
    Habe die Problematik gerade in Zusammenhang mit Oracle VM Server 2.2.2 (Xen-Basis) und RHEL5 als Gast wo die Konfigurationen der virtuelle Devices (vif) auch extrem auseinander laufen und zu Performanceeinbrüchen (dropped packages) führt.
    Die udev Methode ist echt zu bevorzugen.

    Mit welcher Meßmethode würdest Du eine optimale Größe für die txqueuelen von 1Gb und 10Gb Karten bestimmen ?

    1. Christian sagt:

      Hallo Joerg!

      Vielen Dank für dein Feedback – freut mich, dass der Artikel geholfen hat.

      Auf welchen Werten steht denn txqueuelen bei deinen VMs? Standardmäßig wird bei den meisten Distirbutionen 1000 verwendet, was ein guter Wert zu sein scheint. Ältere Kernel hatten den Standardwert 100, was sehr oft zu schlechten Werten geführt hat.

      Prinzipiell ist die Erhöhung von txqueuelen für NICs mit 1G oder höher meist sinnvoll. Oftmals sprechen die Applikationshersteller hier selbst Empfehlungen oder Anforderungen aus – bei einer Oracle Database wird z.B. (wenn ich mich richtig erinnere) der Wert 10000 empfohlen. Letztendlich wirst Du vermutlich etwas experimentieren müssen – am Besten in 500er-Schritten ausprobieren, bis Du eine Veränderung feststellst. Eine magische Formel scheint es wohl nicht zu geben – zumindest habe ich keine Informationen hierüber gefunden.

      Jedoch gilt generell: kleinere Werte für langsamere Netzwerkkarten mit schlechterer Latenz, höhere Werte für schnellere Netzwerkkarten mit höherer Latenz.

      Ich hoffe, das konnte Dir (zumindest etwas) helfen. Lass mal hören, welche Werte bei Dir am besten funktionieren.

      Beste Grüße,
      Christian.

  2. Joerg sagt:

    Hi Christian,
    sorry für die späte Antwort. Hatte mittlerweilen Kontakt zum Oracle Support aufgenommen, aber die Antwort war ähnlich deiner. In 500er Schritten durchprobieren, also die Jungs haben das offensichtlich auch nie unter Last getestet. Wo man das ändern sollte war dem „Suport“ auch rel. egal.
    Ich werde mal einen parallelen Testaufbau machen und frei nach „Learning by Doing“ probieren.

    Besten Gruss
    Jörg

    1. Christian sagt:

      Hi Jörg,
      keine Ursache!

      Ich habe befürchtet, dass es da keine allgemeingültige „Best practive“ gibt. Lass mal hören, mit welchen Parametern dein Setup am Besten funktioniert, wenn Du soweit bist.

      Beste Grüße,
      Christian.

  3. Craig sagt:

    Very useful article… One thing I found is that it appears that /etc/udev/rules.d/60-custom-txqueuelen now needs to be named /etc/udev/rules.d/60-custom-txqueuelen.rules

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.