In der Juni-Ausgabe des IT-Administrator dreht sich alles um den Schwerpunkt 'Monitoring & Dokumentation'. So zeigen wir Ihnen, wie die Netzwerküberwachung in ... (mehr)

Netzwerkeinstellung optimieren

Für das Monitoring von Netzwerk-I/O stellt Linux ebenfalls eine Vielzahl von Tools zur Verfügung. Ein grundlegendes Verständnis des siebenstufigen ISO/OSI-Referenzmodells oder des auf vier Schichten verkürzten Modells hilft bei der Bewertung der Metriken.

Erste Anlaufstelle, um Einstellungen an den Netzwerkkarten im System vorzunehmen, sollte "ethtool" sein. Rufen Sie das Tool mit dem Namen der Netzwerkkarte als Argument auf, so zeigt es die Einstellungen der Karte an. Die Option "-S" liefert eine hilfreiche Statistik zurück. Um beispielsweise die automatische Aushandlung der Netzwerkkarten-Geschwindigkeit zu deaktivieren und stattdessen einen fixen Wert vorzugeben, rufen Sie das Tool wie folgt auf:

ethtool -s eth0 autoneg off
ethtool -s eth0 speed 1000 duplex full

In komplexen Umgebungen ist die Option "-p" sehr nützlich. Sie sorgt dafür, dass die LED der Netzwerkkarte dauerhaft leuchtet und die Karte so leicht identifiziert werden kann.

Das Tool netstat zeigt Informationen über Netzwerkverbindungen, Routing- Tabellen, Interface-Statistiken und Multicast-Gruppen an. Es bezieht seine Informationen dazu aus dem /proc-Dateisystem, und zwar aus den Dateien und .

Schauen wir uns den Linux-Netzwerkstack genauer an, so stellen wir fest, dass dieser auf Sockets basiert. Möchte eine Anwendung Daten über das Netzwerk transportieren, öffnet diese einen entsprechenden Socket hierfür. Jeder Socket verfügt über einen Puffer für empfangene und für zu versendende Daten. Über das bereits erwähnte virtuelle Sysfs-Dateisystem lassen sich die Größen dieser Puffer definieren. Die Modifikation erfolgt entweder direkt im Sysfs oder aber über das Tool sysctl:

sysctl -w net.core.wmem_max=8388608
sysctl -w net.core.rmem_max=8388608

Die beiden Befehle setzen die maximale Größe der beiden Puffer auf 8 MByte. Möchten Sie für das TCP-Protokoll die Minimal-, Default- und Maximal-Werte angeben, so geschieht dies ebenfalls mittels des Kommandos sysctl:

sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608"
sysctl -w net.ipv4.tcp_wmem="4096 87380 8388608"

Der maximale Wert für die TCP-Puffer muss dabei natürlich identisch mit dem zuvor gesetzten globalen Wert sein.

In Umgebungen mit vielen gleichzeitigen Verbindungen zu einem System lohnt es sich, mit diesen Werten zu experimentieren. Netzwerk-Sniffer wie beispielsweise tcpdump oder Wire-shark als grafisches Tool helfen dabei, die idealen Einstellungen zu finden. Um den Durchsatz auf dem Netzwerk zu messen, eignet sich ebenfalls Iperf [4]. Es lässt sich sowohl im Client- als auch im Server-Modus starten und misst den Durchsatz zwischen zwei Systemen. Neben den hier vorgestellten Möglichkeiten, die Puffer-Größen eines Sockets zu verändern, existieren eine Vielzahl weiterer Optionen. Der Aufruf von zeigt alle relevanten Dateien aus dem Sysfs-Dateisystem an.

Durch Trennung von Prozessen und IRQs die CPU beschleunigen

Die CPU ist das Herzstück eines Rechnersystems, daher sollten Sie auch die Metriken dieser Komponente zu deuten wissen. Eine klassische Kennzahl, um die Auslastung eines Systems zu beurteilen, ist der sogenannte Load Average. Dieser wird berechnet auf Basis der durchschnittlichen Anzahl von Prozessen in der CPU Running Queue und der Prozesse, die auf I/O warten. Sind viele I/O-lastige Prozesse auf einem System vorhanden, steigt damit automatisch auch der Load Average. Als Richtwert für den Load Average lässt sich die doppelte Anzahl der vorhandenen CPUs ansetzen. Ist der Wert höher, so steigt die Wahrscheinlichkeit, dass die CPU den Flaschenhals darstellt und das System nicht mehr flüssig arbeitet. Tools wie top oder uptime zeigen den Load Average der letzten Minuten in einstellbaren Intervallen an.

