
Überprüfen Sie den NIC-Ringpuffer:
# ethtool -g eth0
Ring parameters for eth0:
Pre-set maximums:
RX: 4096
RX Mini: 0
RX Jumbo: 0
TX: 4096
Current hardware settings:
RX: 256
RX Mini: 0
RX Jumbo: 0
TX: 256
Man kann „RX/TX“ bis zu dem in den „Voreingestellten Maximalwerten“ angezeigten Grenzwert einstellen, wie:
# ethtool -G eth0 rx 4096 rx 4096
Die Frage ist: standardmäßig;,Warum sind diese so niedrig eingestellt(auf jedem meiner Server sind sie alle auf 256) statt auf einen höheren Wert oder auf die maximalen Hardwarekapazitäten? Gibt es irgendwelche Nachteile (wenn ja, welche?), wenn man diese Werte erhöht?
Antwort1
Erstens sind die von Ihnen festgelegten Zahlen nicht inByteswie viele Leute denken, sie sind inDeskriptoren(und die Deskriptorgröße ist hardwareabhängig). Wenn Sie also die Ringlänge erhöhen, fordern Sie, dass im Kernel mehr Speicher für diese Deskriptoren zugewiesen wird. Im Allgemeinen möchten Sie diesen Kernelspeicher im L1-Cache haben, damit die Interrupt-Verarbeitung so schnell wie möglich erfolgt. Eine Erhöhung der Ringgröße macht dies weniger wahrscheinlich und in manchen Fällen sogar völlig unmöglich.
Als nächstes kommt die Interrupt-Koaleszenz - im Allgemeinen passt die Netzwerkkarte ihre Low/High-Markierungen entsprechend an, wenn Sie die Ringpuffergröße erhöhen, und löst einen Interrupt aus, wenn mehr Daten gepuffert werden (das ist seltener). Die vom Kernel benötigte Zeit, um diese größeren Datenmengen während der Interrupt-Verarbeitung zu verarbeiten, würde sich dadurch ebenfalls erhöhen.
All dies führt zu einem einfachen Bucket-Effekt: Bei einem größeren Ring sinkt die Wahrscheinlichkeit von Paketverlusten und die Netzwerklatenz steigt. Dies kann vollkommen in Ordnung sein, wenn Sie große Dateien über TCP streamen, kann aber völlig unerwünscht sein, wenn Sie eine Anwendung mit geringer Latenz und kleinen Paketen verwenden (z. B. Spiele und dergleichen).
Die angezeigten Standardzahlen stellen einen angemessenen Kompromiss zwischen beiden dar.