Bild 3: Prozessen wird ein virtueller Adressraum zugewiesen, in den der physikalische Speicher gemappt wird

Auch die Anzahl der Context-Switche wirkt sich auf die Leistung einer CPU aus. Bei einem Context-Switch wechselt die CPU von einem Prozess zu einem anderen, muss aber im Vorfeld den Status des aktuellen Prozesses im Speicher hinterlegen und den Status des anderen Prozesses erneut einlesen. Zu viele Context-Switche beeinflussen also negativ die Performance der CPU. Gleiches gilt übrigens auch für Interrupts (IRQ), die ebenfalls einen Context-Switch auslösen. Das Tool vmstat zeigt in den Spalten "in" und "cs" die momentane Anzahl der IRQs und der Context-Switche an. Um nun den negativen Auswirkungen entgegenzutreten, lassen sich unter Linux Prozesse wie auch Interrupts an eine bestimmte oder mehrere CPUs binden, auch CPU-Affinität genannt. Das folgende Beispiel zeigt, wie das funktioniert.

Auf einem System mit acht CPUs sollen die ersten vier (0 bis 3) für die Bearbeitung von Interrupts zuständig sein, während die letzten vier (4 bis 7) exklusiv für bestimmte Prozesse zur Verfügung stehen sollen. Im Bootloader des Systems ist diese Information mit dem Kernel-Argument isolcpus zu übergeben.

Sie müssen darauf achten, dass der Dienst irqbalance deaktiviert ist, da ansonsten eine gleichmäßige Verteilung der Interrupts über alle CPUs stattfindet und genau dies ist hier ja nicht gewünscht:

service irqbalance stop
chkconfig --level 12345 irqbalance off

Über die Datei erhalten Sie eine Statistik der Interrupts und auch, auf welchen CPUs diese bisher ausgeführt wurden. Um nun beispielsweise die IRQs 1 bis 23 an die CPUs 0 bis 3 zu binden, definieren Sie eine CPU-Affinität für diese Kombination aus IRQs und CPUs. Hierfür erzeugen Sie zuerst eine dezimale CPU-Maske. Im Beispiel beträgt diese 15 und setzt sich aus den Wertigkeiten der CPUs 0 bis 3 zusammen (1+2+4+8=15). Die CPU-Maske ist dann in die Datei der jeweiligen IRQs zu schreiben:

for i in $(seq 1 23); do echo 15 > /proc/irq/${i}/smp_affinity
done

Da diese Änderung nicht persistent ist, bietet es sich an, die CPU-Affinität der einzelnen IRQs in der Datei zu definieren. Die Datei kann hierfür wieder nicht zum Einsatz kommen, da diese lediglich Werte für Dateien aus dem Verzeichnis "/proc/sys" aufnehmen kann.

Um nun die gewünschten Prozesse exklusiv auf den Prozessoren 4 bis 7 auszuführen, rufen Sie diese einfach über das Tool taskset auf:

taskset -c 4-7 /bin/foo/

Bestehende Prozesse lassen sich ebenfalls an ein Subset der CPUs binden. Das Tool taskset bietet hierfür die Option "-p" an, mit der sich ein Prozess bestimmen lässt:

taskset -p -c 4-7 12345

Schauen Sie nun nach einer Zeit erneut in die Datei , so stellen Sie fest, dass die Anzahl der IRQs auf den CPUs 4 bis 7 nicht gestiegen ist, da diese nun exklusiv auf den Prozessoren 0 bis 3 durchgeführt werden.

Speicherverbrauch mit ps ermittelt

ps up 6392

USER

PID

%CPU

%MEM

VSZ

RSS

TTY

STAT

START

TIME

COMMAND

root

6392

0.0

0.0

52528

792

?

Ss

10:03

0:00

/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023